Регрессионный анализ относится к сфере статистических выводов. Рассмотрим следующее уравнение:

y ≈ β0 + β1x + e

Знак приблизительного равенства указывает на то, что существует приблизительная линейная зависимость между x и y. Термин "ошибка" e указывает на то, что эта модель не будет полностью отражать реальность посредством простой линейной зависимости. Задача обучения состоит в том, чтобы оценить бета-параметры следующим образом:

= β̂0 + β̂1x

Обратите внимание, что благодаря аппроксимации бета-версий теперь можно вычислять прогнозы для ранее невидимых значений зависимой переменной y.

Распаковываем это немного:

  1. Возьмите некоторый набор данных с вектором признаков x и (помеченным) целевым вектором y.
  2. Разбить набор данных на секции поезда / теста случайным образом
  3. Обучите модель и найдите оценки (β̂0, β̂1) истинного бета-пересечения и наклона
  4. Посмотрите, как ваша модель обобщается, используя ваши обученные бета-параметры для прогнозирования значений ŷ на удерживаемых тестовых данных (которые сами по себе являются вектором).
  5. Вычислите остаточные ошибки между векторами y и ŷ и определите, насколько хорошо / плохо вы сделали что-то вроде средней абсолютной ошибки или среднеквадратичной ошибки.

Графически остатки (члены ошибки) - это расстояние между каждым «истинным» y (синие точки) и оцененной красной моделью:

Обычные наименьшие квадраты

Как модель определяет, какие параметры β̂ использовать в качестве оценок? Обычные наименьшие квадраты (OLS) - это метод, в котором решение находит все коэффициенты β̂, которые минимизируют сумму квадратов остатков, т.е. минимизируют сумму этих разностей: (y - ŷ ) ² для всех значений y и ŷ в обучающих наблюдениях. Думайте о y и ŷ как о векторах-столбцах с записями, равными количеству ваших общих наблюдений.

Интересно то, что OLS обеспечивает лучшую линейную несмещенную оценку (СИНИЙ) для y при наборе классических допущений. Это немного сложно, но учтите, что:

  • «Лучший» = минимальная дисперсия оценки OLS истинных бета-версий (т. Е. ни одна другая линейная оценка не имеет меньшей дисперсии!)
  • «Непредвзятый» = ожидаемое значение оценочных значений бета-версии равняется истинным значениям бета-версии.

Ясно, что СИНИЙ оценщик желателен, но он может быть труднодостижимым, как вы увидите ниже.

Выше я написал y как функцию одной пояснительной функции и одного перехвата, но на практике это будет многомерной проблемой. Чтобы сделать это более конкретным: предположим, вы хотели спрогнозировать индекс цен на жилье в США и у вас есть следующие данные:

Здесь ваш столбец данных ousing_price_index - это помеченный вектор y, а 7 столбцов от sp500 до ross_domestic_product - 7 векторы признаков, которые также можно рассматривать как матрицу признаков X. Это означает, что мы оценим 7 различных бета-коэффициентов для каждой функции плюс одно значение точки пересечения.

Это предположения OLS:

  1. Идентификатор остаточного (ошибочного) распределения: среднее значение 0, постоянная дисперсия -
    a) ожидаемое значение каждого члена ошибки совокупности равно 0 ( напомним, мы оцениваем истинное y)!
    b) дисперсия каждого члена ошибки совокупности является константой σ² (также называемой гомоскедастичностью)
    c) Отсутствие автокорреляции - условия ошибки должны быть независимыми друг от друга (например, ежедневные цены на акции имеют автокорреляцию).
  2. Матрица характеристик X имеет полный ранг столбца - количество наблюдений больше, чем количество функций, и не может быть точной линейной связи между любыми двумя функциями (без мультиколлинеарности) . Без полного ранга столбца матрица X не обратима, и оценка МНК не может быть вычислена.
  3. Регрессия линейна по параметрам - зависимая y является линейной функцией параметров β, и все релевантные независимые переменные должны быть там, чтобы избежать опущено смещение переменной.
  4. Функции не зависят от условий ошибки - это также называется экзогенными независимыми переменными. Это означает, что ни одна из функций не может содержать пояснительную информацию по каждому термину ошибки.
  5. (Необязательно из-за CLT) Остатки (члены ошибки генеральной совокупности) должны быть нормально распределены - причина, по которой это часто указывается как необязательное или опускается, заключается в том, что для больших размеров выборки CLT утверждает, что оценки коэффициентов будут быть в основном нормальным в любом случае (в пределе), даже если распределение членов ошибки не является нормальным. Однако для небольшого числа наблюдений CLT, возможно, еще не приблизился к чему-то нормально распределенному. В моем случае ниже у меня была очень маленькая выборка.

Когда дела идут наперекосяк

В реальной жизни ваши данные вряд ли полностью соответствуют этим предположениям. В этом разделе я покажу пример, в котором мой базовый набор данных явно нарушает предположения № 5 и № 1b выше, и то, что я сделал, чтобы это исправить.

Мои данные получены из уровней финансирования онлайн-краудсорсинговых проектов и различных характеристик, таких как продолжительность кампании, тональность описания (через NLTK Vader), количество онлайн-фотографий и многое другое. Если просто запустить OLS для функций и цели (выделенные доллары), вот как выглядели остатки:

