2017-06-20 4 views
2

Je forme un classificateur xgboost sur un problème de classification binaire. Il produit 70% de prédictions précises. Pourtant, la perte de log est très importante à 9.13. Je suppose que c'est peut-être parce que quelques prédictions sont très loin de la cible, mais je ne comprends pas pourquoi cela arrive - d'autres personnes rapportent beaucoup mieux logloss (0.55 - 0.6) sur les mêmes données avec xgboost.xgboost: énorme perte de journal malgré une précision raisonnable

from readCsv import x_train, y_train 
from sklearn.model_selection import train_test_split 
from sklearn.metrics import accuracy_score, log_loss 
from xgboost import XGBClassifier 

seed=7 
test_size=0.09 

X_train, X_test, y_train, y_test = train_test_split(
    x_train, y_train, test_size=test_size, random_state=seed) 

# fit model no training data 
model = XGBClassifier(max_depth=5, 
         learning_rate=0.02, 
         objective= 'binary:logistic', 
         n_estimators = 5000) 
model.fit(X_train, y_train) 

# make predictions for test data 
y_pred = model.predict(X_test) 
predictions = [round(value) for value in y_pred] 

accuracy = accuracy_score(y_test, predictions) 
print("Accuracy: %.2f%%" % (accuracy * 100.0)) 

ll = log_loss(y_test, y_pred) 
print("Log_loss: %f" % ll) 
print(model) 

produit suivant la sortie:

Accuracy: 73.54% 
Log_loss: 9.139162 
XGBClassifier(base_score=0.5, colsample_bylevel=1, colsample_bytree=1, 
     gamma=0, learning_rate=0.02, max_delta_step=0, max_depth=5, 
     min_child_weight=1, missing=None, n_estimators=5000, nthread=-1, 
     objective='binary:logistic', reg_alpha=0, reg_lambda=1, 
     scale_pos_weight=1, seed=0, silent=True, subsample=1) 

Tout le monde sait raisons de mon haut logloss? Merci!

+0

Notez que vous calculez la précision avec des prédictions arrondies mais calculez votre perte de journal sans prédictions arrondies. Avez-vous essayé de vérifier votre précision sans arrondir les valeurs? – rafaelvalle

+0

@rafaelvalle Testé maintenant sans arrondir: il a produit exactement le même nombre - 73.54% – ikamen

Répondre

2
solution

: utilisation model.predict_proba(), non model.predict()

Ceci réduit logloss de 7+ à 0,52, ce qui est dans la plage attendue. model.predict() produisait des valeurs de magnitude énorme comme 1e18, il semble qu'il devait passer par une fonction qui en ferait un score de probabilité valide (entre 0 et 1).