"Математика"

Понимание простой математики, лежащей в основе простой линейной регрессии

Не многие люди любят математику и по уважительным причинам. Мне это не очень нравится, но я стараюсь освежить основы основ: - Алгебра, линейные графики, триггер, предварительное исчисление и т. Д. Благодаря таким платформам, как Khan Academy… Изучение математики может быть увлекательным.

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

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

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

В этой статье мы сосредоточимся на простой линейной регрессии (SLR). SLR, пожалуй, самый интуитивно понятный и вездесущий алгоритм машинного обучения.

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

Обычно чем больше у вас релевантных данных, тем точнее ваша модель.

На изображении выше изображена модель простой линейной регрессии (SLR). Это называется простой линейной регрессией, потому что только одна функция или независимая переменная используется для прогнозирования данной метки или цели. В этом случае только Engine_Size используется для прогнозирования Co2_Emissions. Если бы у нас было несколько предикторов, мы бы назвали его множественной линейной регрессией (MLR).

Красная линия на изображении выше представляет модель. Это прямая линия, которая лучше всего соответствует данным. Таким образом, модель представляет собой математическое уравнение, которое пытается предсказать Co2_Emissions (зависимая переменная), учитывая Engine_size (независимая переменная).

Эта статья направлена ​​на то, чтобы лучше понять SLR, чтобы мы могли более комфортно разбираться в концепции и ее внутреннем устройстве. Это просто математика. Каждый может в этом разобраться. Один из эффективных способов начать - от известного к неизвестному ... Итак, давайте вернемся на секунду в среднюю школу.

y = mx + b

T Форма наклон-пересечение (y = mx + b) - это линейное уравнение, которое применяется непосредственно в форме к простой линейной регрессии.

y = значение по оси Y

m = Наклон или уклон линии (изменение y / изменение x)

x = значение по оси x

b = точка пересечения оси y или значение y, когда x равен 0

Линейное уравнение - это уравнение, в котором, если мы построим все значения для x и y, график будет идеально прямой линией на координатной плоскости.

T, поэтому в форме Наклон-пересечение указано, что для любой прямой на координатной плоскости значение y является произведением наклона линия m и значение x плюс точка пересечения оси Y линии б. См. Ссылку

y = mx + b

О, вернемся к простой линейной регрессии… Модель SLR идентична уравнению формы наклон-пересечение, которое мы видели выше, с той лишь разницей, что мы обозначаем метку или зависимую переменная, которую мы хотим спрогнозировать как y, и представляем наши веса или параметры модели как m и b, а наша независимая переменная или функция - x.

В простой линейной регрессии:

y = wx + b

Это то же самое, что:

y = b + wx

Это то же самое, что:

y = b0 + b1x1

Где: -

y = зависимая или целевая переменная. (также известная как прогноз или y_hat)

x = независимая переменная или предикторная переменная. (также известный как x1) .

b0 = точка пересечения по оси Y. (также известный как блок смещения) .

b1 = наклон или градиент линии регрессии

A и точно так же, как форма Slope-Intercept (y = mx + b), если независимая переменная ( x) и зависимая переменная (y) имеют линейную связь, независимо от того, является ли связь положительной или отрицательной, мы всегда можем предсказать y с учетом веса (b0 и b1).

Самые фундаментальные вопросы:

1. Как мы можем определить, имеет ли независимая переменная линейную связь с зависимой переменной, которую мы хотим предсказать?

B потому что в линейной регрессии (простой или множественной), должна быть линейная связь между независимой или предиктивной переменной (ами) и зависимая или целевая переменная.

см. эту ссылку на IBM @Coursera для получения более подробной информации.

2. Как выбрать лучшую линейку для нашей модели SLR? Другими словами, как мы можем найти идеальные значения для b0 и b1 , чтобы они давали наилучшую линию прогноза с учетом наших независимых и зависимых переменных?

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

Вы когда-нибудь слышали термин корреляция ’??

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

