@@ -35,28 +35,24 @@ entre as features. Visto que há um total de 93 colunas que não foi
35
35
disponibilizada nenhuma informação sobre o que são elas e o que representam e
36
36
portanto, esta análize ajudará a identificar as relações entre as features.
37
37
38
- ##
39
- Correlação
38
+ ## Correlação
40
39
41
40
A correlação entre duas variáveis é quando existe algum laço
42
41
matemático que envolve o valor de duas variáveis de alguma forma [ ESTATÍSTICA II
43
- - CORRELAÇÃO E
44
- REGRESSÃO] ( http://www.ctec.ufal.br/professor/mgn/05CorrelacaoERegressao.pdf ) .
42
+ - [ CORRELAÇÃO E REGRESSÃO] ( http://www.ctec.ufal.br/professor/mgn/05CorrelacaoERegressao.pdf ) .
45
43
Uma das maneiras mais simples de se identificar a correlação entre duas
46
44
variáveis é plotando-as em um gráfico, para tentar identificar alguma relação
47
45
entre elas, entretanto, como são um total de 93 features, dificulta visualizar a
48
46
correlação em forma gráfica.
49
47
50
48
A correlação de
51
- [ Pearson] (https://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de%0
52
- A_Pearson)
49
+ [ Pearson] ( https://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de%0A_Pearson )
53
50
mede o grau da correlação (e a direcção dessa correlação - se
54
51
positiva ou
55
52
negativa) entre duas variáveis de escala métrica (intervalar ou de
56
53
rácio/razão).
57
54
Já a correlação de
58
- [ Spearman] (https://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de _
59
- postos_de_Spearman)
55
+ [ Spearman] ( https://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de_postos_de_Spearman )
60
56
entre duas variáveis é igual à correlação de Pearson entre
61
57
os valores de postos
62
58
daquelas duas variáveis. Enquanto a correlação de Pearson
@@ -86,8 +82,7 @@ correlation
86
82
A partir da matriz de correlação assima, buscamos agora
87
83
identificar quais das colunas possuem uma forte correlação de acordo com a
88
84
tabela a seguir.
89
- Como sugerido por [ Makuka,
90
- 2012] ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3576830/ )
85
+ Como sugerido por [ Makuka,2012] ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3576830/ )
91
86
<center >Interpretação do resultado de correlação </center >
92
87
93
88
|Valor
@@ -147,7 +142,7 @@ averiguar a performance do modelo.
147
142
from sklearn.model_selection import train_test_split
148
143
from sklearn.model_selection import cross_val_score
149
144
from sklearn.metrics import confusion_matrix
150
- from sklearn.preprocessing import StandardScaler
145
+ from sklearn.preprocessing import StandardScaler
151
146
152
147
X = df_train
153
148
y = df_target.categories
@@ -187,8 +182,7 @@ amostras. Basicamente elabora-se uma matriz em que nas colunas e linhas são as
187
182
possíveis classes. Cada célula traz a contagem de amostras que eram da Label X
188
183
(coluna) e foram classificadas na Label Y (linha). Dessa forma, na matriz, a
189
184
diagonal principal trará os acertos do classificador
190
- [ Microsoft] (https://docs.microsoft.com/pt-br/sql/analysis-services/data-
191
- mining/classification-matrix-analysis-services-data-mining). Veja o exemplo a
185
+ [ Microsoft] ( https://docs.microsoft.com/pt-br/sql/analysis-services/data-mining/classification-matrix-analysis-services-data-mining ) . Veja o exemplo a
192
186
seguir:
193
187
194
188
| Classificador\Real| Label 1| Label 2| Label 3|
@@ -198,9 +192,7 @@ seguir:
198
192
| ** Label 3** | 0| 0| 3|
199
193
200
194
Plot para matriz de confusão encontrado em
201
- [ Scikit] (http://scikit-
202
- learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-
203
- glr-auto-examples-model-selection-plot-confusion-matrix-py) e adaptado para o
195
+ [ Scikit] ( http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-glr-auto-examples-model-selection-plot-confusion-matrix-py ) e adaptado para o
204
196
problema
205
197
206
198
``` python
@@ -223,7 +215,7 @@ def plot_confusion_matrix(cm, classes,
223
215
print (" Normalized confusion matrix" )
224
216
else :
225
217
print (' Confusion matrix, without normalization' )
226
-
218
+
227
219
plt.figure(figsize = (11 , 7 ))
228
220
plt.imshow(cm, interpolation = ' nearest' , cmap = cmap)
229
221
plt.title(title)
@@ -235,7 +227,7 @@ def plot_confusion_matrix(cm, classes,
235
227
plt.text(j, i, format (cm[i, j], fmt),
236
228
horizontalalignment = " center" ,
237
229
color = " white" if cm[i, j] > thresh else " black" )
238
-
230
+
239
231
plt.tight_layout()
240
232
plt.ylabel(' True label' )
241
233
plt.xlabel(' Predicted label' )
@@ -253,9 +245,8 @@ comparação
253
245
com outros modelos.
254
246
255
247
* ** Stratified** : realiza predições baseadas na
256
- distribuição das classes da base de treino. (Ex.: 10% A, 20% B, 50% C, 20% D)
257
- *
258
- ** Most Frequent** : sempre prediz com a classe mais frequente na base de treino
248
+ distribuição das classes da base de treino. (Ex.: 10% A, 20% B, 50% C, 20% D)
249
+ * ** Most Frequent** : sempre prediz com a classe mais frequente na base de treino
259
250
260
251
``` python
261
252
from sklearn.dummy import DummyClassifier
@@ -269,7 +260,7 @@ def dummies(X_train, y_train, X_test, y_test):
269
260
score = clf.score(X_train, y_train)
270
261
y_pred = clf.predict(X_test)
271
262
cm = confusion_matrix(y_test, y_pred)
272
-
263
+
273
264
plot_confusion_matrix(cm, classes = model)
274
265
275
266
# Cross validation
@@ -317,20 +308,20 @@ def xgboost(X_train, y_train, X_test, y_test):
317
308
nthread = 8 ,
318
309
scale_pos_weight = 1
319
310
)
320
-
311
+
321
312
xgbclf.fit(X_train, y_train)
322
313
train_score = xgbclf.score(X_train, y_train)
323
314
y_pred = xgbclf.predict(X_test)
324
315
325
316
cm = confusion_matrix(y_test, y_pred)
326
-
317
+
327
318
plot_confusion_matrix(cm, classes = xgbclf)
328
319
329
320
accuracies = cross_val_score(estimator = xgbclf, X = X_train, y = y_train, cv = 10 )
330
321
print (' Resultado na base de treino %.2f ' % train_score)
331
322
print (' Resultado Médio na base de teste: %.2f ' % accuracies.mean())
332
323
print (' Desvio padrão: %.4f ' % accuracies.std())
333
-
324
+
334
325
xgboost(X_train, y_train, X_test, y_test)
335
326
```
336
327
@@ -352,15 +343,15 @@ xgb_params = [{
352
343
}]
353
344
354
345
xgb_add_params = [{
355
- ' learning_rate' : 0.1 ,
356
- ' n_estimators' : 140 ,
346
+ ' learning_rate' : 0.1 ,
347
+ ' n_estimators' : 140 ,
357
348
' max_depth' : 5 ,
358
- ' min_child_weight' : 2 ,
359
- ' gamma' : 0 ,
360
- ' subsample' : 0.8 ,
349
+ ' min_child_weight' : 2 ,
350
+ ' gamma' : 0 ,
351
+ ' subsample' : 0.8 ,
361
352
' colsample_bytree' : 0.8 ,
362
- ' objective' : ' binary:logistic' ,
363
- ' nthread' : 8 ,
353
+ ' objective' : ' binary:logistic' ,
354
+ ' nthread' : 8 ,
364
355
' scale_pos_weight' : 1 ,
365
356
' seed' : 27
366
357
}]
@@ -377,7 +368,7 @@ def search_params(classifier, params):
377
368
param_grid = params,
378
369
cv = 10 ,
379
370
n_jobs = - 1 )
380
-
371
+
381
372
grid_search = grid_search.fit(X_train, y_train)
382
373
print (grid_search.best_score_, grid_search.best_params_)
383
374
return grid_search.best_score_
@@ -409,10 +400,10 @@ from sklearn.model_selection import cross_val_score
409
400
def fit_tree (X , Y ):
410
401
tree_classifier = DecisionTreeClassifier(max_features = 70 , min_samples_leaf = 10 , max_depth = 40 )
411
402
tree_classifier.fit(X, Y)
412
-
403
+
413
404
inner_score = tree_classifier.score(X, Y)
414
405
tree_fit = cross_val_score(tree_classifier, X, Y)
415
-
406
+
416
407
return inner_score, tree_fit.mean(), tree_fit.std()
417
408
418
409
" inner: {:.2f} cross: {:.2f} +/- {:.2f}" .format(* fit_tree(X_train, y_train))
@@ -425,8 +416,7 @@ no método de montagem random forest. Este modelo de predição possui um proble
425
416
de viés quando uma das classes na base de treino é mais predominante do que
426
417
outra, ou seja, a distribuição das classes na base de treino devem ser
427
418
semelhantes para evitar problemas de
428
- [ overfiting] (http://docs.aws.amazon.com/machine-learning/latest/dg/model-fit-
429
- underfitting-vs-overfitting.html).
419
+ [ overfiting] ( http://docs.aws.amazon.com/machine-learning/latest/dg/model-fit-underfitting-vs-overfitting.html ) .
430
420
431
421
Para tanto, precisa-se descobrir qual a
432
422
contagem de cada classe disponível na base de treino, montaremos um histograma
@@ -487,8 +477,7 @@ votação por maioria, ou seja, a categoria
487
477
com mais votos ganha e o resultado é
488
478
dado.
489
479
490
- ![ Workflow Random
491
- forest] ( forest.jpg )
480
+ ![ Workflow Randomforest] ( forest.jpg )
492
481
493
482
De acordo com breiman, 2001, as RFs corrigem a maior parte
494
483
dos problemas de
@@ -501,8 +490,7 @@ Referências:
501
490
[ BREIMAN] ( https://www.stat.berkeley.edu/users/breiman/randomforest2001.pdf ) ,
502
491
Leo. Random forests. Machine learning, v. 45, n. 1, p. 5-32, 2001.
503
492
504
- ##
505
- Utilizando o algoritmo
493
+ ## Utilizando o algoritmo
506
494
507
495
``` python
508
496
from sklearn.ensemble import RandomForestClassifier
@@ -527,18 +515,14 @@ maior é a importância da feature.
527
515
O método utilizado para gerar a
528
516
importância das features no modelo é a Decrease Mean Importance, que utiliza em
529
517
seus cálculos um indicador de impureza no sistema. No caso do random forest
530
- implementado [ (LOUPPE et al.,
531
- 2013)] ( https://pdfs.semanticscholar.org/2635/19c5a43fbf981da5ba873062219c50fdf56d.pdf ) ,
518
+ implementado [ (LOUPPE et al.,2013)] ( https://pdfs.semanticscholar.org/2635/19c5a43fbf981da5ba873062219c50fdf56d.pdf ) ,
532
519
este indicador é o Gini Impurity que pode ser entendido como uma redução da
533
520
probabilidade de errar a classificação de uma categoria dentro de um algorítmo
534
- de árvore [ (Sebastian Raschaka)] (https://sebastianraschka.com/faq/docs/decision-
535
- tree-binary.html).
521
+ de árvore [ (Sebastian Raschaka)] ( https://sebastianraschka.com/faq/docs/decision-tree-binary.html ) .
536
522
537
523
#### O indice
538
524
O indice de Gini pode ser calculado utilizando
539
- a seguinte fórmula[ (TEKIMONO,
540
- 2009)] (http://people.revoledu.com/kardi/tutorial/DecisionTree/how-to-measure-
541
- impurity.htm):
525
+ a seguinte fórmula[ (TEKIMONO,2009)] ( http://people.revoledu.com/kardi/tutorial/DecisionTree/how-to-measure-impurity.htm ) :
542
526
543
527
\begin{equation}
544
528
Gini = 1- \sum_ {i=1} p_i^2
@@ -559,21 +543,23 @@ Regression Trees (CART), utiliza-se o indice de Gini modificado, isto é,
559
543
calcula-se ainda as probabilidades em $p_i$, mas agora utiliza-se do indice de
560
544
Gini nos filhos da esquerda $t_l$ e direita $t_r$. Recalcula-se as
561
545
probabilidades para ambos os nós também em $p_l$ e $p_r$ utilizando como base as
562
- possíveis classes reduzidas a $N_t$ [ (LOUPPE et al.,
563
- 2013)] ( https://pdfs.semanticscholar.org/2635/19c5a43fbf981da5ba873062219c50fdf56d.pdf ) .
546
+ possíveis classes reduzidas a $N_t$ [ (LOUPPE et al.,2013)] ( https://pdfs.semanticscholar.org/2635/19c5a43fbf981da5ba873062219c50fdf56d.pdf ) .
564
547
\begin{equation}
565
548
i(s, t) = Gini(t) - p_l Gini(t_l) - p_r Gini(t_r) \\
566
- p(t) = \frac{N_ {l|r}}{N_t}
549
+ p(t) =
550
+ \frac{N_ {l|r}}{N_t}
567
551
\end{equation}
568
552
569
553
#### Decrease Mean Importance
570
554
571
555
Para
572
- calcular a importância de uma feature X ao tentar predizer uma label Y, utiliza-
573
- se os indices de impureza com a proporção de $N_f$ amostras em relação ao total
574
- $N$. $N_T$ é o total de árvores na floresta. Assim, para uma Random Forest a
556
+ calcular
557
+ a importância de uma feature X ao tentar predizer uma label Y, utiliza-
558
+ se os
559
+ indices de impureza com a proporção de $N_f$ amostras em relação ao total
560
+ $N$.
561
+ $N_T$ é o total de árvores na floresta. Assim, para uma Random Forest a
575
562
conta é:
576
-
577
563
\begin{equation}
578
564
I(X_m) = \frac{1}{N_T} \sum_ {T} \sum_ {t \epsilon
579
565
T: v (s)=X_m} pf(t)i(s,t) \\
@@ -615,11 +601,9 @@ print ("{} de precisão".format(rfscores.mean() * 100))
615
601
616
602
## ExtraTrees
617
603
618
- O [ Scikit Learn] (http://scikit-
619
- learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html)
604
+ O [ Scikit Learn] ( http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html )
620
605
nos apresenta um tipo diferente de random forest que pode apresentar resultados
621
- melhores que o [ RandomForestClassifier] (http://scikit-
622
- learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)
606
+ melhores que o [ RandomForestClassifier] ( http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html )
623
607
624
608
``` python
625
609
from sklearn.ensemble import ExtraTreesClassifier
@@ -651,7 +635,5 @@ Estimativa: 10 min com I7 3.1 8Ram
651
635
```
652
636
653
637
# Referências Bibliográficas
654
- http://scikit-
655
- learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html#sklearn.dummy.DummyClassifier
656
- https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-
657
- xgboost-with-codes-python/
638
+ http://scikit-learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html#sklearn.dummy.DummyClassifier
639
+ https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/
0 commit comments