Skip to content

Commit 8bd6a72

Browse files
Minor: Fix Markdown errors
1 parent 60f293d commit 8bd6a72

File tree

1 file changed

+45
-63
lines changed

1 file changed

+45
-63
lines changed

product-solution.md

Lines changed: 45 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -35,28 +35,24 @@ entre as features. Visto que há um total de 93 colunas que não foi
3535
disponibilizada nenhuma informação sobre o que são elas e o que representam e
3636
portanto, esta análize ajudará a identificar as relações entre as features.
3737

38-
##
39-
Correlação
38+
## Correlação
4039

4140
A correlação entre duas variáveis é quando existe algum laço
4241
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).
4543
Uma das maneiras mais simples de se identificar a correlação entre duas
4644
variáveis é plotando-as em um gráfico, para tentar identificar alguma relação
4745
entre elas, entretanto, como são um total de 93 features, dificulta visualizar a
4846
correlação em forma gráfica.
4947

5048
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)
5350
mede o grau da correlação (e a direcção dessa correlação - se
5451
positiva ou
5552
negativa) entre duas variáveis de escala métrica (intervalar ou de
5653
rácio/razão).
5754
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)
6056
entre duas variáveis é igual à correlação de Pearson entre
6157
os valores de postos
6258
daquelas duas variáveis. Enquanto a correlação de Pearson
@@ -86,8 +82,7 @@ correlation
8682
A partir da matriz de correlação assima, buscamos agora
8783
identificar quais das colunas possuem uma forte correlação de acordo com a
8884
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/)
9186
<center>Interpretação do resultado de correlação </center>
9287

9388
|Valor
@@ -147,7 +142,7 @@ averiguar a performance do modelo.
147142
from sklearn.model_selection import train_test_split
148143
from sklearn.model_selection import cross_val_score
149144
from sklearn.metrics import confusion_matrix
150-
from sklearn.preprocessing import StandardScaler
145+
from sklearn.preprocessing import StandardScaler
151146

152147
X = df_train
153148
y = df_target.categories
@@ -187,8 +182,7 @@ amostras. Basicamente elabora-se uma matriz em que nas colunas e linhas são as
187182
possíveis classes. Cada célula traz a contagem de amostras que eram da Label X
188183
(coluna) e foram classificadas na Label Y (linha). Dessa forma, na matriz, a
189184
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
192186
seguir:
193187

194188
|Classificador\Real|Label 1|Label 2|Label 3|
@@ -198,9 +192,7 @@ seguir:
198192
|**Label 3**|0|0|3|
199193

200194
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
204196
problema
205197

206198
```python
@@ -223,7 +215,7 @@ def plot_confusion_matrix(cm, classes,
223215
print("Normalized confusion matrix")
224216
else:
225217
print('Confusion matrix, without normalization')
226-
218+
227219
plt.figure(figsize=(11, 7))
228220
plt.imshow(cm, interpolation='nearest', cmap=cmap)
229221
plt.title(title)
@@ -235,7 +227,7 @@ def plot_confusion_matrix(cm, classes,
235227
plt.text(j, i, format(cm[i, j], fmt),
236228
horizontalalignment="center",
237229
color="white" if cm[i, j] > thresh else "black")
238-
230+
239231
plt.tight_layout()
240232
plt.ylabel('True label')
241233
plt.xlabel('Predicted label')
@@ -253,9 +245,8 @@ comparação
253245
com outros modelos.
254246

255247
* **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
259250

260251
```python
261252
from sklearn.dummy import DummyClassifier
@@ -269,7 +260,7 @@ def dummies(X_train, y_train, X_test, y_test):
269260
score = clf.score(X_train, y_train)
270261
y_pred = clf.predict(X_test)
271262
cm = confusion_matrix(y_test, y_pred)
272-
263+
273264
plot_confusion_matrix(cm, classes=model)
274265

275266
# Cross validation
@@ -317,20 +308,20 @@ def xgboost(X_train, y_train, X_test, y_test):
317308
nthread=8,
318309
scale_pos_weight=1
319310
)
320-
311+
321312
xgbclf.fit(X_train, y_train)
322313
train_score = xgbclf.score(X_train, y_train)
323314
y_pred = xgbclf.predict(X_test)
324315

325316
cm = confusion_matrix(y_test, y_pred)
326-
317+
327318
plot_confusion_matrix(cm, classes=xgbclf)
328319

