Я использую 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» с соответствующими аргументами перед использованием этого метода.

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

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

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

2
EmJ 27 Июн 2019 в 08:07

3 ответа

Лучший ответ

В случае, если вы хотите использовать модель 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
Venkatachalam 27 Июн 2019 в 06:35

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

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

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

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

# Probabilty
model.predict_proba(X)[:,1]
1
skillsmuggler 27 Июн 2019 в 05:44

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

proba = cross_val_predict(clf, X, y, cv=k_fold, method='predict_proba')
print(proba[:,1])
print(np.argsort(proba[:,1]))
2
EmJ 27 Июн 2019 в 06:05