Почему все истинные позитивы классифицируются как истинные негативы в модели машинного обучения? - PullRequest
0 голосов
/ 22 февраля 2020

Я подгоняю модель случайного леса к данным. Я разделил свой набор данных на тренировку и тестирование в соотношении 70:30 и обучил модель. Я получил точность 80% для данных испытаний. Затем я взял эталонный набор данных и протестировал модель с этим набором данных. Этот набор данных содержит только данные с истинными метками (1). Но когда я получаю прогноз для эталонного набора данных, используя модель, все истинные позитивы классифицируются как истинные негативы. Точность составляет 90%. Это почему? Есть ли способ интерпретировать это?

X = dataset.iloc[:, 1:11].values    
y=dataset.iloc[:,11].values

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1,shuffle='true')

XBench_test=benchmarkData.iloc[:, 1:11].values
YBench_test=benchmarkData.iloc[:,11].values

classifier=RandomForestClassifier(n_estimators=35,criterion='entropy',max_depth=30,min_samples_split=2,min_samples_leaf=1,max_features='sqrt',class_weight='balanced',bootstrap='true',random_state=0,oob_score='true')
classifier.fit(X_train,y_train)
y_pred=classifier.predict(X_test)

y_pred_benchmark=classifier.predict(XBench_test)

print("Accuracy on test data: {:.4f}".format(classifier.score(X_test, y_test)))\*This gives 80%*\

print("Accuracy on benchmark data: {:.4f}".format(classifier.score(XBench_test, YBench_test))) \*This gives 90%*\

1 Ответ

0 голосов
/ 06 марта 2020

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

Вот типичный пример:

Представьте, что у вас есть заболевание, которое присутствует в только 0,01% людей. Если вы прогнозируете, что ни у кого нет заболевания, у вас есть точность 99,99%, но ваша модель не является хорошей моделью.

В этом примере оказывается, что ваш набор контрольных данных (обычно называемый набором тестовых данных) не сбалансирован классы, и вы получаете точность 90% при вызове метода classifier.score. В этом случае точность не является хорошим способом интерпретации модели. Вместо этого вам следует взглянуть на другие метрики.

Другие распространенные метрики - это посмотреть на точность и вызвать , чтобы определить, как работает ваша модель. В этом случае, поскольку все истинные положительные значения прогнозируются как отрицательные, ваша точность И ваш отзыв будут равны 0, что означает, что ваша модель не очень хорошо дифференцируется.

В дальнейшем, если у вас есть несбалансированные классы, может быть лучше проверить различные пороговые значения оценки и посмотрите на такие показатели, как ROC_AU C. Эти метрики смотрят на оценки вероятности, выведенные моделью (предикат_пробы для sklearn) и тестируют различные пороги. Возможно, ваша модель хорошо работает при более низком пороговом значении, и положительные случаи неизменно оцениваются выше, чем отрицательные.

Вот еще одна статья о ROC_AU C.

Sci-kit learn имеет несколько различных показателей метри c, которые вы можете использовать, они расположены здесь .

Вот один из способов реализации RO C AU C в вашем коде.

X = dataset.iloc[:, 1:11].values    
y=dataset.iloc[:,11].values

X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1,shuffle='true')

XBench_test=benchmarkData.iloc[:, 1:11].values
YBench_test=benchmarkData.iloc[:,11].values

classifier=RandomForestClassifier(n_estimators=35,criterion='entropy',max_depth=30,min_samples_split=2,min_samples_leaf=1,max_features='sqrt',class_weight='balanced',bootstrap='true',random_state=0,oob_score='true')
classifier.fit(X_train,y_train)
#use predict_proba
y_pred=classifier.predict_proba(X_test)

y_pred_benchmark=classifier.predict_proba(XBench_test)

from sklearn.metrics import roc_auc_score
## instead of measuring accuracy use ROC AUC)
print("Accuracy on test data: {:.4f}".format(roc_auc_score(X_test, y_test)))\*This gives 80%*\

print("Accuracy on benchmark data: {:.4f}".format(roc_auc_score(XBench_test, YBench_test))) \*This gives 90%*\
...