Совершенная точность, отзыв и f1-оценка, но плохой прогноз - PullRequest
0 голосов
/ 13 ноября 2018

Использование scikit-learn для классификации бинарной задачи.Совершенство classification_report (все 1).И все же прогноз дает 0.36.Как это может быть?

Я знаком с несбалансированными лейблами.Однако я не думаю, что это так, поскольку f1 и другие столбцы с оценками, а также матрица путаницы указывают на идеальный результат.

# Set aside the last 19 rows for prediction.
X1, X_Pred, y1, y_Pred = train_test_split(X, y, test_size= 19, 
                shuffle = False, random_state=None)

X_train, X_test, y_train, y_test = train_test_split(X1, y1, 
         test_size= 0.4, stratify = y1, random_state=11)

clcv = DecisionTreeClassifier()
scorecv = cross_val_score(clcv, X1, y1, cv=StratifiedKFold(n_splits=4), 
                         scoring= 'f1') # to balance precision/recall
clcv.fit(X1, y1)
y_predict = clcv.predict(X1)
cm = confusion_matrix(y1, y_predict)
cm_df = pd.DataFrame(cm, index = ['0','1'], columns = ['0','1'] )
print(cm_df)
print(classification_report( y1, y_predict ))
print('Prediction score:', clcv.score(X_Pred, y_Pred)) # unseen data

Вывод:

confusion:
      0   1
0  3011   0
1     0  44

              precision    recall  f1-score   support
       False       1.00      1.00      1.00      3011
        True       1.00      1.00      1.00        44

   micro avg       1.00      1.00      1.00      3055
   macro avg       1.00      1.00      1.00      3055
weighted avg       1.00      1.00      1.00      3055

Prediction score: 0.36

1 Ответ

0 голосов
/ 13 ноября 2018

Проблема в том, что вы перегружены.

Существует много кода, который не используется, поэтому давайте удалим:

# Set aside the last 19 rows for prediction.
X1, X_Pred, y1, y_Pred = train_test_split(X, y, test_size= 19, 
                shuffle = False, random_state=None)

clcv = DecisionTreeClassifier()
clcv.fit(X1, y1)
y_predict = clcv.predict(X1)
cm = confusion_matrix(y1, y_Pred)
cm_df = pd.DataFrame(cm, index = ['0','1'], columns = ['0','1'] )
print(cm_df)
print(classification_report( y1, y_Pred ))
print('Prediction score:', clcv.score(X_Pred, y_Pred)) # unseen data

Итак, здесь нет перекрестной проверки,и очевидной причиной низкой оценки прогноза является переоснащение классификатора дерева решений.

Используйте оценку из перекрестной проверки, и вы должны увидеть проблему там непосредственно.

...