Точность модели машинного обучения

При 5-кратной кроссвалидации точность регрессии (коэффициент детерминации r^2) низкая на последнем разбиении.

Что это означает? При обучении на всем наборе данных качество обучения падает? Или это не имеет значения?

Значения: 0.29, 0.05, 0.36, 0.18, -1.31
Среднее: -0.08346647029663619 Это значения при выходном столбце верхней границы заработной платы (там данные не такие качественные, как нижняя граница, так как чаще пропущены) На нижней границе r2 около 48%, что меня вполне устраивает.

Стоит ли при таких значениях обучать для дальнейшего использования не на всем наборе данных, а на 1 и 3 части набора данных, где точность выше?

Набор данных - вакансии с hh.ru. Цель - прогнозирование заработной платы.

37 000 записей, 29 столбцов: опыт, ключевой навык, должность, работодатель, нижняя и верхняя граница заработной платы, специализация, профессиональная область (эти поля закодированы label encoding); город (Киров, Москва, СПб), график и тип занятости закодированы one hot encoding.

Данные не масштабировала, так как градиентный бустинг не чувствителен к масштабированию. Сложности модели должно быть достаточно, так как на обучающем наборе данных точность около 70-80%. Если я правильно понимаю, то модель переобучается.

Ссылка на набор данных: https://drive.google.com/file/d/1QJZAYyXIXcrMgzet8SUC31MzV5dHODcv/view?usp=sharing


Ответы (1 шт):

Автор решения: CrazyElf

Ну так вот навскидку если, у вас проблема с выбросами в таргете. Есть какое-то количество данных, в которых отношение верхней границы к нижней слишком большое (2, 10 и даже 50 раз). Если выкинуть какое-то количество их этих выбросов, то картина становится гораздо лучше. Какое конкретно соотношение выбрать для отсечения - решать вам. Я выбрал для примера соотношение 3, от него и выше это примерно получается 2.5% ваших данных, на мой взгляд это небольшая жертва.

print((df.salary_to/df.salary_from < 3).value_counts(normalize=True))
df_selected = df[df.salary_to/df.salary_from < 3]
X = df_selected[feature_columns]
y = df_selected.salary_to
model.fit(X, y)
print(r2_score(y, model.predict(X)))
print(cross_val_score(model, X, y, scoring='r2'))

Вывод:

True     0.975505
False    0.024495
dtype: float64
0.9147364058539751
[0.35825282 0.45682105 0.43133096 0.41867005 0.44403997]

У меня модель была RandomForestRegressor, но это не важно, на исходных ваших данных он показывал примерно ту же картину по фолдам, что и ваша модель.

P.S. Другой вариант, и при этом даже не нужно ничего выкидывать из данных - это взять логарифм от таргета. Но при этом я не совсем уверен, как тогда трактовать скор. И нужно не забывать брать потом экспоненту от предсказания в конце всего процесса.

X = df[feature_columns]
y = np.log(df.salary_to)
model.fit(X, y)
print(r2_score(y, model.predict(X)))
print(cross_val_score(model, X, y, scoring='r2'))

Вывод:

0.9205070404891004
[0.45175607 0.46596345 0.48481266 0.4853811  0.4781465 ]

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

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

→ Ссылка