Среднее значение метрик с использованием 10-кратной проверки

Вопрос или проблема

Я работаю с 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))

Объяснение кода:

  1. Итерация по KFold: В каждой итерации вы обучаете модель и делаете прогноз на валидационном наборе.

  2. Сохранение метрик: Вместо вывода значений метрик, вы сохраняете их в списки.

  3. Вычисление средних значений: После завершения кросс-валидации вы используете numpy.mean для вычисления средних значений для каждой из метрик.

  4. Подсчет поддержек: Если нужно, также можно подсчитать общее количество поддержек из всех фолдов.

Этот подход актуален для любой задачи классификации и позволяет получить более надежную оценку производительности вашей модели за счет усреднения результатов нескольких разделений данных.

Оцените материал
Добавить комментарий

Капча загружается...