Странная кривая обучения линейной регрессии - PullRequest
2 голосов
/ 13 марта 2020

Я пытаюсь построить прогнозную модель для цены квартиры. Я использую набор инструментов python scikit-learn. Я использую набор данных, имеющий общую площадь и местоположение квартиры, которые я преобразовал в фиктивные элементы. Итак, набор данных выглядит так: enter image description here Затем я строю кривую обучения, чтобы увидеть, как работает модель. Я строю кривую обучения следующим образом:

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'))

Изображение, которое я вижу, несколько сбивает с толку: Learning curve on training and cross-validation sets Аномалии, которые я вижу здесь:

  1. Огромные ошибка набора перекрестной проверки
  2. Ошибка неуклонно уменьшается при увеличении числа обучающих примеров.

Это нормально?

Кривая обучения только для тренировочного набора также не такая плавная, но, по крайней мере, ошибка не так уж велика: Learning curve on training set

Также я пытался добавить, чтобы добавить полиномиальные особенности 2-й степени. Но это не заставило модель работать иначе. И поскольку у меня много категориальных особенностей (всего 106), это займет довольно много времени даже для полинома 2-й степени. Поэтому я не пытался получить более высокие степени.

Также я попытался построить модель, используя как можно более простую функцию стоимости и градиентного спуска, используя Octave. Результат со странной ошибкой был таким же.

Обновление: благодаря tolik я внес несколько поправок:

Подготовка данных: Категориальные данные независимы. Поэтому я не могу объединить их в одну особенность. Функции были масштабированы с использованием StandardScaler (). Спасибо за это.

Извлечение функций: После преобразования функций с помощью PCA я обнаружил, что одна новая функция объяснила коэффициент дисперсии более 99%. Хотя странно, я использовал только этот. Это также позволило увеличить степень полинома, хотя и не увеличило производительность.

Выбор модели: Я пробовал несколько разных моделей, но ни одна из них не работает лучше, чем LinearRegression. Интересная вещь - все модели работают хуже при полном наборе данных. Вероятно, это потому, что я отсортировал по цене, а более высокие цены довольно резко отличаются. Поэтому, когда я начинаю тренировать наборы на 1000 образцов и go по максимуму, я получаю эту картинку (почти для всех моделей): enter image description here

1 Ответ

0 голосов
/ 18 марта 2020

Мое объяснение состоит из 3 этапов: подготовка данных, извлечение признаков и выбор модели.

Подготовка данных:

  • В этом наборе данных есть много Категориальных и Порядковых значений. Если в столбце есть несколько не связанных категорий, то это нормально. но если в столбце есть категории с порядком, например, «плохой», «нормальный», «хороший», вы можете преобразовать его в числовой как {хороший: 1, нормальный: 0,5, плохой: 0}.
  • Диапазоны значений: диапазоны значений для каждой функции отличаются от других, поэтому лучше всего нормализовать каждую особенность вдоль 0: 1.

Извлечение функции:

  • Ваша цель - максимизировать счет, поэтому, я думаю, вам все равно, какая функция важнее. Используйте PCA (имеет реализацию в библиотеке scikit-learn), этот алгоритм преобразует ваши векторы функций в различные функции, каждая из которых представляет собой линейную комбинацию других функций. Эти новые функции упорядочены по их объясненной дисперсии. Первые функции описывают данные лучше, чем последние. Вы выбираете первые функции, которые их explained_variance_ суммируют до 99%. Теперь у вас есть меньше функций.

Выбор модели: Вы действительно не знаете, что такое хорошая модель, потому что Нет теории бесплатного обеда , но в В этой задаче наилучшие результаты, которые не используют глубокое обучение, используйте их: XGBoost-Regressor, Random-Forest-Regressor, Ada-Boost.

Самое важное - это подготовка данных !!!

...