Машинное обучение

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

Простая реализация на Python

Цель этой статьи - понять основные принципы линейной регрессии. Итак, мы не будем использовать какие-либо библиотеки, которые сделали бы это за нас. Однако мы сравним нашу реализацию с функцией линейной регрессии модуля sklearn.linear_model.

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

Допустим, мы хотим оценить цены на жилье в вашем городе. Мы исследуем данные и выясняем, что:

  • Большее количество кроватей приводит к увеличению цен на жилье.
  • Дома на верхних этажах, как правило, дороже.
  • Некоторые из них выше, потому что в них больше удобств.

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

цена = w1 * (количество кроватей) + w2 * (этаж) + w3 * (количество удобств) + w4

где w4 - переменная смещения.

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

Реализация

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

  • Данные о диабете с использованием load_diabetes из модуля sklearn.datasets.
  • Numpy библиотека для численных вычислений.
  • Plotly для визуализации тенденций в данных.

Шаг 1. Импортируйте библиотеки

Шаг 2: загрузка и предварительная обработка набора данных

Мы предварительно обработаем данные, используя:

  • Нормализация.
  • Добавление набора функций столбца смещения.

Цель нормализации - изменить значения числовых столбцов в наборе данных на общий масштаб, не искажая различия в диапазонах значений.

Затем мы добавляем столбец смещения. Не добавляйте столбец смещения с единицами перед нормализацией, так как нормализация сделает значения столбца 0, что сделает его бесполезным.

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

Number of samples in our dataset: 442
Number of features: 10
New shape of X: (442,11)

Шаг 3. Определите функцию затрат

Мы выберем нашу функцию стоимости как MSE (среднеквадратичная ошибка).

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

Шаг 4: Определите функцию градиентного спуска

Сначала мы определяем функцию для обновления параметров

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

Чтобы понять, как работает градиентный спуск, взгляните на this.

Шаг 5: запустить

Проведем 1500 итераций на спуске.

Initial Cost: 14398.186037427562
Final cost: 1439.2157547146871
Final weights: 
[[152.1269295 ]
 [ -0.31399737]
 [-11.2557614 ]
 [ 25.16310273]
 [ 15.3276566 ]
 [ -4.70075206]
 [ -4.0701625 ]
 [ -9.27006634]
 [  5.36330529]
 [ 23.09773452]
 [  3.35072396]]

Шаг 6: сюжетный спуск

Функция для построения спуска.

Мы снизили стоимость с 14398 до 1439 (почти в 10 раз) за 1500 итераций. Однако для схождения потребовалось 17198 итераций.

Сравнение

Давайте обучим нашу модель с помощью функции LinearRegression() scikit-learn.

from sklearn.linear_model import LinearRegression()
lr=LinearRegression(fit_intercept=False)
lr.fit(X,y)

Сравнивая эти коэффициенты с весами нашей модели, мы получаем RMSE 11,6. Что очень близко!

Блокнот к этой статье вы можете найти здесь.