Машинное обучение в действии: модели линейной регрессии

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

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Всем привет, меня зовут Питер~

Сегодня я привожу практическую статью о машинном обучении: использование библиотеки машинного обучения scikit-learn для борьбы с моделями линейной регрессии.

Машинное обучение на практике — линейная регрессия

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

网络图

Каталог статей

Базовая форма

Основное выражение

Предположим, что x описывается d атрибутами:x=x1,x2,......,xdx={x_1,x_2,......,x_d}xix_iПредставляет значение i-го атрибута. Линейная модель — это функция, которая предсказывает через комбинацию различных атрибутов, которые можно выразить как:

f(x)=w1x1+w2x2+...+wdxd+bf(x) = w_1x_1+ w_2x_2 + ... + w_dx_d + b

Если выразить как вектор как:

f(x)=wTx+bf(x) = w^Tx+b

вw=(w1,w2,...,wd)w=(w_1,w_2,...,w_d)назовите это весом, b - смещение


разные формы

Линейная функция f(x) в разных масштабах:

  • f(x) принимает дискретные значения: линейные мультиклассовые модели
  • f (x) Возьмите функции реального значения в цифровой области: модель линейной регрессии
  • f(x) является логарифмическим: логарифмически-линейный режим
  • сигмовидное нелинейное преобразование f (x): логарифмическая регрессия вероятности

В этой статье основное внимание уделяется проблеме линейной регрессии.

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

данный набор данныхD=(x1,y1),(x2,y2),...,(xm,ym),yiеRD = {(x_1,y_1),(x_2,y_2),...,(x_m,y_m)},y_i \in R.

Линейная регрессия Линейная регрессия пытается изучить линейную модель, которая максимально увеличивает прогнозируемое значение.f(x)f(x)и фактическая стоимостьyiy_iнаименьшая разница

Метод измерения

Используйте среднеквадратичную ошибку для измерения: найдите подходящие w и b, удовлетворяющиеmin(w,b)i=1m(f(xi)yi)2\min _{(w,b)} \sum ^m _{i=1} (f(x_i) - y_i)^2

Среднеквадратическая ошибка соответствует обычно используемому евклидову расстоянию (евклидову расстоянию). Метод решения модели, основанный на минимизации среднеквадратичной ошибки, называется:Наименьших квадратов.

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

Параметрический решатель

Решение для w и b делаетE(w,b)=i=1m(yiwxib)2 E(w,b)=\sum ^m _{i=1}(y_i-wx_i-b)^2Для достижения минимума этот процесс называется методом наименьших квадратов.Оценка параметра

Процесс вывода E(w,b) для w и b по отдельности. Конкретный процесс вывода см. в:кит данных China.GitHub.IO/pumpkin-Booh…

Установив два приведенных выше производных результата равными 0, мы можем получить два результата для w и b:

sklearn боевая линейная регрессия

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

  • Источники данных

  • исследование данных

  • обработка данных

  • Запуск линейной модели sklearn

  • Оценка модели

  • Оптимизация модели

  • Визуализируйте результаты

Источники данных

1. Введение данных здесь:archive.ICS.UCI.credits/beauty/datasets…

2. Пожалуйста, перейдите на адрес загрузки данныхархив.ICS.UCI.quote/beauty/machine-…

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

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

исследование данных

import pandas as pd
import numpy  as np
from sklearn import datasets, linear_model
from sklearn.linear_model import LinearRegression  # 导入线性回归模型

import matplotlib.pyplot as plt
%matplotlib inline 

1, данные читаются

2. Просмотр информации о данных

3. Просмотр статистики данных

обработка данных

1. Выбрать необходимые данные выборки X, то есть информацию первых 4-х полей

2. Выберите данные выходной метки нашего образца y, которые являются данными последнего поля атрибута.

Разделение набора данных

Разделение набора данных: одна часть становится тренировочным набором, а другая часть делится на тестовый набор

from sklearn.model_selection import train_test_split  # 从模型选择模块中导入训练、测试集模块

X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=1)

