web-dev-qa-db-fra.com

Classification multiclasse avec LightGBM

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?

5
Sreeram TP

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):

  • Le classificateur peut ne pas avoir appris la troisième classe; peut-être que ses caractéristiques chevauchent celles d'une classe plus grande et que le classifieur utilise par défaut la classe plus grande afin de minimiser la fonction objectif. Essayez de fournir un ensemble d’entraînement équilibré (le même nombre d’échantillons par classe) et réessayez.

Si les nouvelles prévisions contiennent les 3 classes:

  • Quelque chose a mal tourné quelque part dans votre code. Plus d'informations sont nécessaires pour déterminer ce qui n'a pas fonctionné.

J'espère que cela t'aides.

2
kwypston

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.

0
amany