www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Руководство для начинающих по линейной регрессии в Python с Scikit-Learn

Дата публикации Feb 25, 2019

источник

Существует два типа контролируемых алгоритмов машинного обучения: регрессия и классификация. Первый прогнозирует непрерывные выходные значения, а второй - дискретные выходные. Например, прогнозирование цены дома в долларах является проблемой регрессии, тогда как прогнозирование того, является ли опухоль злокачественной или доброкачественной, является проблемой классификации.

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

Теория линейной регрессии
Термин «линейность» в алгебре относится к линейной зависимости между двумя или более переменными. Если мы рисуем это соотношение в двумерном пространстве (между двумя переменными), мы получаем прямую линию.

Линейная регрессия выполняет задачу прогнозирования значения зависимой переменной (y) на основе заданной независимой переменной (x). Таким образом, этот метод регрессии обнаруживает линейную зависимость между x (вход) и y (выход). Следовательно, имя является линейной регрессией. Если мы построим независимую переменную (x) на оси x и зависимую переменную (y) на оси y, линейная регрессия даст нам прямую линию, которая наилучшим образом соответствует точкам данных, как показано на рисунке ниже.

Мы знаем, что уравнение прямой в основном:

источник

Уравнение вышеупомянутой линии:

Y = mx + b

Где b - точка пересечения, а m - наклон линии. В общем, алгоритм линейной регрессии дает нам наиболее оптимальное значение для пересечения и наклона (в двух измерениях). Переменные y и x остаются неизменными, поскольку они являются характеристиками данных и не могут быть изменены. Значения, которые мы можем контролировать - это точка пересечения (b) и наклон (m). В зависимости от значений точки пересечения и наклона может быть несколько прямых линий. По сути, алгоритм линейной регрессии вписывается в несколько строк в точках данных и возвращает строку, которая дает наименьшую ошибку.

Эта же концепция может быть распространена на случаи, когда существует более двух переменных. Это называется множественной линейной регрессией. Например, рассмотрим сценарий, в котором вы должны прогнозировать цену дома на основе его площади, количества спален, среднего дохода людей в этом районе, возраста дома и т. Д. В этом случае зависимая переменная (целевая переменная) зависит от нескольких независимых переменных. Модель регрессии с участием нескольких переменных может быть представлена ​​как:

y = b0 + m1b1 + m2b2 + m3b3 +…… mnbn

Это уравнениегиперплоскость, Помните, что модель линейной регрессии в двух измерениях - это прямая линия; в трех измерениях это плоскость, а в более чем трех измерениях - гиперплоскость.

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


Простая линейная регрессия

Линейная регрессия

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

Вы можете скачать набор данных изВот,

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

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

Давайте начнем кодирование:

Импортируйте все необходимые библиотеки:

import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
import seaborn as seabornInstance
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
%matplotlib inline

Следующая команда импортирует набор данных CSV, используя pandas:

dataset = pd.read_csv('/Users/nageshsinghchauhan/Documents/projects/ML/ML_BLOG_LInearRegression/Weather.csv')

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

dataset.shape

Вы должны получить вывод в виде (119040, 31), что означает, что данные содержат 119040 строк и 31 столбец.

Чтобы увидеть статистические данные набора данных, мы можем использоватьdescribe():

dataset.describe()
статистический вид набора данных

И, наконец, давайте нарисуем наши точки данных на двумерном графике, чтобы увидеть наш набор данных, и посмотрим, сможем ли мы вручную найти какую-либо связь между данными, используя следующий скрипт:

dataset.plot(x='MinTemp', y='MaxTemp', style='o')  
plt.title('MinTemp vs MaxTemp')
plt.xlabel('MinTemp')
plt.ylabel('MaxTemp')
plt.show()

Мы взяли MinTemp и MaxTemp для нашего анализа. Ниже представлен двухмерный график между MinTemp и MaxTemp.

Давайте проверим среднюю максимальную температуру и, как только мы построим ее, мы увидим, что средняя максимальная температура составляет от 25 до 35.

plt.figure(figsize=(15,10))
plt.tight_layout()
seabornInstance.distplot(dataset['MaxTemp'])
Средняя максимальная температура от 25 до 35.

Наш следующий шаг - разделить данные на «атрибуты» и «метки».
Атрибуты являются независимыми переменными, в то время как метки являются зависимыми переменными, значения которых должны быть предсказаны. В нашем наборе данных у нас есть только два столбца. Мы хотим предсказать MaxTemp в зависимости от записанного MinTemp. Поэтому наш набор атрибутов будет состоять из столбца «MinTemp», который хранится в переменной X, а метка будет столбцом «MaxTemp», который хранится в переменной y.

