Прогнозируемые значения каждой кратности в K-Fold Cross Validation в sklearn

Я выполнил 10-кратную перекрестную проверку набора данных, который у меня есть, используя python sklearn,

result = cross_val_score(best_svr, X, y, cv=10, scoring='r2')
print(result.mean())

Я смог получить среднее значение оценки r2 в качестве окончательного результата. Я хочу знать, есть ли способ распечатать прогнозируемые значения для каждой складки (в данном случае 10 наборов значений).


person Krishi H    schedule 07.08.2018    source источник


Ответы (3)


Я полагаю, что вы ищете функцию cross_val_predict.

person jh314    schedule 07.08.2018
comment
Да! Спасибо. Я хочу знать, могу ли я распечатать результаты для каждой складки отдельно - person Krishi H; 07.08.2018
comment
Я так понимаю, что у него есть прогнозы на все фолды. Я хочу знать, есть ли способ распечатать результаты каждой складки отдельно. например, 1-й фолд: {....}, 2-й фолд: {......} ..... и т. д. - person Krishi H; 07.08.2018

Поздний ответ, просто чтобы добавить к @ jh314, cross_val_predict действительно возвращает все прогнозы, но мы не знаем, к какой группе относится каждый прогноз. Для этого нам нужно предоставить складки вместо целого числа:

import seaborn as sns
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_predict, StratifiedKFold 

iris = sns.load_dataset('iris')
X=iris.iloc[:,:4]
y=(iris['species'] == "versicolor").astype('int')

rfc = RandomForestClassifier()
skf = StratifiedKFold(n_splits=10,random_state=111,shuffle=True)

pred = cross_val_predict(rfc, X, y, cv=skf)

А теперь мы проходим по объекту Kfold и вытаскиваем прогнозы, соответствующие каждой складке:

fold_pred = [pred[j] for i, j in skf.split(X,y)]
fold_pred

[array([0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0]),
 array([0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1]),
 array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0]),
 array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0])]
person StupidWolf    schedule 19.12.2020
comment
Хороший подход! Могу ли я узнать, возможно ли извлечь реальные индексы неправильно классифицированных или классифицированных экземпляров в этом сценарии? Я не нашел ответа на этот вопрос! stackoverflow.com/questions/66686327/ - person DOT; 13.06.2021
comment
Возможно ли это с помощью kfold.split(X, y, groups=None)? или какой-нибудь обходной путь, например, sample_indices_ или что-то еще? - person DOT; 13.06.2021
comment
пожалуйста, взгляните на этот вопрос... stackoverflow.com/questions/67956643/ - person DOT; 13.06.2021

Чтобы распечатать прогнозы для каждой складки,

for k in range(2,10):
    result = cross_val_score(best_svr, X, y, cv=k, scoring='r2')
    print(k, result.mean())
    y_pred = cross_val_predict(best_svr, X, y, cv=k)
    print(y_pred)
person Van Peer    schedule 07.08.2018
comment
Это выполняет ту же функцию, что и print(result). Я хочу распечатать их отдельно для каждой складки - person Krishi H; 07.08.2018
comment
@KrishiH result дает вам баллы, а y_pred дает прогнозы. Пожалуйста, проверьте. - person Van Peer; 07.08.2018
comment
Я не думаю, что вы понимаете мой вопрос. y_pred возвращает все прогнозы. Я хочу распечатать прогноз для каждой складки отдельно. - person Krishi H; 07.08.2018
comment
@KrishiH, добавляя cv в качестве параметра к cross_val_predict, дает прогнозы. Спасибо! - person Van Peer; 07.08.2018