Кривые обучения

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

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

1.) Правильно ли я упорядочил шаги, как я сделал ниже, т.е. нормализация, Кросс-валидация (базовая модель), кривая обучения, настройка гиперпараметров, обучение модели и прогнозирование, а затем кривая обучения снова, чтобы определить, переобучается ли моя модель или недообучается?

2.) Судя по графику, моя модель переобучается, так как по моей матрице неопределенности и отчету о классификации я получаю практически идеальные оценки. (извините, мне пришлось загрузить изображение, так как не было другого выбора!)

3.) График изменяется каждый раз, когда я запускаю модель. Как же тогда я могу получить подходящую меру для своей модели?

Это работа, которую я выполнил до сих пор:

train_x, test_x, train_y, test_y = train_test_split(data2, y, test_size = 0.2, random_state = 69, stratify = y)

cross_val_model = cross_val_score(pipe, train_x, train_y, cv = 5,
                              n_jobs = -1, scoring = 'f1_macro')
s_score = cross_val_model.mean()

train_sizes, train_score, test_score = learning_curve(pipe, train_x, 
train_y, cv = 5,
                                                 train_sizes = 
np.linspace(0.1, 1.0, 10),
                                                 n_jobs = -1, scoring = 
'f1_macro')
train_mean = np.mean(train_score, axis = 1)
test_mean = np.mean(test_score, axis = 1)

plt.plot(train_sizes, train_mean, color="blue", marker="o",markersize = 5, label="точность обучения")
plt.plot(train_sizes, test_mean, color="red", marker="+", markersize = 
5, label="точность валидации")
plt.title('кривая обучения')
plt.xlabel('размер обучающей выборки')
plt.ylabel('f1 балл модели')
plt.legend()
plt.grid()
plt.show()

введите описание изображения здесь

def objective(trial):

   model__max_depth = trial.suggest_int('model__max_depth', 2, 32)
   model__max_leaf_nodes = trial.suggest_int('model__max_leaf_nodes', 
50, 500)
   model__max_features = trial.suggest_float('model__max_features', 0.0, 
1.0)
   model__min_samples_leaf = 
trial.suggest_int('model__min_samples_leaf', 1, 50)

   params = {'model__max_depth' : model__max_depth, 
          'model__max_leaf_nodes' : model__max_leaf_nodes,
          'model__max_features' : model__max_features,
          'model__min_samples_leaf' : model__min_samples_leaf}

   pipe.set_params(**params)

   return np.mean(cross_val_score(pipe, train_x, train_y,
                                 cv = 5, n_jobs = -1, scoring = 
  'f1_macro'))

dtr_study = optuna.create_study(direction = 'maximize')
dtr_study.optimize(objective, n_trials = 10)

pipe.set_params(**dtr_study.best_params)
pipe.fit(train_x, train_y)
pred = pipe.predict(test_x)
c_matrix = confusion_matrix(test_y, pred)
c_report = classification_report(test_y, pred)

train_sizes, train_score, test_score = learning_curve(pipe, train_x, 
train_y, cv = 5,
                                                 train_sizes = 
np.linspace(0.1, 1.0, 10),
                                                 n_jobs = -1, scoring = 
'f1_macro')
train_mean = np.mean(train_score, axis = 1)
test_mean = np.mean(test_score, axis = 1)

plt.plot(train_sizes, train_mean, color="blue", marker="o",markersize = 5, label="точность обучения")
plt.plot(train_sizes, test_mean, color="red", marker="+", markersize = 
5, label="точность валидации")
plt.title('кривая обучения')
plt.xlabel('размер обучающей выборки')
plt.ylabel('f1 балл модели')
plt.grid()
plt.show()

введите описание изображения здесь

Обычно кривые обучения используют

  • Ось X = количество итераций модели
  • Ось Y = насколько хороша модель, где хороша зависит от вашей функции потерь (в вашем случае это будет f1-балл)

В вашем случае, похоже, вы используете размер ваших обучающих данных.

Подумайте об этом: кривая обучения показывает, насколько лучше становится ваша модель со временем, а не по данным. Обычно больше данных означает лучшие модели, но это не то, что вы хотите измерить с помощью вашей кривой обучения.

Ответ или решение

Обзор кривых обучения в контексте многоклассовой классификации

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

1. Правильность последовательности шагов

Ваши шаги можно оценить как последовательные, но они требуют некоторой корректировки. Правильная последовательность должна включать:

  • Масштабирование данных: Это критически важно, чтобы привести все признаки к одному масштабу, особенно при использовании алгоритмов, чувствительных к масштабу.
  • Кросс-валидация (CV) базовой модели: На этом этапе вы получаете базовое представление о производительности вашей модели, используя кросс-валидацию для проверки.
  • Обучение модели и построение первой кривой обучения: Важно, чтобы у вас была начальная точка для анализа.
  • Настройка гиперпараметров: Оптимизация гиперпараметров должна происходить на основе первого результата, обеспечивая улучшение модели.
  • Финальное обучение модели и предсказание: Используйте оптимизированные параметры для окончательного обучения модели на полном наборе данных.
  • Построение второй кривой обучения: После всех улучшений сравните изменения в производительности, чтобы оценить, улучшилась ли модель и есть ли признаки переобучения или недообучения.

2. Оценка на основе графика

Судя по вашему описанию, вы получаете «почти идеальные» оценки по метрикам, что может свидетельствовать о переобучении модели.

  • Если модель показывает высокие оценки на обучающих данных, но низкие на валидационных, это явный признак переобучения.
  • Вы можете использовать матрицу ошибок и отчет о классификации для более детального анализа: если модель выдает хорошие результаты только на обучающей выборке, но не на тестовой, это может указывать на то, что она запомнила данные, но не научилась обобщать.

3. Устойчивость графиков

Постоянные изменения графиков при каждом запуске модели могут быть вызваны несколькими факторами:

  • Случайный выбор данных: Каждый раз, когда вы делите данные на обучающую и тестовую выборки, результаты могут варьироваться. Убедитесь, что randomness контролируется (например, используйте random_state).
  • Шум в данных: Если ваши данные содержат шум или выбросы, результаты могут значительно колебаться.

Чтобы получить более точные и устойчивые оценки, рассмотрите возможность использования кросс-валидации для генерации среднего значения метрик и выпишите результаты по каждой итерации.

Заключение

Кривые обучения являются мощным инструментом для диагностики и повышения производительности моделей машинного обучения. Следуя рекомендациям по последовательности шагов, анализируя свои графики и стремясь контролировать изменчивость результатов, вы сможете более эффективно выявлять проблемы с вашими моделями, такие как переобучение или недообучение. Понимание этих концепций поможет вам улучшить модель и достичь более надежных результатов в вашей многоклассовой классификации.

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

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