Здравствуйте, сегодня мы поговорим о мультилинейной регрессии и увидим лучший способ реализации нашей модели. Следующие темы будут дополнением к статье:
- Введение в множественную линейную регрессию
- Реализация на Python
Давайте начнем!
1. Введение в мультилинейную регрессию
В линейной регрессии мы использовали только один предиктор и обнаружили его связь с нашей переменной ответа. что, если нам доступно более одного предиктора, как мы найдем связь между ними и ответом y ?
Мы решаем эту проблему, используя многолинейную регрессию. Он использует несколько переменных-предикторов для прогнозированияy и является расширением простой линейной регрессии. В реальных сценариях вы столкнетесь с проблемами, связанными не только с простой линейной регрессией.
Он делает следующие предположения относительно данных:
- Линейные отношения между независимыми переменными и зависимой переменной. Обратите внимание, что в реальном мире это может быть не на 100% линейно.
- Многопараметрическая нормальность, данные должны поступать из нормального распределения, а остатки должны быть нормально распределены.
- Независимые наблюдения. Наблюдения должны быть независимыми друг от друга.
1.1 Расчеты
Уравнение для полилинейной регрессии приведено ниже:
Чтобы оценить значения бета, давайте отвлечемся от линейной алгебры и перейдем к матрицам. Предположим, у нас есть Y как матрица-столбец и X как матрица-строка, где:
Здесь j — количество предикторов, а n — размер выборки. Это даст вам оптимальные значения бета.
Теперь приступим к реализации.
2. Реализация на Python
Мы будем использовать набор данных Boston Housing, он уже доступен в sklearn, и я расскажу вам, как его получить. Тогда давайте начнем.
Что делать в первую очередь, библиотеки? Ага !
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error from sklearn.metrics import r2_score from sklearn.model_selection import train_test_split import seaborn as sns from sklearn.datasets import load_boston import scipy.stats as stats %matplotlib inline
Да, набор данных сейчас:
df=load_boston() x=df.data y=df.target
Здесь load_boston() возвращает json с предикторами в качестве данных и переменной ответа в качестве цели. Мы должны сначала преобразовать его во фрейм данных для простоты, так как x и y на данный момент являются пустыми массивами.
#Create Column Names and Pandas Data Frame X for our simplicfication cols=[] for i in range(13): cols.append(f'X{i}') print(f'The column Names are {cols}') X=pd.DataFrame(data=x, columns=cols) X.head()
Поздравляем, фрейм данных успешно создан, и мы также дали фиктивные имена нашим столбцам.
Теперь давайте посмотрим, верны ли наши предположения о данных, чтобы улучшить разработку модели, что приведет к выбору только важных функций.
2.1 Однофакторный анализ нормальности
Мы проверим асимметрию (меру симметрии) и эксцесс (меру, чтобы определить, являются ли данные тяжелыми или легкими хвостами) в данных. Обычно, если коэффициент асимметрии находится в диапазоне [-1,1], эти данные считаются быть нормально распределенным, а коэффициент эксцесса между [-3,3], что говорит о том, что данные не являются ни сглаженными, ни слишком склонными к выбросам.
skew_kurt=[] skewness=stats.skew(X) kurtosis=stats.kurtosis(X) for i,j in enumerate(X): skew_kurt.append([j,skewness[i],kurtosis[i]]) skew_kurt=np.array(skew_kurt) print(skew_kurt)
Отлично, мы завершили наш анализ одномерной нормальности, и теперь мы будем брать только те предикторы, которые находятся в указанных выше диапазонах, и, следовательно, мы отбросим X0, X1, X3. Х7, Х8 и Х11.
2.2 Многофакторный анализ нормальности
Мы делаем это, используя sns и строя парные графики для просмотра корреляции между предикторами, а также видим однофакторный анализ нормальности с использованием гистограмм. Давайте проверим это:
X.drop(['X0','X1','X3','X7','X8','X11'],inplace=True,axis=1) sns.pairplot(X)
Здесь вы можете увидеть графики распределения по диагоналям и корреляции между каждым предиктором. Дайте мне знать ваши выводы в комментариях.
Но чтобы увидеть корреляцию более подробно, мы создадим матрицу с переменной отклика,
X['target']=y X.corr()
Теперь это более ясно, а? Мы будем считать сильную корреляцию между двумя переменными, если коэффициент корреляции больше 0,7. Из приведенной выше матрицы ясно, что у нас есть сильная корреляция между:
Х2 и Х4
Х2 и Х9
Х4 и Х6
Также во всех переменных X5 лучше всего положительно коррелирует с нашей целевой переменной. Но мы хотим устранить корреляцию между предикторами, и поэтому мы удалим столбцы X4 и X9 вышеуказанных пар из X. Важно отметить, что если вы не можете решить, какой столбец переместить между сильно коррелированными, отбросьте столбец с более высокая дисперсия.
Теперь, когда мы выполнили тесты на нормальность, давайте проверим, имеют ли выбранные предикторы линейную связь с нашей переменной ответа или нет, и мы сделаем это с помощью Регрессионного анализа.
2.3 Регрессионный анализ
Это выполняется путем выполнения простой линейной регрессии; регрессируем нашу переменную ответа для каждой из переменных-предикторов и наблюдаем за взаимосвязью.
x=X.drop(['target','X9','X4'],axis=1) fig,ax=plt.subplots(nrows=3,ncols=2, figsize=(15,15)) index=[] t=0 for i in range(3): for j in range(2): index.append((i,j)) print(index) for i in x: x_train,x_test,y_train,y_test=train_test_split(x[[i]],y,train_size=0.7) lr=LinearRegression() model=lr.fit(x_train,y_train) y_train_pred=model.predict(x_train) # print(f'Train R2 Score{i}',r2_score(y_train,y_train_pred)) y_test_pred = model.predict(x_test) # print(f'Test Error for {i}',mean_squared_error(y_test,y_test_pred)) # print(f'Train R2 Score for {i}',r2_score(y_test,y_test_pred)) residuals=abs(y_test-y_test_pred) if(t<8): ax[index[t][0],index[t][1]].scatter(x[i],y,label='Original') ax[index[t][0],index[t][1]].plot(x_test,y_test_pred,label='Prediction') ax[index[t][0],index[t][1]].set_xlabel(f'{i}',fontsize=20) ax[index[t][0],index[t][1]].set_ylabel('target',fontsize=20) t+=1 plt.tight_layout()
В ячейке кода я также предоставил код для вычисления r2 и mse для каждой регрессии, если вы хотите попробовать.
Мы можем видеть линейную связь выше между предикторами и ответом, поэтому наше предположение также верно для данных.
2.4 Разработка модели
Итак, теперь, когда мы все готовы, давайте сделаем это.
Если бы вы следили за двумя моими последними статьями, вы бы знали, что пришло время разделить эти данные:
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7)
Отлично, давайте построим нашу модель сейчас:
lr=LinearRegression() model=lr.fit(x_train,y_train) y_train_pred=model.predict(x_train) print('Train Error',mean_squared_error(y_train,y_train_pred)) print('Train R2 Score',r2_score(y_train,y_train_pred)) y_test_pred = model.predict(x_test) print('Test Error',mean_squared_error(y_test,y_test_pred)) print('Train R2 Score',r2_score(y_test,y_test_pred)) residuals=abs(y_test-y_test_pred) sns.displot(residuals,bins=20)
Мы получили заметную оценку R² для этой модели, а? а наши остатки тоже лажают правильно но приемлемо. Попробуйте не использовать X2 в своей модели, и модель станет лучше.
Я новичок в машинном обучении, и если есть какие-либо ошибки или отзывы, которые вы хотите добавить, не стесняйтесь добавлять.