python Scikit-learn как правильно смоделировать задачу классификации (Random forest)
Есть такой dataframe:
| index | razryad | age | salary |
|---|---|---|---|
| 1 | 2 | 22 | 30000 |
| 2 | 3 | 19 | 36000 |
| 3 | 4 | 30 | 40000 |
| 4 | 5 | 25 | 47000 |
Коротко: таблица содержит уровень зарплаты, где есть зависимость чем выше разряд тем выше зарплата. У меня же почему то вес признака "age" решает большую роль при предсказании, чем признак разряд. Проблема звучит так при вводе новых данных (разряд = 4, возраст = 17) выдает предсказание равной = 36000, хотя по идее тут есть зависимость от разряда, но модель почему то считает вес "age" больше "razryad" ??? Или возможно я не корректно строю модель либо нужно самому увеличить вес "razryad" ? хотя по идее модель сама должна найти такую зависимость от разряда
import pandas as pd
import numpy as np
import time
from sklearn.ensemble import RandomForestClassifier
df_json = pd.read_json('dataframes//test_data.json')
X_test = df_json[['razryad', 'age']].reset_index(drop=True) #
y_test = df_json['salary'] #
model = RandomForestClassifier() # выбираем модель обучения: Случайный лес класссификация
model.fit(X_test, y_test) # обучаем модель
# подаем новые данные для выдачи прогноза ожидаемой зарплаты
example_test = {'razryad': [4], 'age': [11]}
example_df_test = pd.DataFrame(example_test)
res = model.predict(example_df_test) # предсказывает данные
print(f"\nПредсказанные данные:\n{res=}")
Ответы (1 шт):
Во-первых модели для классификации не умеют интерполировать. Они выдают одно из значений, которые есть в обучающей выборке. И вы ещё и даёте на вход значение age, которого не было в обучении. При этом модель вы взяли слишком сложную, склонную к переобучению. Если взять простую модель, причём регрессии, а не классификации, то всё будет гораздо логичнее.
from sklearn.linear_model import LinearRegression
model = LinearRegression()
Вывод:
Предсказанные данные (я округляю всё до целых значений здесь и далее):
43434
Коэффициенты модели:
print(int(model.intercept_), list(map(int,model.coef_)))
Вывод:
21956 [5847, -173]
Т.е. формула расчёта у линейной модели получилась такая:
salary = 21956 + razryad * 5847 - 173 * age
Т.е. чем меньше возраст, тем зарплата больше. Таковы ваши данные, если вы на них внимательно посмотрите, переходы между разрядами 2 и 3 и 4 и 5 сопровождаются именно падением возраста.