Красная линия указывает на идеальную нормальность, и ясно, что остатки не распределены нормально в нарушение предположения № 5. В моем случае это имело значение, поскольку у меня было менее 250 наблюдений, поэтому я не был уверен, что мои оценки коэффициентов будут асимптотически нормально распределены.

Далее представлен график, позволяющий проверить, равномерно ли распределены остатки по диапазону предикторов (предположение № 1b для равной дисперсии):

Очевидно, что остаточные ошибки неравномерно распределены по диапазону предикторов, поэтому и здесь у нас есть проблемы.

Преобразование данных

Вот парный график моего нетрансформированного набора данных с несколькими избранными проблемными функциями:

В этом случае заложено было моей зависимой y, а num_gift_options и photo_cnt были двумя выбранными функциями. Хотя это и не является гарантией, иногда бывает так, что преобразование функций или целевого объекта в «более нормальное» распределение может помочь с проблемными предположениями OLS, упомянутыми выше.

В этом случае заложенная сумма y требует преобразования в размер журнала. Его индивидуальные значения y составляют от 2 до 80000 долларов. В моем случае pledged находился в Pandas DataFrame, поэтому я преобразовал весь столбец с помощью функции журнала numpy:

['y_log'] = np.log(df['pledged'])
plt.ylabel('Count')
plt.xlabel('LOG of Pledged Amount')
plt.title('Dist. of Transformed Pledged Amount - Dependent Target')
plt.hist(df['y_log'])

Это привело к следующему преобразованию:

Одно небольшое отступление: когда вы преобразуете y в пространство журнала, вы неявно в конечном итоге интерпретируете изменения единиц измерения в X как интерпретацию процентного изменения в исходном не-логарифмическом y в конце. Ответ в этом потоке StackOverflow дает очень четкое объяснение того, почему это так, с помощью свойства производной естественного журнала.

Теперь о функциях. Я обнаружил, что преобразование Бокса-Кокса очень помогает в исправлении остаточной нормальности. Если вы посмотрите на центральную рамку на графике для пар выше, вы увидите непреобразованное распределение количества вариантов подарков. Вот как запустить преобразование Бокса-Кокса taht с помощью scipy.stats:

lamb = (
    stats.boxcox_normmax(df.num_gift_options, brack = (-1.9, 1.9))
)
print("Lambda:", lamb)
num_gift_options_t = (np.power(df.num_gift_options,lamb)-1) / lamb
df['num_gift_options_t'] = (
    (np.power(df.num_gift_options,lamb)-1) / lamb
)

Обратите внимание, что функция stats.boxcox_normax из scipy.stats найдет лучшую лямбду для использования в преобразовании мощности.

Вот как это выглядит после трансформации:

Если у рассматриваемого объекта есть нулевые или отрицательные значения, ни преобразование журнала, ни box-cox не будут работать. К счастью, преобразование мощности Йео-Джонсона решает этот случай явно. Удобно, что метод Йео-Джонсона используется по умолчанию в PowerTransformer sklearn.preprocessing:

pt = PowerTransformer()
pt.fit(df['photo_cnt'].values.reshape(-1,1))
df['photo_cnt_t'] = (
    pt.transform(df['photo_cnt'].values.reshape(-1,1)) 
)
plt.ylabel('Count')
plt.xlabel('Box Cox Transformed Negative Sentiment')
plt.title('Dist. of Transformed Negative Sentiment - Feature')
plt.hist(df['all_sentiment_neg_t'])

Вот как это выглядит после преобразования:

Хотя преобразованные объекты сами по себе не имеют нормального распределения, посмотрите, что мы получаем для наших графиков остаточного распределения и дисперсии после преобразования:

Это день и ночь с того места, где мы начали, и теперь мы можем сказать, что у нас по существу нормально распределенные остатки и постоянная дисперсия между остатками. Следовательно, эти допущения OLS, и мы можем быть более уверены в оценке BLUE.

Модельное тестирование и интерпретация

Это ни в коем случае не конечная точка анализа. В этом конкретном случае я закончил тем, что провел трехкратную перекрестную проверку, проверяя линейную регрессию, регрессию гребня и регрессию Хубера на проверочном разделе моих обучающих данных, а затем, наконец, протестировал победителя на сохраненных тестовых данных, чтобы посмотрим, является ли модель обобщенной. Общий смысл состоит в том, что лучше всего убедиться, что вы выполнили предположения OLS, прежде чем переходить к полному циклу обучения / проверки / тестирования на ряде моделей для случая регрессии.

Одно замечание: когда вы трансформируете объект, вы теряете возможность интерпретировать влияние коэффициентов на y в конце. Например, я не преобразовывал функцию длины проекта в этом анализе, и в конце я смог сказать, что увеличение длины проекта на единицу (+1 день) привело к уменьшению суммы финансирования на 11%.

Поскольку я использовал эти преобразования для подсчета фотографий и количества функций подарков, я не могу сделать то же утверждение, учитывая увеличение единицы измерения X, поскольку прогнозы коэффициентов относятся к преобразованию. Таким образом, у преобразований есть обратная сторона, но стоит знать, что вы получаете СИНИЙ оценщик через OLS.