Привет!

Машинное обучение есть повсюду.

В этой статье я расскажу вам, как работает простая линейная регрессия с использованием Python. Давайте начнем.

Сначала импортируйте необходимые библиотеки Python 3

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

Получить набор данных

Мы собираемся использовать данные о высоте здания и истории, доступные по ссылке ниже.



Этот набор данных показывает взаимосвязь между количеством этажей в здании и его высотой? Спасибо некоторым статистикам, которые собрали данные о n = 60 зданиях, о которых сообщалось в Мировом альманахе 1994 года.

Сохраните данные на своем компьютере и запустите команду python, указанную ниже, для загрузки данных в Pandas Dataframe.

df = pd.read_csv (r ’введите здесь путь к файлу’, delimiter = ‘\ s +’)

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

df.head ()

Наша работа - предсказывать ИСТОРИИ строительства на основе его HGHT.

Исследование данных

Давайте изучим данные. Сначала убедитесь, что в нем нет наблюдений с нулевым значением.

df.isnull().sum()

Очень хорошо, нет значений наблюдения Nan. Мы готовы перейти к следующему этапу, который заключается в проверке типа распределения данных для целевой переменной STORIES. Для этого используйте библиотеку distplot от seaborn

sns.distplot(df['STORIES'])
plt.show()

Выглядит вполне нормальная раздача.

Давайте проверим, как соотносятся целевой HGHT и особенности ИСТОРИИ. Самый быстрый способ проверить это - нарисовать точечную диаграмму.

plt.scatter(df['STORIES'],df['HGHT'])
plt.show()

По мере того, как ИСТОРИИ увеличивается, HGHT увеличивается. Это простая линейная зависимость. Теперь мы можем приступить к предварительной обработке данных.

Предварительная обработка данных

Определите целевую переменную Y и зависимую переменную X. Значения добавляются в фрейм данных pandas, чтобы преобразовать его в массив np.

#Define X and Y
X=df[['HGHT']].values
y=df[['STORIES']].values

Теперь разделите данные на набор данных для обучения и тестирования. Как правило, мы вкладываем 80% в набор данных для обучения и 20% для тестирования.

#Split Data in Training and Testing set
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)
print(X_train.size,X_test.size,y_train.size,y_test.size)

Выбор модели

Основываясь на приведенном выше графике рассеяния, мы знаем, что будем использовать алгоритм LinearRegression, предоставляемый sklearn.linead_model. Пришло время предоставить набор обучающих данных для модели линейной регрессии, предоставляемой библиотекой sklearn.

from sklearn.linear_model import LinearRegression
linear_reg=LinearRegression()

#Train the model
linear_reg.fit(X_train,y_train)

Используя данные обучения, модель LinearRegression выведет точку пересечения по оси y (b0) и коэффициент (b1) в простой линии линейной регрессии y = b0 + b1X. Вы можете выполнить следующие команды, чтобы найти эти значения.

#print coefecients
print('Y Intercept ', linear_reg.intercept_)
print('Coefficient b1 ', linear_reg.coef_)

Вы должны получить результат ниже

Coefficient b1  [[0.07840212]]
Y Intercept  [-2.55635295]

Теперь протестируйте модель с тестовыми данными и спрогнозируйте y

#predict y based on test data
y_pred=linear_reg.predict(X_test)

#Train the model
linear_reg.fit(X_train,y_train)

#predict y based on test data
y_pred=linear_reg.predict(X_test)

Визуализация результатов

Очень хороший!

Давайте изобразим линию тренда линейной регрессии на точечной диаграмме.

plt.scatter(X_train,y_train)
plt.plot(X_test,y_pred,color="red")
plt.show()

Выглядит неплохо!

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

Сравнение прогнозируемой и реальной стоимости

df1 = pd.DataFrame({'Actual': y_test.flatten(), 'Predicted': y_pred.flatten()})
df1.head(15)

Вы должны получить результат ниже

Прогнозируемые значения выглядят близко к реальным значениям. Нарисуем гистограмму.

df2 = df1.head(15)
df2.plot(kind='bar',figsize=(16,10))
plt.grid(which='major', linestyle='-', linewidth='0.5', color='green')
plt.grid(which='minor', linestyle=':', linewidth='0.5', color='black')
plt.show()

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

Расчет показателей

from sklearn import metrics
from sklearn.metrics import r2_score
print('Mean Absolute Error:', metrics.mean_absolute_error(y_test, y_pred))  
print('Mean Squared Error:', metrics.mean_squared_error(y_test, y_pred))  
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
print('R2 Score ',r2_score(y_test,y_pred))

Вы должны попасть ниже

Mean Absolute Error: 4.168725387421264
Mean Squared Error: 31.05987790918931
Root Mean Squared Error: 5.5731389637429025
R2 Score  0.844975133654873

R2 Score 84% - это неплохо. Похоже, модель рабочая.

Это был простой набор данных, проанализированный с помощью простой линейной регрессии. Следите за Множественной линейной регрессией в следующем блоге.

Использованная литература: