J'essaie de modéliser un classificateur pour un problème de classification multi-classes (3 classes) à l'aide de LightGBM en Python. J'ai utilisé les paramètres suivants.
params = {'task': 'train',
'boosting_type': 'gbdt',
'objective': 'multiclass',
'num_class':3,
'metric': 'multi_logloss',
'learning_rate': 0.002296,
'max_depth': 7,
'num_leaves': 17,
'feature_fraction': 0.4,
'bagging_fraction': 0.6,
'bagging_freq': 17}
Toutes les caractéristiques qualitatives de l'ensemble de données sont étiquetées avec LabelEncoder
. J'ai formé le modèle après avoir exécuté cv
avec eartly_stopping
comme indiqué ci-dessous.
lgb_cv = lgbm.cv(params, d_train, num_boost_round=10000, nfold=3, shuffle=True, stratified=True, verbose_eval=20, early_stopping_rounds=100)
nround = lgb_cv['multi_logloss-mean'].index(np.min(lgb_cv['multi_logloss-mean']))
print(nround)
model = lgbm.train(params, d_train, num_boost_round=nround)
Après l'entraînement, j'ai fait de la prédiction avec un modèle comme celui-ci,
preds = model.predict(test)
print(preds)
J'ai un tableau imbriqué en sortie comme ceci.
[[ 7.93856847e-06 9.99989550e-01 2.51164967e-06]
[ 7.26332978e-01 1.65316511e-05 2.73650491e-01]
[ 7.28564308e-01 8.36756769e-06 2.71427325e-01]
...,
[ 7.26892634e-01 1.26915179e-05 2.73094674e-01]
[ 5.93217601e-01 2.07172044e-04 4.06575227e-01]
[ 5.91722491e-05 9.99883828e-01 5.69994435e-05]]
Comme chaque liste dans preds
représente les probabilités de classe, j’ai utilisé np.argmax()
pour trouver les classes comme celle-ci.
predictions = []
for x in preds:
predictions.append(np.argmax(x))
En analysant la prédiction, j’ai trouvé que mes prédictions ne contenaient que 2 classes - 0 et 1. La classe 2 était la 2e classe en importance dans l’entraînement, mais elle n’était nulle part dans les prévisions. Lors de l’évaluation du résultat, 78%
précision.
Alors, pourquoi mon modèle ne prévoit-il pas la classe 2 dans aucun des cas? Y at-il quelque chose de mal dans les paramètres que j'ai utilisés?
N'est-ce pas la bonne façon d'interpréter la prédiction faite par le modèle? Dois-je apporter des modifications aux paramètres?
Essayez de résoudre le problème en permutant les classes 0 et 2 et en relançant le processus de formation et de prévision.
Si les nouvelles prévisions ne contiennent que les classes 1 et 2 (probablement à partir des données fournies):
Si les nouvelles prévisions contiennent les 3 classes:
J'espère que cela t'aides.
D'après les résultats que vous fournissez, rien ne semble fausser les prévisions.
Le modèle produit trois probabilités comme vous le montrez et juste à partir de la première sortie que vous avez fournie. La classe 2 a une probabilité plus élevée, donc je ne vois pas le problème ici.
La classe 0 est la première classe, la classe 1 est en fait la classe 2 la deuxième classe, 2 est la troisième classe. Donc je suppose que rien ne va pas.