X = dataset['MinTemp'].values.reshape(-1,1)
y = dataset['MaxTemp'].values.reshape(-1,1)

Затем мы разделяем 80% данных на обучающий набор, а 20% данных - на набор тестов, используя приведенный ниже код.
Переменная test_size - это то место, где мы на самом деле указываем пропорцию тестового набора.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Наконец, после разделения данных на обучающие и тестовые наборы, настало время обучить наш алгоритм. Для этого нам нужно импортировать класс LinearRegression, создать его экземпляр и вызватьfit()метод вместе с нашими данными обучения.

regressor = LinearRegression()  
regressor.fit(X_train, y_train) #training the algorithm

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

#To retrieve the intercept:
print(regressor.intercept_)#For retrieving the slope:
print(regressor.coef_)

Результат должен быть примерно 10,66185201 и
0,92033997 соответственно.

Это означает, что на каждую единицу изменения минимальной температуры изменение максимальной температуры составляет около 0,92%.

Теперь, когда мы обучили наш алгоритм, пришло время сделать некоторые прогнозы. Для этого мы будем использовать наши тестовые данные и посмотрим, насколько точно наш алгоритм предсказывает процентную оценку. Чтобы сделать прогноз на тестовых данных, выполните следующий скрипт:

y_pred = regressor.predict(X_test)

Теперь сравните фактические выходные значения дляX_testс прогнозируемыми значениями выполните следующий скрипт:

df = pd.DataFrame({'Actual': y_test.flatten(), 'Predicted': y_pred.flatten()})
df
сравнение фактической и прогнозируемой стоимости

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

Примечание. Поскольку количество записей огромно, для представления я беру всего 25 записей.

df1 = df.head(25)
df1.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()
Гистограмма, показывающая сравнение фактических и прогнозируемых значений.

Хотя наша модель не очень точна, прогнозируемые проценты близки к фактическим.

Давайте построим нашу прямую линию с тестовыми данными:

plt.scatter(X_test, y_test,  color='gray')
plt.plot(X_test, y_pred, color='red', linewidth=2)
plt.show()
прогноз против данных испытаний

Прямая линия на графике выше показывает, что наш алгоритм корректен.

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

  1. Средняя абсолютная ошибка(MAE) является средним значением абсолютного значения ошибок. Он рассчитывается как:
Средняя абсолютная ошибка

2. Средняя квадратическая ошибка(MSE) является средним квадратом ошибок и рассчитывается как:

Средняя квадратическая ошибка

3. Среднеквадратическая ошибка(RMSE) - квадратный корень из среднего квадрата ошибок:

Среднеквадратическая ошибка

К счастью, нам не нужно выполнять эти вычисления вручную. Библиотека Scikit-Learn поставляется с готовыми функциями, которые можно использовать, чтобы узнать эти значения для нас.

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

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)))

Вы должны получить вывод, как это (но, вероятно, немного отличается):

('Mean Absolute Error:', 3.19932917837853)
('Mean Squared Error:', 17.631568097568447)
('Root Mean Squared Error:', 4.198996082109204)

Вы можете видеть, что значение среднеквадратичной ошибки составляет 4,19, что составляет более 10% от среднего значения процентов от всей температуры, то есть 22,41. Это означает, что наш алгоритм был не очень точным, но все еще может делать достаточно хорошие прогнозы.


Множественная линейная регрессия

источник

Мы только что выполнили линейную регрессию в предыдущем разделе с двумя переменными. Почти все реальные проблемы, с которыми вы столкнетесь, будут иметь более двух переменных. Линейная регрессия с участием нескольких переменных называется «множественной линейной регрессией» или многомерной линейной регрессией. Шаги для выполнения множественной линейной регрессии почти аналогичны шагам простой линейной регрессии. Разница заключается в оценке. Вы можете использовать его, чтобы узнать, какой фактор оказывает наибольшее влияние на прогнозируемый результат и как различные переменные связаны друг с другом.

В этом разделе я скачал набор данных о качестве красного вина. Набор данных, связанных с красными вариантами португальского «Виньо Верде" вино. Из-за проблем конфиденциальности и логистики доступны только физико-химические (входные) и сенсорные (выходные) переменные (например, нет данных о типах винограда, марке вина, цене продажи вина и т. Д.).

