Skip to content

Commit 418e299

Browse files
committed
Merge branch 'development' of github.com:Wall-eSociety/Product-Classification into development
2 parents cdda072 + 8bd6a72 commit 418e299

File tree

1 file changed

+44
-58
lines changed

1 file changed

+44
-58
lines changed

product-solution.md

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

91-
##
92-
Correlação
91+
## Correlação
9392

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

103101
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)
106103
mede o grau da correlação (e a direcção dessa correlação - se
107104
positiva ou
108105
negativa) entre duas variáveis de escala métrica (intervalar ou de
109106
rácio/razão).
110107
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)
113109
entre duas variáveis é igual à correlação de Pearson entre
114110
os valores de postos
115111
daquelas duas variáveis. Enquanto a correlação de Pearson
@@ -139,8 +135,7 @@ correlation
139135
A partir da matriz de correlação assima, buscamos agora
140136
identificar quais das colunas possuem uma forte correlação de acordo com a
141137
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/)
144139
<center>Interpretação do resultado de correlação </center>
145140

146141
|Valor
@@ -200,7 +195,7 @@ averiguar a performance do modelo.
200195
from sklearn.model_selection import train_test_split
201196
from sklearn.model_selection import cross_val_score
202197
from sklearn.metrics import confusion_matrix
203-
from sklearn.preprocessing import StandardScaler
198+
from sklearn.preprocessing import StandardScaler
204199

205200
X = df_train
206201
y = df_target.categories
@@ -240,8 +235,7 @@ amostras. Basicamente elabora-se uma matriz em que nas colunas e linhas são as
240235
possíveis classes. Cada célula traz a contagem de amostras que eram da Label X
241236
(coluna) e foram classificadas na Label Y (linha). Dessa forma, na matriz, a
242237
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
245239
seguir:
246240

247241
|Classificador\Real|Label 1|Label 2|Label 3|
@@ -251,9 +245,7 @@ seguir:
251245
|**Label 3**|0|0|3|
252246

253247
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
257249
problema
258250

259251
```python
@@ -276,7 +268,7 @@ def plot_confusion_matrix(cm, classes,
276268
print("Normalized confusion matrix")
277269
else:
278270
print('Confusion matrix, without normalization')
279-
271+
280272
plt.figure(figsize=(11, 7))
281273
plt.imshow(cm, interpolation='nearest', cmap=cmap)
282274
plt.title(title)
@@ -288,7 +280,7 @@ def plot_confusion_matrix(cm, classes,
288280
plt.text(j, i, format(cm[i, j], fmt),
289281
horizontalalignment="center",
290282
color="white" if cm[i, j] > thresh else "black")
291-
283+
292284
plt.tight_layout()
293285
plt.ylabel('True label')
294286
plt.xlabel('Predicted label')
@@ -306,9 +298,8 @@ comparação
306298
com outros modelos.
307299

308300
* **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
312303

313304
```python
314305
from sklearn.dummy import DummyClassifier
@@ -322,7 +313,7 @@ def dummies(X_train, y_train, X_test, y_test):
322313
score = clf.score(X_train, y_train)
323314
y_pred = clf.predict(X_test)
324315
cm = confusion_matrix(y_test, y_pred)
325-
316+
326317
plot_confusion_matrix(cm, classes=model)
327318

328319
# Cross validation
@@ -370,20 +361,20 @@ def xgboost(X_train, y_train, X_test, y_test):
370361
nthread=8,
371362
scale_pos_weight=1
372363
)
373-
364+
374365
xgbclf.fit(X_train, y_train)
375366
train_score = xgbclf.score(X_train, y_train)
376367
y_pred = xgbclf.predict(X_test)
377368

378369
cm = confusion_matrix(y_test, y_pred)
379-
370+
380371
plot_confusion_matrix(cm, classes=xgbclf)
381372

