Вступление

Я предполагаю, что вы хорошо разбираетесь в линейной регрессии. Если нет, то я написал простой и понятный пост с примером на python здесь. Прочтите, прежде чем продолжить.

Линейная регрессия делает определенные предположения о данных и дает прогнозы на их основе. Естественно, если мы не позаботимся об этих предположениях, линейная регрессия накажет нас плохой моделью (вы действительно не можете винить это!)
Мы возьмем набор данных и попытаемся уместить все предположения и проверить метрики и сравните их с метриками в том случае, если мы не работали над предположениями.
Итак, без лишних слов, давайте сразу перейдем к этому.

Линейная регрессия без предположений

Давайте возьмем пример известного набора данных о рекламе.

# Creating DataFrame out of Advertising.csv
df = pd.read_csv("Advertising.csv")
df.drop("Unnamed: 0", axis=1,inplace=True)
# Separating Independent and dependent variables
X=df.drop(['sales'],axis=1)
Y=df.sales
# Fit Linear Regression
lr = LinearRegression()
model=lr.fit(X,Y)
y_pred = model.predict(X)
print("R-squared: {0}".format(metrics.r2_score(Y,y_pred)))

Выход: R-квадрат: 0,8972106381789522

# Plot the Residuals vs Fitted Values
plt.scatter(ypred, (Y-ypred)) 
plt.xlabel("Fitted values") 
plt.ylabel("Residuals")

Мы можем видеть закономерность на графике остаточных и подобранных значений, что означает, что нелинейность данных не была хорошо отражена моделью.

Теперь давайте поработаем с предположениями и посмотрим, улучшится ли значение R-квадрат и график остаточных и подобранных значений.

Предположение 1:

Зависимая переменная и независимая переменная должны иметь линейную связь.

Как проверить?

Простой парный график фрейма данных может помочь нам увидеть, демонстрируют ли независимые переменные линейную связь с зависимой переменной.

Как исправить?

Чтобы исправить нелинейность, можно выполнить логарифмическое преобразование независимой переменной, log (X) или другие нелинейные преобразования, такие как √X или X².

Давайте построим парный график, чтобы проверить взаимосвязь между независимыми и зависимыми переменными.

sns.pairplot(df)

Мы можем видеть закономерность на графике остаточных и подобранных значений, что означает, что нелинейность данных не была хорошо отражена моделью.

Уравнение первого порядка не сможет полностью уловить нелинейность, что приведет к модели ниже номинальной. Чтобы возвести переменные в квадрат и соответствовать модели, мы будем использовать линейную регрессию с полиномиальными характеристиками.

from sklearn.preprocessing import PolynomialFeatures 
  
poly = PolynomialFeatures(degree = 2) 
X_poly = poly.fit_transform(X) 
  
poly.fit(X_poly, Y) 
X_poly = sm.add_constant(X_poly)
results = sm.OLS(Y,X_poly).fit()
print(results.summary())

Предположение 2:

Нет автокорреляции остатков.

Как проверить?

Используйте тест Дарбина-Ватсона.
DW = 2 будет здесь идеальным случаем (без автокорреляции)
0 ‹DW‹ 2 - ›положительная автокорреляция
2‹ DW ‹4 -› отрицательная автокорреляция
statsmodels 'linear Сводка регрессии дает нам значение DW среди других полезных сведений.

Как исправить?

  • Добавьте столбец, который отстает по отношению к независимой переменной
  • Центрировать переменную (вычесть все значения в столбце по ее среднему значению)

Как мы видим, Durbin-Watson: ~ 2 (взято из раздела results.summary () выше), что, по-видимому, очень близко к идеальному случаю. Итак, нам не нужно ничего делать

Предположение 3:

Никакой гетероскедастичности.

Как проверить?

График остаточных и подобранных значений может сказать, присутствует ли гетероскедастичность или нет.
Если график показывает образец формы воронки, то мы говорим, что гетероскедастичность присутствует.

Остаточные суммы - это не что иное, как разница между фактическими и установленными значениями

Как исправить?

Мы могли бы выполнить нелинейное преобразование зависимой переменной, например, log (Y) или √Y. Кроме того, вы можете использовать метод взвешенных наименьших квадратов для решения проблемы гетероскедастичности.

plt.subplots(figsize=(10,5))
plt.subplot(1,2,1)
plt.title("Before")
plt.scatter(ypred1, (Y-ypred1))
plt.xlabel("Fitted values")
plt.ylabel("Residuals")
plt.subplot(1,2,2)
plt.title("After")
plt.scatter(ypred2, (Y-ypred2))
plt.xlabel("Fitted values")
plt.ylabel("Residuals")

Здесь у нас есть графики остатков и подходящих значений для до и после работы над предположениями. Мы не видим воронкообразного паттерна в разделах «После» и «До», поэтому нет разнородности.