329320
accuracies = cross_val_score(estimator=xgbclf, X=X_train, y=y_train, cv=10)
330321
print('Resultado na base de treino %.2f' % train_score)
331322
print('Resultado Médio na base de teste: %.2f' % accuracies.mean())
332323
print('Desvio padrão: %.4f' % accuracies.std())
333-
324+
334325
xgboost(X_train, y_train, X_test, y_test)
335326
```
336327

@@ -352,15 +343,15 @@ xgb_params = [{
352343
}]
353344

354345
xgb_add_params = [{
355-
'learning_rate': 0.1,
356-
'n_estimators': 140,
346+
'learning_rate': 0.1,
347+
'n_estimators': 140,
357348
'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,
361352
'colsample_bytree': 0.8,
362-
'objective': 'binary:logistic',
363-
'nthread': 8,
353+
'objective': 'binary:logistic',
354+
'nthread': 8,
364355
'scale_pos_weight': 1,
365356
'seed': 27
366357
}]
@@ -377,7 +368,7 @@ def search_params(classifier, params):
377368
param_grid=params,
378369
cv = 10,
379370
n_jobs=-1)
380-
371+
381372
grid_search = grid_search.fit(X_train, y_train)
382373
print(grid_search.best_score_, grid_search.best_params_)
383374
return grid_search.best_score_
@@ -409,10 +400,10 @@ from sklearn.model_selection import cross_val_score
409400
def fit_tree(X, Y):
410401
tree_classifier = DecisionTreeClassifier(max_features=70, min_samples_leaf=10, max_depth=40)
411402
tree_classifier.fit(X, Y)
412-
403+
413404
inner_score = tree_classifier.score(X, Y)
414405
tree_fit = cross_val_score(tree_classifier, X, Y)
415-
406+
416407
return inner_score, tree_fit.mean(), tree_fit.std()
417408

418409
"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
425416
de viés quando uma das classes na base de treino é mais predominante do que
426417
outra, ou seja, a distribuição das classes na base de treino devem ser
427418
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).
430420

431421
Para tanto, precisa-se descobrir qual a
432422
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
487477
com mais votos ganha e o resultado é
488478
dado.
489479

490-
![Workflow Random
491-
forest](forest.jpg)
480+
![Workflow Randomforest](forest.jpg)
492481

493482
De acordo com breiman, 2001, as RFs corrigem a maior parte
494483
dos problemas de
@@ -501,8 +490,7 @@ Referências:
501490
[BREIMAN](https://www.stat.berkeley.edu/users/breiman/randomforest2001.pdf),
502491
Leo. Random forests. Machine learning, v. 45, n. 1, p. 5-32, 2001.
503492

504-
##
505-
Utilizando o algoritmo
493+
## Utilizando o algoritmo
506494

507495
```python
508496
from sklearn.ensemble import RandomForestClassifier
@@ -527,18 +515,14 @@ maior é a importância da feature.
527515
O método utilizado para gerar a
528516
importância das features no modelo é a Decrease Mean Importance, que utiliza em
529517
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),
532519
este indicador é o Gini Impurity que pode ser entendido como uma redução da
533520
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).
536522

537523
#### O indice
538524
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):
542526

543527
\begin{equation}
544528
Gini = 1- \sum_{i=1} p_i^2
@@ -559,21 +543,23 @@ Regression Trees (CART), utiliza-se o indice de Gini modificado, isto é,
559543
calcula-se ainda as probabilidades em $p_i$, mas agora utiliza-se do indice de
560544
Gini nos filhos da esquerda $t_l$ e direita $t_r$. Recalcula-se as
561545
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).
564547
\begin{equation}
565548
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}
567551
\end{equation}
568552

569553
#### Decrease Mean Importance
570554

571555
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
575562
conta é:
576-
577563
\begin{equation}
578564
I(X_m) = \frac{1}{N_T} \sum_{T} \sum_{t \epsilon
579565
T:v(s)=X_m} pf(t)i(s,t) \\
@@ -615,11 +601,9 @@ print ("{} de precisão".format(rfscores.mean() * 100))
615601

616602
## ExtraTrees
617603

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)
620605
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)
623607

624608
```python
625609
from sklearn.ensemble import ExtraTreesClassifier
@@ -651,7 +635,5 @@ Estimativa: 10 min com I7 3.1 8Ram
651635
```
652636

653637
# 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

Comments
 (0)