F или, например, если увеличение Engine_Size автомобиля, вероятно, приводит к некоторому увеличению выбросов Co2_Emissions, то они положительно коррелируют. Но если увеличение COMB_ (миль на галлон), вероятно, приводит к некоторому снижению C02_Emissions, тогда COMB_ (mpg) и C02_Emissions имеют отрицательную корреляцию. Если вероятной связи не существует, то статистики говорят, что между ними существует слабая корреляция.

C orrelation дает число от -1 до 1. Если число близко к -1, оно указывает на сильную отрицательную связь, если оно близко к 1, оно обозначает сильную положительную связь, а если оно просто около 0 это означает слабую связь между переменными.

см. ссылку для получения более подробной информации.

Если корреляция имеет абсолютное значение выше 0,6, это означает, что между переменными существует хорошая линейная связь.

Линейная связь может быть отрицательной (если корреляция отрицательная) или положительной.

Корреляция или корреляция Пирсона обозначается символом r.

Помните, что корреляция не подразумевает причинно-следственную связь…

Давайте поиграем с реальными данными…

W e будет использовать набор данных Рейтинг расхода топлива для продаж автомобилей в Канаде. (Исходные рейтинги расхода топлива за 2000–2014 гг.). Но, честно говоря, для регрессионного анализа будет достаточно любого популярного набора данных.

Т он набор данных был загружен на Google диск, поэтому давайте импортируем его в Google Colab.

Давайте посмотрим на сводное изображение набора данных, который содержит 14343 строки и 13 столбцов данных.

Understanding the Data
FuelConsumption.csv:
We have downloaded a fuel consumption dataset, 
FuelConsumption.csv, which contains model-specific fuel consumption ratings and estimated carbon dioxide emissions for new light-duty vehicles for retail sale in Canada.
- MODELYEAR e.g. 2014
- MAKE e.g. Acura
- MODEL e.g. ILX
- VEHICLE CLASS e.g. SUV
- ENGINE SIZE e.g. 4.7
- CYLINDERS e.g 6
- TRANSMISSION e.g. A6
- FUEL CONSUMPTION in CITY(L/100 km) e.g. 9.9
- FUEL CONSUMPTION in HWY (L/100 km) e.g. 8.9
- FUEL CONSUMPTION COMB (L/100 km) e.g. 9.2
- CO2 EMISSIONS (g/km) e.g. 182   --> low --> 0

F Сначала импортируем необходимые пакеты.

import matplotlib.pyplot as plt
import pandas as pd
import pylab as pl
import numpy as np
import seaborn as sns
%matplotlib inline
print('imports all done')

L et импортирует Gdrive, чтобы легко загружать файлы из Gdrive в Google Colab.

from google.colab import drive
drive.mount('/content/gdrive')

N ext, давайте прочитаем файл из Gdrive во фрейм данных Pandas

file = ''
with open('/content/gdrive/My Drive/Colab_Notebooks/IBM_cognitive_class_learning/Original_2000-2014_Fuel_Consumption_Ratings.csv') as f:
    file = f.read()
    
import sys
if sys.version_info[0] < 3: 
    from StringIO import StringIO
else:
    from io import StringIO
Data = StringIO(file)
fuel_consumption_df = pd.read_csv(Data, sep=",")
fuel_consumption_df.head()

L и для краткости переименовали несколько заголовков столбцов.

fuel_consumption_df.rename(columns={'FUEL_CONSUMPTION_CITY(L/100km)': 'FUEL_CONS_CITY(L/100km)', 'CO2_EMISSIONS(g/km)':'CO2_EMISSIONS'}, inplace=True)

Немного EDA, чтобы почувствовать набор данных ...

Подтвердим форму,

fuel_consumption_df.shape
# which prints out:
(14343, 13)

C типы данных столбца,

fuel_consumption_df.dtypes
# which prints out:

C Проверьте значения NaN.

fuel_consumption_df.isna().sum()

Корреляция

