Линейная регрессия обучается неправильно

Я пишу программу для оценки недвижимости для школьного проекта. Есть csv файл houses с характеристиками 2000 разных домов с сайта Domofond. Стоит задача написать нейросеть для определения состояния ремонта для домов (У всех домов в файле houses.csv состояние ремонта care уже определено, я определял его вручную, по изображениям), это столбец care, он может принимать значения от 1 до 5, это категориальный признак. Проблема в том, что почти половина домов имеет состояние ремонта 2 и после обучения, нейросеть, абсолютно для всех входных данных выдаёт значение 2. Вот код:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression


data = pd.read_csv('houses.csv')

num_features = ['district', 'cost', 'floors', 'material_id', 'in_area', 'out_area']

X_train, X_test, y_train, y_test = train_test_split(data.drop('care', axis=1), data['care'], test_size=0.2)


LogReg = LogisticRegression(solver='lbfgs', max_iter=1000).fit(X_train[num_features], y_train)

y_pred_train = LogReg.predict(X_train[num_features])
y_predict_proba_train = LogReg.predict_proba(X_train[num_features])[:,1]

print(LogReg.score(X_train[num_features], y_train))

y_pred = LogReg.predict(X_test[num_features])
y_predict_proba = LogReg.predict_proba(X_test[num_features])[:,1]

print(LogReg.score(X_test[num_features], y_test))

print(LogReg.predict([[3,620000,1,1,50,600]]))

А вот что он выводит:
0.48087110064743965
0.4611764705882353
[2]

И эту двойку он выводит независимо от того, какие значения были записаны в последнюю строчку кода. Прошу, подскажите, где я допустил ошибку? Вот csv файл: https://disk.yandex.ru/d/raynVp6RPOP5yA


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

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

Основная проблема в том, что при решении всех элементов датасета, отвечая 2, модель уже получает очень высокую точность возможно около 80-99% верных ответов. Следовательно зачем модели что-то придумывать, если можно просто отвечать 2. Проблема в данных, многие забывают, что данные это очень важная часть создания хорошей модели. Вам следует сделать так, чтобы все состояния ремонтов были в похожем объеме. У вас 5 состояний, следовательно в идеале каждое состояние должно занимать около 20% всех данных. Запомни лучше меньше данных, но качественнее, чем больше, но хуже. Этого должно вам хватить, для решения проблемы. Также полезно было бы сделать нормализацию входных значений. Также вам следует изменить вывод модели, как я показал. Для этого стоит уже использовать нейросеть. Можно просто однослойную. В sklearn такое есть.введите сюда описание изображения

→ Ссылка
Автор решения: CrazyElf
  1. Прежде, чем что-то предсказывать, нужно изучить данные. Вы этого не сделали. Нужно как минимум:
  • посмотреть численные корреляции между отдельными фичами и таргетом
  • посмотреть распределение фич
  • нарисовать визуальные корреляции фич и таргета, например, в виде kdeplot
  1. Если бы вы всё это сделали (а я не поленился и сделал), вы бы увидели, что:
  • корреляции у вас довольно слабые
  • часть фич у вас явно категориальная, а распределение непрерывных фич далеко от нормального
  • kdeplot показывает, что можно сказать с корреляциями вообще всё плохо, ну это и видно на скоре
  1. Чисто технически скор можно немного улучшить:
  • прологарифмировав и стандартизировав непрерывные фичи
  • закодировав категориальные фичи через OneHotEncoding

Но по большому счёту это почти что "мёртвому припарки", сигнала в ваших данных очень мало.

Если взять вместо линейной модели какую-то более сложную, хотя бы RandomForestClassifier, то можно не возиться с преобразованием фич, но быстро убедиться, что сложная модель легко переобучается на ваших данных, но при этом показывает всё тот же плохой скор на тестовой выборке. Это значит, что в ваших данных действительно "не за что зацепиться".

"А теперь - слайды!"

Cost в исходном виде

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

Cost после логарифмирования

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

kdeplot + regplot

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

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

Увеличте в вашем примере cost в 10 раз и вы увидите другое предсказание, как и предсказывает этот график. Но в целом это безобразие какое-то, а не корреляция, данные лежат отдельными полосами, а не одним красивым овалом.

→ Ссылка