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

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

В данный момент я работаю над проектом машинного обучения. Это задача с контролируемым обучением. Моя цель – предсказать для заданных данных животного (содержание, размер, вес и т.д.) ингредиенты (энергия, витамины и т.д.). Сначала я очистил данные и закодировал категориальные признаки с помощью LabelEncoding. Я выбрал Random Forest в качестве алгоритма, потому что прочитал, что деревья хорошо работают с смешанными данными (категориальными и непрерывными). Я обучил модель с несколькими параметрами и заметил, что получаю отличные результаты на обучающей выборке, но очень плохие результаты на тестовой выборке. На мой взгляд, это указывает на переобучение. Модель обучается на шуме. Так что я знаю, что у меня есть два варианта: больше данных и снижение сложности модели. Но я пробовал PCA, удалил некоторые признаки, изменил гиперпараметр (max_depth до 15). Но ни одно из этих действий не помогло. Я снизил max_depth, но тогда у меня возникла большая ошибка на обучающей выборке, но все равно осталась высокая ошибка на тестовой выборке.

Так в чем может быть проблема? Мне понятно, что ошибка на тестовой выборке всегда немного выше, чем ошибка на обучающей выборке. Но в этом случае разница очень большая.

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.decomposition import KernelPCA

param_grid = {
    'n_estimators': [i for i in range(50, 500, 50)],
    'max_depth': [i for i in range(5, 20, 5)],
}

estimator = RandomForestRegressor()
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.1, random_state=52)
X_train,scalerX = normalize(X_train)
Y_train,scalerY = normalize(Y_train)
X_test = scalerX.transform(X_test)
Y_test = scalerY.transform(Y_test)

gridModel = GridSearchCV(estimator=estimator,param_grid=param_grid,n_jobs=4,cv=5,scoring='neg_mean_squared_error')
gridModel.fit(X_train,Y_train)

print(gridModel.best_params_)

best_params: {‘max_depth’: 15, ‘n_estimators’: 150}
изменив сетку на [i for i in range(5, 50, 5)], тогда best_params: {‘max_depth’: 30, ‘n_estimators’: 50}

y_pred_test = gridModel.predict(X_test)
test_r2_score = r2_score(y_pred=y_pred_test,y_true=Y_test)

y_pred_train = gridModel.predict(X_train)
train_r2_score = r2_score(y_pred=y_pred_train,y_true=Y_train)

print("Результат теста:",test_r2_score)
print("Результат обучения:",train_r2_score)

{‘max_depth’: 15, ‘n_estimators’: 150}
Результат теста: -2.952394644421328e+31
Результат обучения: 0.8043381537451035
{‘max_depth’: 30, ‘n_estimators’: 50}
Результат теста: -7.37835882483847e+30
Результат обучения: 0.9286384515560636

    scaler = preprocessing.StandardScaler()
    return scaler.fit_transform(x),scaler```

Несколько комментариев.

  1. Возможно, я что-то упускаю, но не могу найти вашу функцию normalize(), возможно, в ней есть ошибка. Для случайного леса в любом случае нет необходимости нормализовать данные.

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

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

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

1. Причины переобучения модели

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

  • Сложность модели: Даже после уменьшения параметра max_depth (глубина дерева) модель может оставаться достаточно сложной для изучения шумов в данных, особенно в случае кросс-валидации с небольшим объемом данных.

  • Качество данных: Убедитесь, что данные, которые используются для обучения и тестирования, не содержат шумов или выбросов. Чистота и хорошо подготовленные данные – фундамент успешного построения моделей.

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

2. Рекомендации по улучшению модели

Устранение проблемы вариативности

  • Проверка функций и предварительная обработка данных: Хотя вы использовали Label Encoding, убедитесь, что в ваших данных нет квадратичных или высокоразмерных признаков, которые могут усложнять обучение модели. Попробуйте выбрать меньшее количество признаков (Feature Selection), основываясь на их важности.

  • Исключение нормализации: Для моделей, таких как Random Forest, действительно нет необходимости в нормализации данных. Она может не только оказать влияние на обучения модели, но и исказить результаты предсказаний, поскольку лес случайных деревьев является инвариантным к шкале.

  • Увеличение объема данных: Если возможно, постарайтесь найти способ увеличить набор данных, например, через аугментацию, создание синтетических данных или использование дополнительных данных.

Тонкая настройка параметров модели

  • Примените различные алгоритмы подбора гиперпараметров. Вместо GridSearchCV можно рассмотреть также RandomizedSearchCV, который будет проверять случаи случайным образом, что может помочь обнаружить оптимальные параметры с меньшими затратами.
  • Убедитесь в том, что вы используете K-Fold Cross Validation для более надежной оценки модели.

3. Анализ метрик и ошибок

Когда вы выполняете оценку модели, критически важно правильно интерпретировать метрики:

  • R² Score: Показатели R², как в вашем случае, дают представление о том, сколько дисперсии зависимой переменной объясняется моделью. Негативное значение, как у вас (-2.95e+31), указывает на то, что ваша модель не смогла эффективно предсказывать результаты и имеет проблемы с переобучением.

  • Сравнение тренировочной и тестовой ошибок: Если ошибки сильно различаются, то это служит индикатором недостатка обобщения модели.

Заключение

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

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

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

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