Я пытаюсь построить прогнозную модель для цены квартиры. Я использую набор инструментов python scikit-learn. Я использую набор данных, имеющий общую площадь и местоположение квартиры, которые я преобразовал в фиктивные элементы. Итак, набор данных выглядит так: Затем я строю кривую обучения, чтобы увидеть, как работает модель. Я строю кривую обучения следующим образом:
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import learning_curve
model = LinearRegression()
training_sizes, training_scores, validation_scores = learning_curve(
estimator = model,
X = X_train,
y = y_train,
train_sizes = np.linspace(5, len(X_train) * 0.8, dtype = int),
cv = 5
)
line1, line2 = plt.plot(
training_sizes, training_scores.mean(axis = 1), 'g',
training_sizes, validation_scores.mean(axis = 1), 'r')
plt.legend((line1, line2), ('Training', 'Cross-validation'))
Изображение, которое я вижу, несколько сбивает с толку: Аномалии, которые я вижу здесь:
- Огромные ошибка набора перекрестной проверки
- Ошибка неуклонно уменьшается при увеличении числа обучающих примеров.
Это нормально?
Кривая обучения только для тренировочного набора также не такая плавная, но, по крайней мере, ошибка не так уж велика:
Также я пытался добавить, чтобы добавить полиномиальные особенности 2-й степени. Но это не заставило модель работать иначе. И поскольку у меня много категориальных особенностей (всего 106), это займет довольно много времени даже для полинома 2-й степени. Поэтому я не пытался получить более высокие степени.
Также я попытался построить модель, используя как можно более простую функцию стоимости и градиентного спуска, используя Octave. Результат со странной ошибкой был таким же.
Обновление: благодаря tolik я внес несколько поправок:
Подготовка данных: Категориальные данные независимы. Поэтому я не могу объединить их в одну особенность. Функции были масштабированы с использованием StandardScaler (). Спасибо за это.
Извлечение функций: После преобразования функций с помощью PCA я обнаружил, что одна новая функция объяснила коэффициент дисперсии более 99%. Хотя странно, я использовал только этот. Это также позволило увеличить степень полинома, хотя и не увеличило производительность.
Выбор модели: Я пробовал несколько разных моделей, но ни одна из них не работает лучше, чем LinearRegression. Интересная вещь - все модели работают хуже при полном наборе данных. Вероятно, это потому, что я отсортировал по цене, а более высокие цены довольно резко отличаются. Поэтому, когда я начинаю тренировать наборы на 1000 образцов и go по максимуму, я получаю эту картинку (почти для всех моделей):