X_train   # 7176条数据训练数据

Данные тестового набора 2392:

Строка записи выходного значения выборки совпадает с соответствующим X, при этом мы также обнаружили, что 75% данных в этом случае используется как обучающая выборка, а 25% — как тестовая.

соответствовать созданному объекту

line.fit(X_train,y_train)
LinearRegression()

Ознакомьтесь с нашими смоделированными коэффициентами:

print(line.intercept_)  # 相当于是d;类似于截距
print(line.coef_)   # 相当于是每个w的取值
[460.05727267]
[[-1.96865472 -0.2392946   0.0568509  -0.15861467]]

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

PE=1.96865472*AT0.2392946*V+0.0568509*AP0.15861467*PH+460.05727267PE = -1.96865472*AT -0.2392946*V + 0.0568509*AP -0.15861467*PH + 460.05727267

Оценка модели

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

Оценка модели для линейной регрессии обычно заключается в использовании среднеквадратичной ошибки (MSE) или среднеквадратичной ошибки (Root Mean Squared Error, RMSE) на тестовом наборе, как описано выше, для оценки качества модели. Для тестирования используется следующий код:

y_pred = line.predict(X_test)  # 对测试集数据进行预测

y_pred
array([[457.26722361],
       [466.70748375],
       [440.33763981],
       ...,
       [457.39596168],
       [429.37990249],
       [438.16837983]])
len(y_pred)
2392

После прогнозирования результата мы сравниваем прогнозируемое значение с фактическим значением:

from sklearn import metrics  # 对比模块
# 输出MSE

print("MSE:",metrics.mean_squared_error(y_test,y_pred)) 
MSE: 20.837191547220346
# 输出RMSE:MSE开根号的结果

print("RMSE: ",np.sqrt(metrics.mean_squared_error(y_test,y_pred)))
RMSE:  4.564777272465804

Оптимизация модели с помощью перекрестной проверки

перекрестная проверка: Разделите все выборки данных D на k взаимоисключающих подмножеств одинакового размера. Каждое подмножество пытается сохранить согласованность распределения данных. Затем используйте подмножество k-1 в качестве тренировочного набора, а оставшееся — в качестве тестового набора.

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

Мы можем использовать метод перекрестной проверки, который поставляется со sklearn, чтобы оптимизировать полученную модель В следующем примере используется 10-кратная перекрестная проверка:

line
LinearRegression()
from sklearn.model_selection import cross_val_predict  # 导入交叉验证模块

y_predicted = cross_val_predict(line,X,y,cv=10) 
y_predicted  # 通过交叉验证得到的预测值
array([[467.24487977],
       [444.06421837],
       [483.53893768],
       ...,
       [432.47556666],
       [443.07355843],
       [449.74395838]])
len(y_predicted)
9568

Рассчитайте MSE и RMSE предсказанных и истинных значений, полученных перекрестной проверкой:

# 输出MSE

print("MSE:",metrics.mean_squared_error(y,y_predicted)) 
MSE: 20.79367250985753
print("RMSE: ",np.sqrt(metrics.mean_squared_error(y,y_predicted)))
RMSE:  4.560007950635342

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

Рисование

Наконец, мы рисуем график между реальным значением выборки и прогнозируемым значением, Чем ближе точка к значению y = x в середине, тем меньше потеря прогноза.

Вот код и результат построения с помощью matplotlib:

fig, ax = plt.subplots()

ax.scatter(y, y_predicted)

ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=3)

ax.set_xlabel('Measured')  # 真实值
ax.set_ylabel('Predicted') # 预测值

plt.show()

Я перерисовал данные с помощью Plotly_express, чтобы увидеть эффект:

data = pd.concat([pd.DataFrame(y),pd.DataFrame(y_predicted)],axis=1)
data.columns = ["Measured", "Predicted"]
data

import plotly_express as px

fig = px.scatter(data,
                 x="Measured",  # 真实值
                 y="Predicted",  # 预测值
                 trendline="ols",  # 趋势线
                 trendline_color_override="red" # 颜色
                )

fig.show()