Для SLR мы хотим спрогнозировать Co2_Emissions (зависимая переменная), используя только одну функцию или переменную из набора данных. Давайте посмотрим на корреляцию переменных в нашем наборе данных, чтобы выбрать сильную независимую переменную.

corr_data = fuel_consumption_df.corr()
plt.figure(figsize=(10,4))
sns.set_style('ticks')
sns.heatmap(corr_data, annot=True)
plt.title('Correlation of variables in fuel_consumption_df Data set')
plt.show()

C Очевидно, переменные с наилучшими показателями корреляции с Co2_Emissions: - Fuel_Cons_City ( 0.92 ), COMB_ (миль на галлон) ( 0,92 ) и Engine_Size ( 0,83 ). Давайте визуализируем каждую взаимосвязь.

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

fig = plt.figure(figsize=(20, 5))
plt.suptitle('Scatter plots showing correlation between Top-Correlated-Variables and CO2_EMISSIONS', y=1.05, fontsize=16)
ax = fig.add_subplot(131)
ax1 = fig.add_subplot(132)
ax2 = fig.add_subplot(133)
# Subplot 1 scatter plot of ENGINE_SIZE and Co2_EMISSIONS
fuel_consumption_df.plot(kind='scatter', x='ENGINE_SIZE(L)', y='CO2_EMISSIONS', color='red', ax=ax)
ax.set_title('ENGINE_SIZE(L) and CO2_EMISSIONS')
ax.set_xlabel('ENGINE_SIZE(L)')
ax.set_ylabel('CO2_EMISSIONS')
# Subplot 2 scatter plot of FUEL_CONS_CITY(L/100km) and Co2_EMISSIONS
fuel_consumption_df.plot(kind='scatter', x='FUEL_CONS_CITY(L/100km)', y='CO2_EMISSIONS', color='navy', ax=ax1)
ax1.set_title('FUEL_CONS_CITY(L/100km) and CO2_EMISSIONS')
ax1.set_xlabel('FUEL_CONS_CITY(L/100km)')
ax1.set_ylabel('CO2_EMISSIONS')
# Subplot 3 scatter plot of COMB_(L/100km) and Co2_EMISSIONS
fuel_consumption_df.plot(kind='scatter', x='COMB_(L/100km)', y='CO2_EMISSIONS', color='green', ax=ax2)
ax2.set_title('COMB_(L/100km) and CO2_EMISSIONS')
ax2.set_xlabel('COMB_(L/100km)')
ax2.set_ylabel('CO2_EMISSIONS')
plt.show()

Все три переменные имеют сильную положительную линейную связь с выбросами CO2. Я выбираю ENGINE_SIZE (L) в качестве независимой переменной для этого упражнения. Вы можете выбрать любой из них.

Пришло время ответить на второй фундаментальный вопрос.

Лучшим значением для параметров b0 и b1 будет значение, которое минимизирует среднеквадратичную ошибку (MSE).

Что такое MSE?

Среднеквадратичная ошибка - это просто сумма квадратов разностей между каждым прогнозируемым значением и каждым фактическим значением, деленная на общее количество наблюдений.

Здесь наблюдение - это конкретная строка данных . пример - это просто пара заданного значения Engine_Size и соответствующего значения CO2_Emissions. Помните, что набор данных содержит 14343 примера / наблюдения.

Итак, как мы можем найти идеальные значения для b0 и b1, которые дали бы наименьшее значение MSE для нашей модели SLR?

C Эй ... Сначала мы находим значение b1 (наклон) , используя простую математическую формулу. Затем мы подставляем b1 в уравнение SLR (y = b0 + b1x1) , чтобы найти значение b0 (единица смещения перехватчика)… И все .

Формула наклона для расчета b1 (наклон) в простой линейной регрессии: -

куда:

n (общее количество наблюдений)

x (независимая переменная Engine Size, представляющая собой вектор столбца n * 1)

y (зависимая переменная Co2_Emissions, которая представляет собой вектор-столбец n * 1)

