Вопрос или проблема
Я работаю с 10-кратной кросс-валидацией и хочу усреднить метрики, но не могу это сделать с помощью sklearn. Вот как я это делаю, и метрики выводятся по каждому разделению.
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score, precision_score, f1_score, recall_score
from sklearn.metrics import precision_recall_fscore_support as score
k = 10
kf = KFold(n_splits=k, random_state=None)
model = clf
for train_index , test_index in kf.split(x_train):
x_train , x_test = X.iloc[train_index,:],X.iloc[test_index,:]
y_train , y_test = Y[train_index] , Y[test_index]
model.fit(x_train,y_train)
pred_values = model.predict(x_test)
precision, recall, fscore, support = score(pred_values, y_test)
print('precision: {}'.format(precision))
print('recall: {}'.format(recall))
print('fscore: {}'.format(fscore))
print('support: {}'.format(support))
Исходя из предоставленной вами информации, я думаю, вы можете сделать следующее:
-
усреднить тестовые оценки, которые вы получаете от ваших разделений, вместо того чтобы выводить их по разделениям, или
-
использовать опцию cross_validation_score, предоставляемую sklearn, а затем усреднить такие оценки: cross_val_score(clf, X, y, cv=5).mean(), или
-
использовать класс sklearn GridSearchCV, с помощью которого вы можете получить доступ к деталям вашей стратегии кросс-валидации через параметр cv_results_:
http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html
Вы можете увидеть связанный вопрос и ответ на:
Неоднозначность кросс-валидации KFold
Ответ или решение
Конечно! Для того чтобы правильно вычислить среднее значение метрик после 10-кратной кросс-валидации с использованием scikit-learn, нужно аккумулировать метрики в каждом фолде, а затем вычислить их средние значения. В вашем коде вы выводите метрики для каждого фолда, но не сохраняете их для последующего вычисления среднего. Давайте добавим код, который позволит это сделать:
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score, precision_score, f1_score, recall_score
from sklearn.metrics import precision_recall_fscore_support as score
import numpy as np
# Установите значения ваших переменных
k = 10
kf = KFold(n_splits=k, random_state=None)
model = clf
# Списки для хранения метрик
precisions = []
recalls = []
fscores = []
supports = []
for train_index, test_index in kf.split(X): # Убедитесь что используете правильную выборку X и Y
x_train, x_test = X.iloc[train_index, :], X.iloc[test_index, :]
y_train, y_test = Y[train_index], Y[test_index]
model.fit(x_train, y_train)
pred_values = model.predict(x_test)
# Вычисление метрик для фолда
precision, recall, fscore, support = score(y_test, pred_values, average='binary') # Используйте average='binary' или другой в зависимости от задачи
precisions.append(precision)
recalls.append(recall)
fscores.append(fscore)
supports.append(support)
# Вычисление средних значений метрик
avg_precision = np.mean(precisions)
avg_recall = np.mean(recalls)
avg_fscore = np.mean(fscores)
# Подсчет общего числа поддержек, если это необходимо
total_support = np.sum(supports)
print('Средняя точность: {:.4f}'.format(avg_precision))
print('Средний отзыв: {:.4f}'.format(avg_recall))
print('Средний F1-мер: {:.4f}'.format(avg_fscore))
print('Общее число поддержек: {}'.format(total_support))
Объяснение кода:
-
Итерация по KFold: В каждой итерации вы обучаете модель и делаете прогноз на валидационном наборе.
-
Сохранение метрик: Вместо вывода значений метрик, вы сохраняете их в списки.
-
Вычисление средних значений: После завершения кросс-валидации вы используете
numpy.mean
для вычисления средних значений для каждой из метрик. -
Подсчет поддержек: Если нужно, также можно подсчитать общее количество поддержек из всех фолдов.
Этот подход актуален для любой задачи классификации и позволяет получить более надежную оценку производительности вашей модели за счет усреднения результатов нескольких разделений данных.