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

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

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

Работа линейной регрессии

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

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

Как мы находим эту линию / взаимосвязь между нашими данными?

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

  • Представление гипотез
  • Функция затрат
  • Градиентный спуск

Представление гипотез

Представление гипотез - это уравнение нашей линии, которое мы используем для представления взаимосвязи между заданными данными.

Поначалу это уравнение может сбивать с толку, и некоторым может быть трудно представить его как уравнение линии. Но если мы рассмотрим уравнение линии, то это y = mx + c.

В уравнении линии m соответствует наклону, x - переменная с некоторыми значение, а c - константа.
В представлении гипотез θ1 соответствует наклону , x - это переменная с некоторым значением, а θ0 - константа.

Итак, здесь θ0 и θ1 являются параметрами, а их начальное значение равно вручную установленный нами, но затем он будет изменен, чтобы строка идеально отображалась в данных.

Функция стоимости

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

Сначала я покажу вам математическую версию нашей функции стоимости, а затем объясню ее ниже.

Важные примечания:

  • m представляет общее количество обучающих примеров.
  • x (i) представляет входную переменную (x (1) означает первый обучающий пример)
  • y (i) представляет собой выходную переменную.

Итак, в этой функции стоимости термин (hθ (x) - y) вычитает прогнозируемое значение (x) на наше заданное значение (y), и таким образом мы находим ошибку (расстояние) между нашей линией и заданные точки. Затем мы берем квадрат нашего ответа в случае, если полученное значение было отрицательным числом. После этого мы суммируем все наши обучающие примеры и умножаем их на 1 / 2m, чтобы получить означает нашу ошибку обучающих примеров.

Проработка 1/2 м (необязательно)

Теперь мы видим, что все это уравнение умножается на 1 / 2m. m здесь означает среднее / среднее нашей ошибки, а 2 здесь, потому что, когда мы берем производную функции стоимости, которая используется при обновлении параметров во время градиентного спуска, что 2 в степени отменяется с помощью множителя 1/2, поэтому вывод более четкий.

Градиентный спуск

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

Итак, теперь мы успешно реализовали функцию стоимости и получили некоторую стоимость (ошибка) ›› 0. Чтобы уменьшить эту стоимость (ошибку), мы применяем градиентный спуск, где мы обновляем значения параметров θ0 & θ1 в этом случае и продолжает обновлять их до тех пор, пока наша стоимость (ошибка) почти не станет равной 0. Итак, математическое уравнение для градиентного спуска выглядит следующим образом

Важные примечания:

  • m представляет общее количество обучающих примеров.
  • α представляет собой альфа, также называемый скоростью обучения.
  • x (i) представляет входную переменную (x (1) означает первый обучающий пример)
  • y (i) представляет собой выходную переменную.

Хорошо, теперь погрузившись в эту формулу, мы видим, что θ0 и θ1 постоянно меняются, пока функция стоимости не достигнет своего минимальное значение. Это означает, что мы будем продолжать изменять значения θ0 и θ1, пока наши параметры не достигнут value, где c ost (error) будет наименьшим.

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

Здесь мы умножаем нашу производную функции стоимости (квадрат функции стоимости ошибки) на α и вычитаем ее из текущего значение θ, чтобы получить новое значение theta (θ).

Выбор значения α

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

Пояснение к x во втором уравнении

Некоторые могут задаться вопросом, что в втором уравнении дополнительный x (i) умножается на наше уравнение а в первом уравнении там ничего нет. Что ж, там присутствует x (0), умноженное на наше уравнение, но мы не записываем это, потому что это смещение и всегда равно 1.

Работа с градиентным спуском

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

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

Шаги по применению линейной регрессии:

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

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

  1. Постройте наши данные (x, y).
  2. Возьмите случайные значения θ0 и θ1 и инициализируйте нашу гипотезу.
  3. Примените функцию стоимости к нашей гипотезе и вычислите ее стоимость.
  4. Если наша стоимость ›› 0, тогда примените градиентный спуск и обновите значения наших параметров θ0 и θ1.
  5. Продолжайте вычислять шаги 3 и 4, пока наша стоимость не станет почти равной 0 или станет минимальной .
  6. Если наша стоимость достигла своего глобального минимума, мы прекращаем применять как функцию стоимости, так и градиентный спуск, и теперь мы успешно обучили наш алгоритм предсказанию правильной взаимосвязи между нашими данными.

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

Что такое Scikit-learn?

Scikit-learn (также известный как sklearn) - это библиотека машинного обучения для Python. Он включает в себя различные алгоритмы классификации, регрессии и кластеризации, а также опорные векторные машины (SVM), случайные леса, усиление градиента, k -means и DBSCAN и предназначен для работы с библиотеки Python, такие как NumPy, Pandas и SciPy.