i = 1 (относится к первому наблюдению в наборе данных. Примечание: i изменяется от 1 до n)

xi (i -е наблюдение x )

x_bar (среднее или среднее значение x)

yi (i -ое наблюдение y )

y_bar (среднее или среднее значение y)

В итоге

Чтобы найти b1, разделим числитель формулы наклона на знаменатель.

Числитель - это просто сумма от i, равная от 1 до n для каждого значения xi, минус x_bar, умноженное на соответствующее значение yi, минус y_bar.

Знаменатель - это просто сумма от i, равная от 1 до n квадратов разностей между каждым значением xi и x_bar.

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

Сначала давайте определим наши переменные: - x и x_bar, а также y и y_bar.

# The predictor or independent variable x is Engine_Size
x = fuel_consumption_df['ENGINE_SIZE(L)']
# The mean or average of x is x_bar
x_bar = x.mean()
# The target or dependent variable y is Co2_Emissions
y = fuel_consumption_df['CO2_EMISSIONS']
# The mean or average of y is y_bar
y_bar = y.mean()

Затем давайте определим простую функцию, которая принимает переменные и возвращает b1.

def calc_slope(feature, target, x_bar, y_bar):
    """ takes two series objects- feature and target and their averages x_bar and y_bar
    performs the slope equation on each combine variables of feature and target,
    then finally returns a floating point number as theta one or b_one,
    Which is also known as the gradient or slope of the linear regression"""
    numerator = 0
    denominator = 0
    for i, j in zip(feature, target):
        numerator+= (i - x_bar) * (j - y_bar)
        denominator+= (i - x_bar)**2
    return round((numerator / denominator),8)

Давайте определим b1, вызвав функцию и передав ей переменные.

b1 = calc_slope(x, y, x_bar, y_bar)
b1

Это выведет b1 или наклон со значением 37,28016592.

Далее Давайте заменим значение b1 в уравнении SLR

R Помните, что уравнение SLR (y = b0 + bixi) идентично уравнению пересечения наклона (y = b + mx).

T, поэтому мы можем использовать любые известные нам соответствующие значения y и x. и подставьте наклон (b1) в уравнение SLR, чтобы получить y_intercept или b0.

Давайте использовать средние значения x_bar и y_bar.

y = b0 + b1x1

Следовательно:
y_bar = b0 + b1 (x_bar)

Решим для b0

Следовательно :
b0 + b1 (x_bar) = y_bar

Окончательное решение для b0, его можно записать как:
b0 = y_bar - b1 (x_bar)

Введите значения y_bar, b1 и x_bar , чтобы получить значение b0.

b0 = y_bar - (b1 * x_bar)
# Lets round b0 to 8 D.P as is the norm
b0 = round(b0, 8)
b0

Это выведет b0 или блок перехвата или смещения со значением 119.00800194.

В итоге

Решение С математической точки зрения мы видим, что идеальные значения для параметров модели b0 и b1, обеспечивающие наилучшее линейное соответствие нашей модели, следующие: 119 (b0) и 37,28 (b1).

Таким образом, наша математическая модель SLR: y_hat = 119 + 37,28 (x1)

T это означает, если мы хотим спрогнозировать выбросы Co2 для автомобиля с объемом двигателя 13,5 литров. Наш неизвестный прогноз: y_hat. Наш прогноз - x1, что составляет 13,5. Поэтому все, что нам нужно сделать, это подставить 13,5 в уравнение, чтобы найти y_hat.

y_hat = 119 + 37,28 * 13,5

y_hat = 622 (округлено до целого числа)

Давайте сравним нашу математическую модель с моделью Sklearn.

F Сначала импортируйте LinearRegression из Sklearn и создайте модель.

# first we import Linear regression model from sklearn
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

N ext, мы создаем модель линейной регрессии

model = LinearRegression()

N ext, мы определяем функцию (X) и целевой (Y) переменные в 2D-массивы