382373
accuracies = cross_val_score(estimator=xgbclf, X=X_train, y=y_train, cv=10)
383374
print('Resultado na base de treino %.2f' % train_score)
384375
print('Resultado Médio na base de teste: %.2f' % accuracies.mean())
385376
print('Desvio padrão: %.4f' % accuracies.std())
386-
377+
387378
xgboost(X_train, y_train, X_test, y_test)
388379
```
389380

@@ -405,15 +396,15 @@ xgb_params = [{
405396
}]
406397

407398
xgb_add_params = [{
408-
'learning_rate': 0.1,
409-
'n_estimators': 140,
399+
'learning_rate': 0.1,
400+
'n_estimators': 140,
410401
'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,
414405
'colsample_bytree': 0.8,
415-
'objective': 'binary:logistic',
416-
'nthread': 8,
406+
'objective': 'binary:logistic',
407+
'nthread': 8,
417408
'scale_pos_weight': 1,
418409
'seed': 27
419410
}]
@@ -430,7 +421,7 @@ def search_params(classifier, params):
430421
param_grid=params,
431422
cv = 10,
432423
n_jobs=-1)
433-
424+
434425
grid_search = grid_search.fit(X_train, y_train)
435426
print(grid_search.best_score_, grid_search.best_params_)
436427
return grid_search.best_score_
@@ -462,10 +453,10 @@ from sklearn.model_selection import cross_val_score
462453
def fit_tree(X, Y):
463454
tree_classifier = DecisionTreeClassifier(max_features=70, min_samples_leaf=10, max_depth=40)
464455
tree_classifier.fit(X, Y)
465-
456+
466457
inner_score = tree_classifier.score(X, Y)
467458
tree_fit = cross_val_score(tree_classifier, X, Y)
468-
459+
469460
return inner_score, tree_fit.mean(), tree_fit.std()
470461

471462
"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
478469
de viés quando uma das classes na base de treino é mais predominante do que
479470
outra, ou seja, a distribuição das classes na base de treino devem ser
480471
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).
483473

484474
Para tanto, precisa-se descobrir qual a
485475
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
540530
com mais votos ganha e o resultado é
541531
dado.
542532

543-
![Workflow Random
544-
forest](forest.jpg)
533+
![Workflow Randomforest](forest.jpg)
545534

546535
De acordo com breiman, 2001, as RFs corrigem a maior parte
547536
dos problemas de
@@ -554,8 +543,7 @@ Referências:
554543
[BREIMAN](https://www.stat.berkeley.edu/users/breiman/randomforest2001.pdf),
555544
Leo. Random forests. Machine learning, v. 45, n. 1, p. 5-32, 2001.
556545

557-
##
558-
Utilizando o algoritmo
546+
## Utilizando o algoritmo
559547

560548
```python
561549
from sklearn.ensemble import RandomForestClassifier
@@ -580,18 +568,14 @@ maior é a importância da feature.
580568
O método utilizado para gerar a
581569
importância das features no modelo é a Decrease Mean Importance, que utiliza em
582570
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),
585572
este indicador é o Gini Impurity que pode ser entendido como uma redução da
586573
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).
589575

590576
#### O indice
591577
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):
595579

596580
\begin{equation}
597581
Gini = 1- \sum_{i=1} p_i^2
@@ -612,21 +596,23 @@ Regression Trees (CART), utiliza-se o indice de Gini modificado, isto é,
612596
calcula-se ainda as probabilidades em $p_i$, mas agora utiliza-se do indice de
613597
Gini nos filhos da esquerda $t_l$ e direita $t_r$. Recalcula-se as
614598
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).
617600
\begin{equation}
618601
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}
620604
\end{equation}
621605

622606
#### Decrease Mean Importance
623607

624608
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
628615
conta é:
629-
630616
\begin{equation}
631617
I(X_m) = \frac{1}{N_T} \sum_{T} \sum_{t \epsilon
632618
T:v(s)=X_m} pf(t)i(s,t) \\
@@ -668,8 +654,7 @@ print ("{} de precisão".format(rfscores.mean() * 100))
668654

669655
## ExtraTrees
670656

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)
673658
nos apresenta um tipo diferente de random forest que pode apresentar resultados
674659
melhores que o [RandomForestClassifier](http://scikit-
675660
learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html).
@@ -716,10 +701,11 @@ Estimativa: 10 min com I7 3.1 8Ram
716701
# Referências Bibliográficas
717702
http://scikit-
718703
learn.org/stable/modules/generated/sklearn.dummy.DummyClassifier.html#sklearn.dummy.DummyClassifier
704+
719705
https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-
720706
xgboost-with-codes-python/
721707

722-
708+
723709
BABATUNDE, Oluleye, ARMSTRONG, Leisa, DIEPEVEEN,
724710
Dean e LENG, J. Comparative analysis of Genetic Algorithm and Particle Swam
725711
Optimization: An application in precision agriculture. 2015. **Asian Journal of

0 commit comments

Comments
 (0)