Вы можете скачать набор данных изВот,

Мы будем учитывать различные входные характеристики, такие как фиксированная кислотность, летучая кислотность, лимонная кислота, остаточный сахар, хлориды, свободный диоксид серы, общий диоксид серы, плотность, pH, сульфаты, спирт. На основании этих особенностей мы прогнозируем качество вина

Теперь давайте начнем наше кодирование:

импортировать все необходимые библиотеки:

import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
import seaborn as seabornInstance
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics
%matplotlib inline

Следующая команда импортирует набор данных из файла, который вы скачали по ссылке выше:

dataset = pd.read_csv('/Users/nageshsinghchauhan/Documents/projects/ML/ML_BLOG_LInearRegression/winequality.csv')

Давайте немного изучим данные, проверив количество строк и столбцов в них.

dataset.shape

Это даст (1599, 12) в качестве вывода, что означает, что наш набор данных имеет 1599 строк и 12 столбцов.

Чтобы увидеть статистические данные набора данных, мы можем использоватьdescribe():

dataset.describe()

Давайте немного очистим наши данные, поэтому сначала проверим, какие столбцы содержат значения NaN:

dataset.isnull().any()

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

dataset = dataset.fillna(method='ffill')

Наш следующий шаг - разделить данные на «атрибуты» и «метки». Переменная X содержит все атрибуты / функции, а переменная y содержит метки.

X = dataset[['fixed acidity', 'volatile acidity', 'citric acid', 'residual sugar', 'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density', 'pH', 'sulphates','alcohol']].valuesy = dataset['quality'].values

Давайте проверим среднее значение столбца «качество».

plt.figure(figsize=(15,10))
plt.tight_layout()
seabornInstance.distplot(dataset['quality'])
Среднее значение качества вина.

Как мы видим, большую часть времени это значение равно 5 или 6.

Затем мы разделяем 80% данных на обучающий набор, а 20% данных - на набор тестов, используя приведенный ниже код.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

Теперь давайте обучим нашу модель.

regressor = LinearRegression()  
regressor.fit(X_train, y_train)

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

coeff_df = pd.DataFrame(regressor.coef_, X.columns, columns=['Coefficient'])  
coeff_df

это должно дать вывод что-то вроде:

Это означает, что при увеличении плотности на единицу качество вина снижается на 31,51 единиц. Аналогичным образом, снижение показателя «Хлориды» приводит к повышению качества вина на 1,87 единиц. Мы видим, что остальные функции очень мало влияют на качество вина.

Теперь давайте сделаем прогноз на тестовых данных.

y_pred = regressor.predict(X_test)

Проверьте разницу между фактическим значением и прогнозируемым значением.

df = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})df1 = df.head(25)
Сравнение фактической и прогнозируемой стоимости

Теперь давайте построим сравнение фактических и прогнозируемых значений.

df1.plot(kind='bar',figsize=(10,8))
plt.grid(which='major', linestyle='-', linewidth='0.5', color='green')
plt.grid(which='minor', linestyle=':', linewidth='0.5', color='black')
plt.show()
Гистограмма, показывающая разницу между фактическим и прогнозируемым значением

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

Последний шаг - оценить производительность алгоритма. Мы сделаем это, найдя значения дляДЕД,MSE, а такжеRMSE, Выполните следующий скрипт:

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)))

Вывод выглядит так:

('Mean Absolute Error:', 0.46963309286611077)
('Mean Squared Error:', 0.38447119782012446)
('Root Mean Squared Error:', 0.6200574149384268)

Вы можете видеть, что значение среднеквадратичной ошибки составляет 0,62, что немного больше, чем 10% от среднего значения, которое составляет 5,63. Это означает, что наш алгоритм был не очень точным, но все еще может делать достаточно хорошие прогнозы.

Есть много факторов, которые могли способствовать этой неточности, например:

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

Вывод

В этой статье мы изучили самые основные алгоритмы машинного обучения, то есть линейную регрессию. Мы реализовали простую линейную регрессию и множественную линейную регрессию с помощью библиотеки машинного обучения Scikit-Learn.

Надеюсь, вам, ребята, понравилось чтение. Дайте мне знать ваши сомнения / предложения в разделе комментариев.

Спасибо за чтение.

Вы также можете связаться со мной вLinkedIn,

Счастливого обучения !!!

Эта статья также опубликована наKDnuggets,

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map