Как получить вероятности прогноза с помощью перекрестной проверки в Scikit-Learn - PullRequest
1 голос
/ 27 июня 2019

Я использую RandomForestClassifier следующим образом, используя перекрестную проверку для двоичной классификации (метки классов 0 и 1).

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedKFold, cross_val_score

clf=RandomForestClassifier(random_state = 42, class_weight="balanced")
k_fold = StratifiedKFold(n_splits=10, shuffle=True, random_state=0)
accuracy = cross_val_score(clf, X, y, cv=k_fold, scoring = 'accuracy')
print("Accuracy: " + str(round(100*accuracy.mean(), 2)) + "%")
f1 = cross_val_score(clf, X, y, cv=k_fold, scoring = 'f1_weighted')
print("F Measure: " + str(round(100*f1.mean(), 2)) + "%")

Теперь я хочуупорядочить мои данные, используя вероятности предсказания класса 1 с cross validation результатами.Для этого я попробовал следующие два способа:

pred = clf.predict_proba(X)[:,1]
print(pred)

probs = clf.predict_proba(X)
best_n = np.argsort(probs, axis=1)[:,-6:]

Я получаю следующую ошибку

NotFittedError : Этот экземпляр RandomForestClassifier еще не установлен.Прежде чем использовать этот метод, вызовите «fit» с соответствующими аргументами.

для обеих ситуаций.

Мне просто интересно, где я делаю что-то не так.

IЯ рад предоставить более подробную информацию, если это необходимо.

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

Я решил свою проблему, используя следующий код:

proba = cross_val_predict(clf, X, y, cv=k_fold, method='predict_proba')
print(proba[:,1])
print(np.argsort(proba[:,1]))
1 голос
/ 27 июня 2019

В случае, если вы хотите использовать модель CV для невидимых точек данных, используйте следующий подход.

from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_validate

iris = datasets.load_iris()
X = iris.data
y = iris.target
clf = RandomForestClassifier(n_estimators=10, random_state = 42, class_weight="balanced")

cv_results = cross_validate(clf, X, y, cv=3, return_estimator=True)

clf_fold_0 = cv_results['estimator'][0]

clf_fold_0.predict_proba([iris.data[133]])

# array([[0. , 0.5, 0.5]])

1 голос
/ 27 июня 2019

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

В вашем случае вам сначала нужно вызвать метод fit() для генерации тресса в модели. Как только вы подгоните модель к тренировочным данным, вы можете вызвать метод predict_proba().

Это также указано в ошибке.

# Fit model
model = RandomForestClassifier(...)
model.fit(X_train, Y_train)

# Probabilty
model.predict_proba(X)[:,1]
...