# The feature or independent variable 
X = fuel_consumption_df[['ENGINE_SIZE(L)']].values
# The target or dependent variable
Y = fuel_consumption_df[['CO2_EMISSIONS']].values

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

model.fit(X,Y)

F наконец, мы распечатываем идеальные значения b0 и b1 для Sklearn Модель

# Defining the model slope or b1
slope = model.coef_
# Defining the model intercept or b0
intercept = model.intercept_
print(slope,intercept)

T он распечатывает наклон 37.28046592 и точку пересечения 119.00800194, что в точности совпадает с нашей математической моделью.

B другие модели Maths и Sklearn имеют одинаковые параметры b0 и b1. , что подтверждает тот факт, что можно интуитивно решить SLR без библиотек, особенно если это небольшой / средний набор данных.

Наконец-то,

Оценка…

Как работают модели ?.

Давайте сравним RMSE для моделей Maths и Sklearn.

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

RMSE can be interpreted right on the same scale as the dependent or target variable and gives a good indicator of how well our model performs. Simply find the range of the target variable and compare the RMSE to it. The lower the RMSE as a percentage of the range, the better the model performance.

Давайте вычислим MSE и RMSE обеих моделей.

# First import mean_squared_error metric from sklearn
from sklearn.metrics import mean_squared_error
# for maths model
y_hat = round(x * b1 + b0)
MSE = mean_squared_error(y_hat, y)
RMSE = MSE**0.5
# for Sklearn model
prediction = model.predict(X)
model_MSE = mean_squared_error(prediction, Y)
model_RMSE = model_MSE**0.5

Затем мы распечатываем MSE и RMSE моделей Maths и Sklearn.

print('The Mathematical MSE is:', round(MSE))
print('The Scikit Learn MSE is:', np.round(model_MSE))
print('The Mathematical RMSE is:', round(RMSE))
print('The Scikit Learn RMSE is:', np.round(model_RMSE))

Приведенный выше код распечатывает следующее

The Mathematical MSE is: 1110.0 
The Scikit Learn MSE is: 1110.0 
The Mathematical RMSE is: 33.0 
The Scikit Learn RMSE is: 33.0

Обе модели имеют одинаковые MSE 1110 и RMSE 33.

Но что на самом деле означает RMSE 33… Что это может нам сказать?

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

F Сначала мы находим диапазон зависимой переменной (CO2_EMISSIONS)

y_range = fuel_consumption_df['CO2_EMISSIONS'].max() - fuel_consumption_df['CO2_EMISSIONS'].min()
y_range

Это дает диапазон 487

F наконец, мы делаем RMSE в процентах от диапазона

error_margin = (RMSE / y_range) * 100
error_margin

Это распечатает значение 6,84%.

Следовательно, при RMSE 33 наша ошибка модели находится в пределах погрешности 6,84% из диапазона (487) зависимой переменной (CO2_Emissions)… Это означает, что наша модель SLR, несмотря на ее простоту, работает неплохо.

Давайте посмотрим на график моделей Math и Sklearn.

Заключение

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

Продолжайте практиковаться.

Для дальнейшего изучения ознакомьтесь с этими бесплатными курсами на cognitiveclass.ai.

  1. Анализ данных с помощью Python
  2. Машинное обучение с питоном

Вы можете найти репозиторий кода для этой статьи на Github.

Ура !!

Обо мне:

Лоуренс - специалист по данным в Tech Layer, увлеченный справедливым и понятным искусственным интеллектом и наукой о данных. У меня есть сертификаты Data Science Professional и Advanced Data Science Professional от IBM. Я провел несколько проектов с использованием библиотек ML и DL, я люблю кодировать свои функции как можно больше, даже когда существующих библиотек предостаточно. Наконец, я никогда не прекращаю учиться и экспериментировать, и да, у меня есть несколько сертификатов по Data Science и AI, и я написал несколько очень рекомендуемых статей.

Не стесняйтесь найти меня на: -

Github

Linkedin

Twitter