Предположение 4:

Нет идеальной мультиколлинеарности.

Я написал пост о мультиколлинеарности и о том, как ее исправить. Прочтите, если вы не знакомы с мультиколлинеарностью.

Как проверить?

В случае очень меньшего количества переменных можно использовать тепловую карту, но это не так возможно в случае большого количества столбцов.
Другой распространенный способ проверки - вычисление значений VIF (коэффициент инфляции дисперсии).
Если VIF = 1, очень меньшая мультиколлинеарность
VIF ‹5, умеренная мультиколлинеарность
VIF› 5, крайняя мультиколлинеарность (это то, чего мы должны избегать)

Как исправить?

Переменные с высокой мультиколлинеарностью можно полностью удалить, или, если вы можете узнать, какие 2 или более переменных имеют высокую корреляцию друг с другом, вы можете просто объединить эти переменные в одну. Убедитесь, что VIF ‹5.

# Function to calculate VIF
def calculate_vif(data):
    vif_df = pd.DataFrame(columns = ['Var', 'Vif'])
    x_var_names = data.columns
    for i in range(0, x_var_names.shape[0]):
        y = data[x_var_names[i]]
        x = data[x_var_names.drop([x_var_names[i]])]
        r_squared = sm.OLS(y,x).fit().rsquared
        vif = round(1/(1-r_squared),2)
        vif_df.loc[i] = [x_var_names[i], vif]
    return vif_df.sort_values(by = 'Vif', axis = 0, ascending=False, inplace=False)
X=df.drop(['sales'],axis=1)
calculate_vif(X)

Большой! у нас есть все VIFs ‹5. Если вы хотите знать, что делать в случае более высоких значений VIF, отметьте this.

Предположение 5:

Остатки должны быть распределены нормально.

Как проверить?

Используйте график распределения остатков и посмотрите, нормально ли он распределяется.

Как исправить?

Если остатки не распределены нормально, можно попробовать нелинейное преобразование зависимых или независимых переменных.

plt.subplots(figsize=(8,4))
plt.subplot(1,2,1)
plt.title("Before")
sns.distplot(Y-ypred1 , fit=norm);
plt.xlabel('Residuals')
plt.subplot(1,2,2)
plt.title("After")
sns.distplot(Y-ypred2 , fit=norm);
plt.xlabel('Residuals')

Черная линия на графике показывает, как должно выглядеть нормальное распределение, а синяя линия показывает текущее распределение.

Раздел «До» показывает небольшое отклонение от нормального распределения, тогда как раздел «После» почти соответствует нормальному распределению.

Другой способ определить то же самое - использовать график Q-Q (квантиль-квантиль).

plt.subplots(figsize=(8,4))
plt.subplot(1,2,1)
stats.probplot(Y-ypred1, plot=plt)
plt.subplot(1,2,2)
stats.probplot(Y-ypred2, plot=plt)
plt.show()

В разделе «До» вы увидите, что остаточные квантили не совсем следуют прямой линии, как должно, что означает, что распределение не является нормальным.
В то время как после работы над проверкой предположений мы можем увидеть Остаточные квантили следуют по прямой линии, что означает нормальное распределение.

Это знаменует конец проверки допущения. Теперь сравним показатели обеих моделей.

Сравнение

Давайте сравним две модели и посмотрим, есть ли улучшения.

До

R-квадрат: 0,8972

plt.title("Before")
plt.plot(Y,Y, color="red")
plt.scatter(ypred1, Y)
plt.xlabel("Fitted values")
plt.ylabel("Actuals")

После

R-квадрат: 0,987

plt.title("After")
plt.plot(Y,Y, color="red")
plt.scatter(ypred2, Y)
plt.xlabel("Fitted values")
plt.ylabel("Actuals")

Значение R-квадрат было улучшено, а также на графиках выше мы можем видеть фактические и подогнанные значения для проверки допущений «до» и «после».
Более 98% + подогнанные значения согласуются с фактическими значениями. Это означает, что модель способна улавливать и извлекать уроки из нелинейности набора данных.

Заключение

Теперь мы подтвердили, что все предположения линейной регрессии учтены, и можем с уверенностью сказать, что можем ожидать хороших результатов, если позаботимся о предположениях.

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

Вот и все для этого поста !.

Вот мой GitHub для Jupyter Notebooks по линейной регрессии. Найдите записную книжку, использованную для этого поста - › media-sales-linear-regression-verify-sizess.ipynb
Не стесняйтесь проверить это и предложить больше способов улучшить показатели здесь, в ответах.

Спасибо за чтение!

Соответствующие сообщения:





Первоначально опубликовано на https://machinelearningmind.com 27 октября 2019 г.