Линейная регрессия с использованием Sklearn

Линейная регрессия - очень простой и простой в использовании алгоритм. В частности, с помощью этой библиотеки Scikit learn ее реализация и использование стали довольно простыми. Теперь приступим к использованию Sklearn.

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

Импорт набора данных Boston в Python

from sklearn.datasets import load_boston
boston = load_boston()

Импорт других библиотек в Python

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

Проверка содержания нашего набора данных

print(boston.keys())

Эти ключи в dict_keys() каждый из них содержат много информации и данных.

  • Ключ «data» содержит наши данные, которые мы предоставим нашей модели, их также можно принять в качестве входной (x) переменной. Доступ к нему можно получить с помощью кода boston.data.
  • Ключ «target» содержит наши выходные данные (y), которые наша модель должна прогнозировать. Доступ к нему можно получить с помощью кода boston.target.
  • Ключ «feature_names» содержит имена столбцов / функций наших данных. К ним также можно получить доступ с помощью кода boston.feature_names.
  • Клавиша «DESCR» предоставит нам всю информацию о наборе данных, количестве столбцов в нем и даже детали / описание каждого столбца. Мы можем получить доступ к этой информации с помощью кода print(boston['DESCR']).
  • Ключ ‘filename’ дает нам местонахождение этого файла (цены на жилье в Бостоне). Мы можем получить местоположение с помощью кода print(boston['filename']).

Создание фрейма данных

Теперь, чтобы двигаться вперед и увидеть наши данные в организованном и работоспособном виде, мы создадим фрейм данных с помощью Pandas.

bostondf = pd.DataFrame(boston.data, columns=boston.feature_names)

После того, как наш DataFrame создан и наши данные упорядочены. Мы проверяем заголовок нашего набора данных с помощью bostondf.head(). Это дает нам общую ясность / изображение набора данных.

Теперь, если мы не понимаем, что представляет каждый столбец, мы можем использовать print(boston['DESCR']) код, который мы обсуждали ранее, чтобы проверить детали каждого столбца.

Теперь, после выполнения некоторой разработки функций для наших данных, когда мы чувствуем, что теперь наши данные имеют правильный формат для передачи в нашу модель, мы переходим к следующему шагу.
ПРИМЕЧАНИЕ. Я не занимаюсь разработкой функций для этого набора данных.

Разделение нашего набора данных на обучающие, тестовые значения

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

from sklearn.model_selection import train_test_split
X = bostondf
y = boston['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

Здесь X в X = bostondf содержит все функции / входные данные (x), которые мы предоставляем нашей модели для прогнозирования цены домов (y), а y в y = boston['target']содержит цену домов. Итак, теперь 67% наших данных принадлежит набору_обучения, а 33% принадлежит набору_тестов, поскольку test_size установлен на 0,33.

Импорт LinearRegression ()

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

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
lr.score(X_test, y_test)

Итак, на этих двух шагах мы импортировали класс LinearRegression () и создали объект LinearRegression с именем lr. Затем мы подогнали наши обучающие данные lr.fit(X_train, y_train) к модели, предоставив ей как входные характеристики (X_train), так и выходные значения (y_train). После того, как модель была обучена на наших обучающих данных, мы затем проверяем, насколько хорошо наша модель соответствует нашим обучающим данным, используя lr.score(X_test, y_test)*100 код. Он спрогнозирует цены домов на основе характеристик, указанных в X_test, а затем проведет перекрестную проверку эти цены совпадают с фактическими ценами, указанными в y_test. Затем он даст нам значение с плавающей запятой от 1 до 100, которое укажет нам на точность нашей модели.

Точность этой модели составляет 72,45%.

Важное примечание

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

ПОЗДРАВЛЯЕМ! Мы успешно обучили нашу модель линейной регрессии на наборе данных Бостонские цены на жилье.

Результат обучения

До сих пор мы узнали, что такое Представление гипотез, Функция стоимости и Градиентный спуск и как они работают. Кроме того, мы узнали, как реализовать линейную регрессию в наборе данных с нуля и как построить модель машинного обучения используя Python знаменитую библиотеку машинного обучения, т. е. Scikit-learn.

До сих пор мы узнали, что такое Представление гипотез, Функция стоимости и Градиентный спуск и как они работают. Кроме того, мы узнали, как реализовать линейную регрессию в наборе данных с нуля и как построить модель машинного обучения используя Python знаменитую библиотеку машинного обучения, т. е. Scikit-learn.