Базовое понимание и реализация линейной регрессии с использованием Scikit-Learn.

В моем последнем блоге мы видели обзор того, как работает классификация KNN и ее реализация на питоне с использованием библиотек sklearn (Классификация KNN с использованием Scikit Learn). В этой статье мы сначала поймем, как работает алгоритм линейной регрессии, и, наконец, его реализацию в Python.

Понимание модели линейной регрессии

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

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

Модель регрессии, включающая несколько переменных, может быть представлена ​​как:

y = θ0 + θ1X1 + θ2X2 + … + θmXm

где θm — вес, связанный с Xm

Это уравнение такое же, как уравнение прямой линии y = a + bx, поскольку у нас более высокая размерность, вместо x у нас есть x1, x2 и т. д. Используя θ0 в качестве точки пересечения, а не a, и θ1 относится к уклону в размере x1.

Сформулируем это уравнение в виде гипотезы.

hθ(x) = θ0 + θ1X1 + θ2X2 + … + θmXm

где x — вектор [x1 x2 …], а θ — вектор [θ0 θ1 θ2…]

Цель обучения состоит в том, чтобы найти такое значение θ, чтобы значение, выдаваемое hθ(x) для данного вектора x, было как можно ближе к y.

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

Функция стоимости линейной регрессии задается как

Для большего понимания мы можем написать, что он имеет

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

Линейная регрессия пытается минимизировать эту стоимость, находя правильные значения θ0 и θ1, и это делается с помощью градиентного спуска. Цель градиентного спуска состоит в том, чтобы минимизировать стоимость. Градиентный спуск обновляет значение θ. Значения обновляются как

Где α - скорость обучения, которая контролирует размер шага.

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

Понятие о градиентном спуске

Допустим, вы находитесь на вершине горы и вам нужно достичь самой низкой точки горы. Итак, как вы можете достичь дна?

Лучший способ — наблюдать за землей и находить, где земля идет вниз по склону. Затем из положения сделайте шаг в направлении спуска и повторите тот же процесс, пока не достигнете самой низкой точки.

Градиентный спуск работает аналогичным образом для нахождения локального минимума функции. Локальные минимумы — это точка, после которой значение уже не может быть уменьшено. Для этого нам нужно предпринять шаги, пропорциональные отрицательному градиенту. Если мы предпримем шаги, пропорциональные положительному градиенту, мы достигнем локальных максимумов.

Реализация

Шаг 1. Сбор данных

Прочитайте данные. Здесь мы используем набор данных о ценах на жилье в Бостоне. Набор данных можно скачать с Kaggle.

# Import initial libraries and dataset
import pandas as pd
column_names= ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
df = pd.read_csv("D://Blogs//housing.csv",delim_whitespace=True, names=column_names)
df.head()

  • 506 наблюдений
  • 14 функций
  • Метка цели: MEDV

Шаг 2. Предварительная обработка данных

  • Заполнение отсутствующих значений

Здесь мы проверяем, содержат ли данные какое-либо пропущенное значение. Для этого мы используем функцию isnull().

# finding missing values
df.isnull().sum()

Отсутствуют пропущенные значения

Шаг 3. Выберите модель.

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

Шаг 4. Разделите набор данных

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

#Split the Dataset
X = df[["CRIM", "ZN", "INDUS", "CHAS", "NOX", "RM", "AGE", "DIS", "RAD", "TAX", "PTRATIO", "B", "LSTAT"]]
X.head()

#Split the Dataset
y = df[['MEDV']]
y.head()

Теперь у нас есть 13 признаков в X и 1 целевая переменная MEDV в y.

Этот набор данных теперь будет разделен на наборы для обучения и тестирования. Данные обучения будут использоваться для обучения модели, а данные тестирования будут использоваться для тестирования. Для этого мы используем функцию «train_test_split» библиотеки scikit-learn.

#split the data for training and testing
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

Мы делим данные на 70% для обучения и 30% для целей тестирования.

Шаг 5. Обучите модель.

Здесь мы используем встроенную библиотеку LinearRegression().

#train the lineraRegression model
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()  
regressor.fit(X_train, y_train) #Fit function

Шаг 6. Прогноз

Теперь модель готова генерировать прогноз. Для этого воспользуемся функцией «предсказать».

#prediction
y_pred = regressor.predict(X_test)

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

# compare actual and predicted values
df_results = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
df_results.head(10)

Шаг 7. Оценка модели

  • Среднеквадратическая ошибка. Значение RMSE в основном используется для проверки ошибки модели.

Давайте проверим значение RMSE нашей модели.

#Evaluation
from sklearn import metrics
print('Root Mean Squared Error:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

У нас есть значение RMSE: 4,45, что указывает на гораздо меньшую ошибку.

Преимущества линейной регрессии

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

Недостаток линейной регрессии

  • Склонность к недообучению: недообучение означает, что модель не может правильно собрать данные.
  • Чувствителен к выбросам
  • Предполагает независимость между атрибутами

Вы можете найти полный код вместе с набором данных на Github.

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