Привет!
Машинное обучение есть повсюду.
В этой статье я расскажу вам, как работает простая линейная регрессия с использованием 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% - это неплохо. Похоже, модель рабочая.
Это был простой набор данных, проанализированный с помощью простой линейной регрессии. Следите за Множественной линейной регрессией в следующем блоге.
Использованная литература: