@@ -88,28 +88,24 @@ entre as features. Visto que há um total de 93 colunas que não foi
88
88
disponibilizada nenhuma informação sobre o que são elas e o que representam e
89
89
portanto, esta análize ajudará a identificar as relações entre as features.
90
90
91
- ##
92
- Correlação
91
+ ## Correlação
93
92
94
93
A correlação entre duas variáveis é quando existe algum laço
95
94
matemático que envolve o valor de duas variáveis de alguma forma [ ESTATÍSTICA II
96
- - CORRELAÇÃO E
97
- REGRESSÃO] ( http://www.ctec.ufal.br/professor/mgn/05CorrelacaoERegressao.pdf ) .
95
+ - [ CORRELAÇÃO E REGRESSÃO] ( http://www.ctec.ufal.br/professor/mgn/05CorrelacaoERegressao.pdf ) .
98
96
Uma das maneiras mais simples de se identificar a correlação entre duas
99
97
variáveis é plotando-as em um gráfico, para tentar identificar alguma relação
100
98
entre elas, entretanto, como são um total de 93 features, dificulta visualizar a
101
99
correlação em forma gráfica.
102
100
103
101
A correlação de
104
- [ Pearson] (https://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de%0
105
- A_Pearson)
102
+ [ Pearson] ( https://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de%0A_Pearson )
106
103
mede o grau da correlação (e a direcção dessa correlação - se
107
104
positiva ou
108
105
negativa) entre duas variáveis de escala métrica (intervalar ou de
109
106
rácio/razão).
110
107
Já a correlação de
111
- [ Spearman] (https://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de _
112
- postos_de_Spearman)
108
+ [ Spearman] ( https://pt.wikipedia.org/wiki/Coeficiente_de_correla%C3%A7%C3%A3o_de_postos_de_Spearman )
113
109
entre duas variáveis é igual à correlação de Pearson entre
114
110
os valores de postos
115
111
daquelas duas variáveis. Enquanto a correlação de Pearson
@@ -139,8 +135,7 @@ correlation
139
135
A partir da matriz de correlação assima, buscamos agora
140
136
identificar quais das colunas possuem uma forte correlação de acordo com a
141
137
tabela a seguir.
142
- Como sugerido por [ Makuka,
143
- 2012] ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3576830/ )
138
+ Como sugerido por [ Makuka,2012] ( https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3576830/ )
144
139
<center >Interpretação do resultado de correlação </center >
145
140
146
141
|Valor
@@ -200,7 +195,7 @@ averiguar a performance do modelo.
200
195
from sklearn.model_selection import train_test_split
201
196
from sklearn.model_selection import cross_val_score
202
197
from sklearn.metrics import confusion_matrix
203
- from sklearn.preprocessing import StandardScaler
198
+ from sklearn.preprocessing import StandardScaler
204
199
205
200
X = df_train
206
201
y = df_target.categories
@@ -240,8 +235,7 @@ amostras. Basicamente elabora-se uma matriz em que nas colunas e linhas são as
240
235
possíveis classes. Cada célula traz a contagem de amostras que eram da Label X
241
236
(coluna) e foram classificadas na Label Y (linha). Dessa forma, na matriz, a
242
237
diagonal principal trará os acertos do classificador
243
- [ Microsoft] (https://docs.microsoft.com/pt-br/sql/analysis-services/data-
244
- mining/classification-matrix-analysis-services-data-mining). Veja o exemplo a
238
+ [ Microsoft] ( https://docs.microsoft.com/pt-br/sql/analysis-services/data-mining/classification-matrix-analysis-services-data-mining ) . Veja o exemplo a
245
239
seguir:
246
240
247
241
| Classificador\Real| Label 1| Label 2| Label 3|
@@ -251,9 +245,7 @@ seguir:
251
245
| ** Label 3** | 0| 0| 3|
252
246
253
247
Plot para matriz de confusão encontrado em
254
- [ Scikit] (http://scikit-
255
- learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-
256
- glr-auto-examples-model-selection-plot-confusion-matrix-py) e adaptado para o
248
+ [ 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
257
249
problema
258
250
259
251
``` python
@@ -276,7 +268,7 @@ def plot_confusion_matrix(cm, classes,
276
268
print (" Normalized confusion matrix" )
277
269
else :
278
270
print (' Confusion matrix, without normalization' )
279
-
271
+
280
272
plt.figure(figsize = (11 , 7 ))
281
273
plt.imshow(cm, interpolation = ' nearest' , cmap = cmap)
282
274
plt.title(title)
@@ -288,7 +280,7 @@ def plot_confusion_matrix(cm, classes,
288
280
plt.text(j, i, format (cm[i, j], fmt),
289
281
horizontalalignment = " center" ,
290
282
color = " white" if cm[i, j] > thresh else " black" )
291
-
283
+
292
284
plt.tight_layout()
293
285
plt.ylabel(' True label' )
294
286
plt.xlabel(' Predicted label' )
@@ -306,9 +298,8 @@ comparação
306
298
com outros modelos.
307
299
308
300
* ** Stratified** : realiza predições baseadas na
309
- distribuição das classes da base de treino. (Ex.: 10% A, 20% B, 50% C, 20% D)
310
- *
311
- ** Most Frequent** : sempre prediz com a classe mais frequente na base de treino
301
+ distribuição das classes da base de treino. (Ex.: 10% A, 20% B, 50% C, 20% D)
302
+ * ** Most Frequent** : sempre prediz com a classe mais frequente na base de treino
312
303
313
304
``` python
314
305
from sklearn.dummy import DummyClassifier
@@ -322,7 +313,7 @@ def dummies(X_train, y_train, X_test, y_test):
322
313
score = clf.score(X_train, y_train)
323
314
y_pred = clf.predict(X_test)
324
315
cm = confusion_matrix(y_test, y_pred)
325
-
316
+
326
317
plot_confusion_matrix(cm, classes = model)
327
318
328
319
# Cross validation
@@ -370,20 +361,20 @@ def xgboost(X_train, y_train, X_test, y_test):
370
361
nthread = 8 ,
371
362
scale_pos_weight = 1
372
363
)
373
-
364
+
374
365
xgbclf.fit(X_train, y_train)
375
366
train_score = xgbclf.score(X_train, y_train)
376
367
y_pred = xgbclf.predict(X_test)
377
368
378
369
cm = confusion_matrix(y_test, y_pred)
379
-
370
+
380
371
plot_confusion_matrix(cm, classes = xgbclf)
381
372
382
373
accuracies = cross_val_score(estimator = xgbclf, X = X_train, y = y_train, cv = 10 )
383
374
print (' Resultado na base de treino %.2f ' % train_score)
384
375
print (' Resultado Médio na base de teste: %.2f ' % accuracies.mean())
385
376
print (' Desvio padrão: %.4f ' % accuracies.std())
386
-
377
+
387
378
xgboost(X_train, y_train, X_test, y_test)
388
379
```
389
380
@@ -405,15 +396,15 @@ xgb_params = [{
405
396
}]
406
397
407
398
xgb_add_params = [{
408
- ' learning_rate' : 0.1 ,
409
- ' n_estimators' : 140 ,
399
+ ' learning_rate' : 0.1 ,
400
+ ' n_estimators' : 140 ,
410
401
' max_depth' : 5 ,
411
- ' min_child_weight' : 2 ,
412
- ' gamma' : 0 ,
413
- ' subsample' : 0.8 ,
402
+ ' min_child_weight' : 2 ,
403
+ ' gamma' : 0 ,
404
+ ' subsample' : 0.8 ,
414
405
' colsample_bytree' : 0.8 ,
415
- ' objective' : ' binary:logistic' ,
416
- ' nthread' : 8 ,
406
+ ' objective' : ' binary:logistic' ,
407
+ ' nthread' : 8 ,
417
408
' scale_pos_weight' : 1 ,
418
409
' seed' : 27
419
410
}]
@@ -430,7 +421,7 @@ def search_params(classifier, params):
430
421
param_grid = params,
431
422
cv = 10 ,
432
423
n_jobs = - 1 )
433
-
424
+
434
425
grid_search = grid_search.fit(X_train, y_train)
435
426
print (grid_search.best_score_, grid_search.best_params_)
436
427
return grid_search.best_score_
@@ -462,10 +453,10 @@ from sklearn.model_selection import cross_val_score
462
453
def fit_tree (X , Y ):
463
454
tree_classifier = DecisionTreeClassifier(max_features = 70 , min_samples_leaf = 10 , max_depth = 40 )
464
455
tree_classifier.fit(X, Y)
465
-
456
+
466
457
inner_score = tree_classifier.score(X, Y)
467
458
tree_fit = cross_val_score(tree_classifier, X, Y)
468
-
459
+
469
460
return inner_score, tree_fit.mean(), tree_fit.std()
470
461
471
462
" inner: {:.2f} cross: {:.2f} +/- {:.2f}" .format(* fit_tree(X_train, y_train))
@@ -478,8 +469,7 @@ no método de montagem random forest. Este modelo de predição possui um proble
478
469
de viés quando uma das classes na base de treino é mais predominante do que
479
470
outra, ou seja, a distribuição das classes na base de treino devem ser
480
471
semelhantes para evitar problemas de
481
- [ overfiting] (http://docs.aws.amazon.com/machine-learning/latest/dg/model-fit-
482
- underfitting-vs-overfitting.html).
472
+ [ overfiting] ( http://docs.aws.amazon.com/machine-learning/latest/dg/model-fit-underfitting-vs-overfitting.html ) .
483
473
484
474
Para tanto, precisa-se descobrir qual a
485
475
contagem de cada classe disponível na base de treino, montaremos um histograma
@@ -540,8 +530,7 @@ votação por maioria, ou seja, a categoria
540
530
com mais votos ganha e o resultado é
541
531
dado.
542
532
543
- ![ Workflow Random
544
- forest] ( forest.jpg )
533
+ ![ Workflow Randomforest] ( forest.jpg )
545
534
546
535
De acordo com breiman, 2001, as RFs corrigem a maior parte
547
536
dos problemas de
@@ -554,8 +543,7 @@ Referências:
554
543
[ BREIMAN] ( https://www.stat.berkeley.edu/users/breiman/randomforest2001.pdf ) ,
555
544
Leo. Random forests. Machine learning, v. 45, n. 1, p. 5-32, 2001.
556
545
557
- ##
558
- Utilizando o algoritmo
546
+ ## Utilizando o algoritmo
559
547
560
548
``` python
561
549
from sklearn.ensemble import RandomForestClassifier
@@ -580,18 +568,14 @@ maior é a importância da feature.
580
568
O método utilizado para gerar a
581
569
importância das features no modelo é a Decrease Mean Importance, que utiliza em
582
570
seus cálculos um indicador de impureza no sistema. No caso do random forest
583
- implementado [ (LOUPPE et al.,
584
- 2013)] ( https://pdfs.semanticscholar.org/2635/19c5a43fbf981da5ba873062219c50fdf56d.pdf ) ,
571
+ implementado [ (LOUPPE et al.,2013)] ( https://pdfs.semanticscholar.org/2635/19c5a43fbf981da5ba873062219c50fdf56d.pdf ) ,
585
572
este indicador é o Gini Impurity que pode ser entendido como uma redução da
586
573
probabilidade de errar a classificação de uma categoria dentro de um algorítmo
587
- de árvore [ (Sebastian Raschaka)] (https://sebastianraschka.com/faq/docs/decision-
588
- tree-binary.html).
574
+ de árvore [ (Sebastian Raschaka)] ( https://sebastianraschka.com/faq/docs/decision-tree-binary.html ) .
589
575
590
576
#### O indice
591
577
O indice de Gini pode ser calculado utilizando
592
- a seguinte fórmula[ (TEKIMONO,
593
- 2009)] (http://people.revoledu.com/kardi/tutorial/DecisionTree/how-to-measure-
594
- impurity.htm):
578
+ a seguinte fórmula[ (TEKIMONO,2009)] ( http://people.revoledu.com/kardi/tutorial/DecisionTree/how-to-measure-impurity.htm ) :
595
579
596
580
\begin{equation}
597
581
Gini = 1- \sum_ {i=1} p_i^2
@@ -612,21 +596,23 @@ Regression Trees (CART), utiliza-se o indice de Gini modificado, isto é,
612
596
calcula-se ainda as probabilidades em $p_i$, mas agora utiliza-se do indice de
613
597
Gini nos filhos da esquerda $t_l$ e direita $t_r$. Recalcula-se as
614
598
probabilidades para ambos os nós também em $p_l$ e $p_r$ utilizando como base as
615
- possíveis classes reduzidas a $N_t$ [ (LOUPPE et al.,
616
- 2013)] ( https://pdfs.semanticscholar.org/2635/19c5a43fbf981da5ba873062219c50fdf56d.pdf ) .
599
+ possíveis classes reduzidas a $N_t$ [ (LOUPPE et al.,2013)] ( https://pdfs.semanticscholar.org/2635/19c5a43fbf981da5ba873062219c50fdf56d.pdf ) .
617
600
\begin{equation}
618
601
i(s, t) = Gini(t) - p_l Gini(t_l) - p_r Gini(t_r) \\
619
- p(t) = \frac{N_ {l|r}}{N_t}
602
+ p(t) =
603
+ \frac{N_ {l|r}}{N_t}
620
604
\end{equation}
621
605
622
606
#### Decrease Mean Importance
623
607
624
608
Para
625
- calcular a importância de uma feature X ao tentar predizer uma label Y, utiliza-
626
- se os indices de impureza com a proporção de $N_f$ amostras em relação ao total
627
- $N$. $N_T$ é o total de árvores na floresta. Assim, para uma Random Forest a
609
+ calcular
610
+ a importância de uma feature X ao tentar predizer uma label Y, utiliza-
611
+ se os
612
+ indices de impureza com a proporção de $N_f$ amostras em relação ao total
613
+ $N$.
614
+ $N_T$ é o total de árvores na floresta. Assim, para uma Random Forest a
628
615
conta é:
629
-
630
616
\begin{equation}
631
617
I(X_m) = \frac{1}{N_T} \sum_ {T} \sum_ {t \epsilon
632
618
T: v (s)=X_m} pf(t)i(s,t) \\
@@ -668,8 +654,7 @@ print ("{} de precisão".format(rfscores.mean() * 100))
668
654
669
655
## ExtraTrees
670
656
671
- O [ Scikit Learn] (http://scikit-
672
- learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html)
657
+ O [ Scikit Learn] ( http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.ExtraTreesClassifier.html )
673
658
nos apresenta um tipo diferente de random forest que pode apresentar resultados
674
659
melhores que o [ RandomForestClassifier] (http://scikit-
675
660
learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html).
@@ -716,10 +701,11 @@ Estimativa: 10 min com I7 3.1 8Ram
716
701
# Referências Bibliográficas
717
702
http://scikit-
718
703
learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html#sklearn.dummy.DummyClassifier
704
+
719
705
https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-
720
706
xgboost-with-codes-python/
721
707
722
-
708
+
723
709
BABATUNDE, Oluleye, ARMSTRONG, Leisa, DIEPEVEEN,
724
710
Dean e LENG, J. Comparative analysis of Genetic Algorithm and Particle Swam
725
711
Optimization: An application in precision agriculture. 2015. ** Asian Journal of
0 commit comments