Выбрать страницу

Регрессия в Python

Что такое линейная регрессия?

Это способ построить модель системы из реального мира в мир статистики. В нашем примере в системе мы хотим отразить взаимосвязь между заработной платой и опытом. Формула Salary = b0 + b1 X experience это и есть модель. Где b0 это стартовая точка при отсутсвии опыта — 30 тысяч условных единиц. B1 X experience коэффициент на опыт, который помогает ответить на вопрос на сколько увеличится заработная плата при увеличении опыта на 1 год.

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

Как работает линейная регрессия?

На рисунке вы видите Y это расчтеное значение модели(красный цвет) и Y с крышечкой ( зеленый цвет) — фактическое значение. В задаче линейной регрессии мы подбираем таку модель, чтобы сумма квадратов разницы была минимальной.

Строим линейную регрессию в Python.

Это рабочий код, его можно смело копировать и подставлять нужные вам значения вместо тестоых данных.
Скачать файл с набором данных можно по ссылке > https://drive.google.com/open?id=0Bx1AibZ4BcSAMFNSOGVTemdBeWc

# Загружаем библиотеки
import numpy as np # работа с векторами
import matplotlib.pyplot as plt # рисовать графики
import pandas as pd # для работы с матрицами
import os as os #для смены директории


# Установим директорию для загрузки данных для модели
os.chdir('C:/папка с файлом')

# загружаем данные
dataset = pd.read_csv('Salary_Data.csv') 



# создаем Y переменную = заработные платы и Х перменые, в нашем случае только 
# один набор = опыт
# по другому Y называют зависимой переменной а Х контролирующей
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, 1].values

# Разделим данные на тренировочную и тестовую выборку
# random_state = позволяет получать всегда одинаковое разбиение выборки
# X пишем сбольшой буквы это вектор.
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1/3, random_state = 0)


# Тренировка линейной регрессии на тренировочном наборе данных
from sklearn.linear_model import LinearRegression

#Создаем регрессора как метод, не указываем дополнительные параметры
regressor = LinearRegression()
#Тренеруем модель на тренировочных данных. 
regressor.fit(X_train,y_train) # ваша первая модель машинного обучения!

#Прогнозируем результаты тестовой выборки
#Разница между y_pred и y_test в том, что y_pred это прогнозные значения
#Теперь мы можем сравнить их с тестовыми значениями
y_pred = regressor.predict(X_test)

#Визуализация результатов тестового набор данных
plt.scatter(X_train,y_train,color = 'red')
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Заработная плата vs Опыт(Тренировочные данные)')
plt.xlabel('Опыт в годах')
plt.ylabel("Заработная плата")
#plt.show() #команда для отображения графика в python. Убрать комментарий вначале строки, чтобы увидеть график.
#plt.savefig('graph.png',bbox_inches='tight') # технический трюк


#Визуализация результатов тестового набор данных
plt.scatter(X_test,y_test,color = 'red')
#линию регресии не меняем. Мы получим тестовые и оценим как линия регрессии
# описывает тестовый набор
plt.plot(X_train, regressor.predict(X_train), color = 'blue')
plt.title('Заработная плата vs Опыт(Тренировочные данные)')
plt.xlabel('Опыт в годах')
plt.ylabel("Заработная плата")
plt.show

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

Результат тренировочной выборки

Резульаты тестовой выборки. Как посчитать точность модели? В простом варианте, сравнить насколько далеко красные точки находятся от синей линии — чем дальше, тем выше разброс ошибки.

Результат тестовой выборки

Регрессия в R

# Загружаем данные
dataset = read.csv(":/папка с файлом/Salary_Data.csv",header = T) # Разделим данные на тренировочную и тестовую выборку # Следует установить пакет > install.packages('caTools') library(caTools) set.seed(123) split = sample.split(dataset$Salary, SplitRatio = 2/3) training_set = subset(dataset, split == TRUE) test_set = subset(dataset, split == FALSE) # Обучение простой линейной регрессии regressor = lm(formula = Salary ~ YearsExperience, data = training_set) # Чтобы получить информацию по модели введите summary(regressor) # Применяем полученную модель для прогноза на тестовых данных y_pred = predict(regressor, newdata = test_set) #Визуализация результатов прогноза на тренировочных данных данных # install.packages("gggplo2") library(ggplot2) 
## Warning: package 'ggplot2' was built under R version 3.4.2
ggplot()+
  geom_point(aes(x = training_set$YearsExperience, y = training_set$Salary),# визуализируем тренировочный набор данных
             colour = 'red') +
  geom_line(aes(x = training_set$YearsExperience, y = predict(regressor, newdata = training_set)),
            colour = 'blue') +
  ggtitle('Прогноз заработной платы ( Тренировочные данные)') +
  xlab("Опыт работы") +
  ylab("Заработная плата")

plot of chunk unnamed-chunk-2

#Визуализация результатов прогноза на тестовых данных
ggplot()+
  geom_point(aes(x = test_set$YearsExperience, y = test_set$Salary),# визуализируем тренировочный набор данных
             colour = 'red') +
  geom_line(aes(x = training_set$YearsExperience, y = predict(regressor, newdata = training_set)),#не меняем формулу линейной регрессии. Данные оставляем от тестовой выборки, иначе наша формула будет уже на тестовых данных.
            colour = 'blue') +
  ggtitle('Прогноз заработной платы (Тестовые данные)') +
  xlab("Опыт работы") +
  ylab("Заработная плата")

plot of chunk unnamed-chunk-2

# Feature Scaling
# training_set = scale(training_set)
# test_set = scale(test_set)

Заключение

Идеально если вы научились

  • Загружать данные
  • Строить линейную регрессию с одним факторо
  • Вывели график в R или Python
  • В R смогли вывести summary для модели
Share This