2 votes

L'optimisation des hyperparamètres donne de moins bons résultats

J'ai formé mon classificateur de forêt aléatoire de la manière suivante :

rf = RandomForestClassifier(n_jobs=-1, max_depth = None, max_features = "auto", 
                            min_samples_leaf = 1, min_samples_split = 2, 
                            n_estimators = 1000, oob_score=True, class_weight="balanced", 
                            random_state=0)

rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)

print("Confusion matrix")
print(metrics.confusion_matrix(y_test, y_pred))
print("F1-score")
print(metrics.f1_score(y_test, y_pred, average="weighted"))
print("Accuracy")
print(metrics.accuracy_score(y_test, y_pred))
print(metrics.classification_report(y_test, y_pred))

et a obtenu les résultats suivants :

Confusion matrix
[[558  42   2   0   1]
 [ 67 399  84   3   2]
 [ 30 135 325  48   7]
 [  5  69  81 361  54]
 [  8  17   7  48 457]]
F1-score
0.7459670332027826
Accuracy
0.7473309608540926
              precision    recall  f1-score   support

           1       0.84      0.93      0.88       603
           2       0.60      0.72      0.66       555
           3       0.65      0.60      0.62       545
           4       0.78      0.63      0.70       570
           5       0.88      0.85      0.86       537

J'ai alors décidé d'effectuer une optimisation des hyperparamètres afin d'améliorer ce résultat.

clf = RandomForestClassifier(random_state = 0, n_jobs=-1)
param_grid = { 
    'n_estimators': [1000,2000],
    'max_features': [0.2, 0.5, 0.7, 'auto'],
    'max_depth' : [None, 10],
    'min_samples_leaf': [1, 2, 3, 5],
    'min_samples_split': [0.1, 0.2]
}

k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
clf = GridSearchCV(estimator=clf, 
                   param_grid=param_grid, 
                   cv=k_fold,
                   scoring='accuracy',
                   verbose=True)

clf.fit(X_train, y_train)

Mais j'ai obtenu des résultats encore plus mauvais si je le faisais. y_pred = clf.best_estimator_.predict(X_test) :

Confusion matrix
[[533  68   0   0   2]
 [145 312  70   0  28]
 [ 58 129 284  35  39]
 [ 21  68  73 287 121]
 [ 32  12   3  36 454]]
F1-score
0.6574507466273805
Accuracy
0.6654804270462633
              precision    recall  f1-score   support

           1       0.68      0.88      0.77       603
           2       0.53      0.56      0.55       555
           3       0.66      0.52      0.58       545
           4       0.80      0.50      0.62       570
           5       0.70      0.85      0.77       537

Je suppose que cela se produit à cause de scoring='accuracy' . Quel score dois-je utiliser pour obtenir le même résultat ou un meilleur résultat que ma forêt aléatoire initiale ?

1voto

MaximeKan Points 3256

Définir scoring='accuracy' dans votre recherche de grille ne devrait pas être responsable de cette différence, car il s'agit de toute façon de la valeur par défaut pour un classificateur Random Forest.

La raison pour laquelle vous avez une différence inattendue ici est que vous avez spécifié class_weight="balanced" dans votre première forêt aléatoire rf mais pas dans le second classificateur clf . Par conséquent, vos classes sont pondérées différemment lors du calcul du score de précision, ce qui conduit finalement à des mesures de performance différentes.

Pour corriger cela, il suffit de définir clf à travers :

clf = RandomForestClassifier(random_state = 0, n_jobs=-1, class_weight="balanced")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X