[Печь AI] Машинное обучение 004 - Построение и оценка модели гребневого регрессора

машинное обучение искусственный интеллект Python регулярное выражение

[Печь AI] Машинное обучение 004 - Построение и оценка модели гребневого регрессора

(Библиотеки Python и номера версий, используемые в этой статье: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2)

В моей последней статье (【Stove AI】Машинное обучение 003 - Создание, тестирование, сохранение и загрузка модели простого линейного регрессора), построение и тестирование простых линейных регрессоров были подробно объяснены.Преимущества простых линейных регрессоров - «простота» и быстрота работы, но недостатки также «просты», что слишком просто, чтобы соответствовать многим сложным наборам данных.

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

由于异常点(橙色叉号)存在,线性回归器拟合得到的直线(蓝色)偏离期望直线(红色)

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

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

Модель линейной регрессии может быть представлена ​​следующей формулой:

最小二乘法的计算公式

Функция потерь, используемая моделью линейной регрессии:

线性回归模型所用的损失函数公式

Оптимальное решение, полученное методом наименьших квадратов:

最小二乘法得到的最优解

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

岭回归的损失函数和最优解


1. Строительство регрессора хребта

На уровне кода гребенчатый регрессор строится так же, как и линейный регрессор, за исключением того, что объект linear_model.Ridge() создается вместо объекта регрессора linear_model.LinearRegression(), как показано в следующей части кода. .

# 岭回归器的构建
from sklearn import linear_model
ridge_regressor=linear_model.Ridge(alpha=0.02,fit_intercept=True,max_iter=10000)
# 构建岭回归器对象,使用的偏差系数为alpha=0.02
ridge_regressor.fit(whole_x,whole_y) # 使用岭回归器进行训练

# 使用训练完成的岭回归器预测数值
y_train_predict=ridge_regressor.predict(whole_x)
plt.scatter(whole_x,whole_y)
plt.plot(whole_x,y_predict,'-b')
plt.plot(whole_x,y_train_predict,'-r')

运行得到的岭回归器

########################резюме########################## ######

1. Синяя линия на рисунке — это результат, полученный с помощью линейного регрессора, а красная линия — это аппроксимирующая линия, полученная, когда альфа равна 0,02.Они совпадают, что, по-видимому, вызвано слишком маленьким значением альфа.

2. Параметр альфа управляет сложностью гребенчатого регрессора, но когда альфа близка к 0, гребенчатый регрессор эквивалентен обычному методу наименьших квадратов (как видно из рисунка, когда альфа=0,02, две прямые линии почти совпадают), поэтому, если вы хотите, чтобы модель гребневого регрессора была менее чувствительна к выбросам, вам нужно установить относительно большое значение альфа (об этом говорится в «Python Machine Learning Classic Examples», но у меня есть серьезные сомнения, причины будет объяснено позже). Поэтому подбор значения альфа является технической задачей.

#################################################################


2. Оценка модели регрессора хребта

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

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

# 岭回归器模型的评估

# 第一步:构建评估数据,即test set
test_x=np.arange(10,20) # 自变量,随便定义的
shift=np.random.normal(size=test_x.shape)
test_x=test_x+shift # 对test_x进行偏置得到测试集的X

error=np.random.normal(size=x.shape)
test_y=1.8*test_x+5.9+error # 添加随机数作为噪音
plt.scatter(whole_x,whole_y,color='blue',label='train_set')
plt.scatter(test_x,test_y,color='red',label='test_set')
plt.legend()
# 把train set和test set都绘制到一个图中,可以看出偏差不大

训练集和测试机的数据分布

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

# 第二步:使用test set计算MSE
y_test_predict=ridge_regressor.predict(test_x.reshape(-1,1))

# 第三步:使用评价指标来评估模型的好坏
import sklearn.metrics as metrics
test_y=test_y.reshape(-1,1)
print('平均绝对误差:{}'.format(
    round(metrics.mean_absolute_error(y_test_predict,test_y),2)))
print('均方误差MSE:{}'.format(
    round(metrics.mean_squared_error(y_test_predict,test_y),2)))
print('中位数绝对误差:{}'.format(
    round(metrics.median_absolute_error(y_test_predict,test_y),2)))
print('解释方差分:{}'.format(
    round(metrics.explained_variance_score(y_test_predict,test_y),2)))
print('R方得分:{}'.format(
    round(metrics.r2_score(y_test_predict,test_y),2)))

------------------------------------- потерять-- ------------------------------

Средняя абсолютная ошибка: 2,29 Среднеквадратическая ошибка MSE: 8,32 Средняя абсолютная ошибка: 2,0 Объясненная оценка дисперсии: 0,53 Оценка R-квадрата: 0,33

--------------------------------------------Заканчивать----- --------------------------------

########################резюме########################## ######

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

2. Эффект этой модели на тестовом наборе не идеален. Хотя полученная MSE относительно невелика, оценка R-квадрата и оценка объясненной дисперсии низкие. Кажется, что еще есть возможности для улучшения.

#################################################################


3. Улучшение модели регрессора хребта

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

# 对岭回归器模型进行优化,主要优化alpha的取值
alpha_candidates=[-20,-10,-5.0,-2.0,2.0,5.0,10,20,50]

from sklearn import linear_model
for alpha in alpha_candidates:
    ridge_regressor=linear_model.Ridge(alpha=alpha,fit_intercept=True,max_iter=10000)
    # 构建岭回归器对象,使用不同的alpha值
    ridge_regressor.fit(whole_x,whole_y) # 使用岭回归器进行训练
    # 使用训练完成的岭回归器预测数值
    y_train_predict=ridge_regressor.predict(whole_x)
    plt.plot(whole_x,y_train_predict,label='alpha='+str(alpha))
    
plt.legend() 
plt.scatter(whole_x,whole_y)

对alpha值优化后的结果

Как видно из приведенного выше рисунка, по мере того, как значение альфа постепенно изменяется от 0 до 50, подобранная линия будет вращаться по часовой стрелке или поворачиваться в сторону аномальной точки.Похоже, что чем больше альфа, тем более аномальная точка Чем больше «привлекательна» линия, тем больше на подобранную линию влияют выбросы. Альфа изменяется от 0 до отрицательного значения и становится все меньше и меньше, а влияние аномальных точек на подобранную прямую становится все меньше и меньше. (не знаю правильно это или нет). Хотя документ описания функции linear_model.Ridge требует, чтобы альфа-значение было положительным с плавающей запятой, здесь, кажется, нет проблем с отрицательными значениями, и кажется, что подгонка лучше, когда альфа отрицательная.

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

# 对岭回归器模型进行优化,使用不同alpha值优化后得到的模型计算测试集
alpha_candidates=[-20,-10,-5.0,-2.0,2.0,5.0,10,20,50]

from sklearn import linear_model
for alpha in alpha_candidates:
    ridge_regressor=linear_model.Ridge(alpha=alpha,fit_intercept=True,max_iter=10000)
    # 构建岭回归器对象,使用不同的alpha值
    ridge_regressor.fit(whole_x,whole_y) # 使用岭回归器进行训练
    y_test_predict=ridge_regressor.predict(test_x.reshape(-1,1))
    print('------------alpha='+str(alpha)+'---------------------->>>')
    print('均方误差MSE:{}'.format(
    round(metrics.mean_squared_error(y_test_predict,test_y),2)))
    print('中位数绝对误差:{}'.format(
        round(metrics.median_absolute_error(y_test_predict,test_y),2)))
    print('解释方差分:{}'.format(
        round(metrics.explained_variance_score(y_test_predict,test_y),2)))
    print('R方得分:{}'.format(
        round(metrics.r2_score(y_test_predict,test_y),2)))

------------------------------------- потерять-- ------------------------------

------------alpha=-20----------------------
Среднеквадратическая ошибка MSE: 4,93
Средняя абсолютная ошибка: 1,1
Объясненная оценка дисперсии: 0,87
Оценка R-квадрата: 0,75
------------alpha=-10----------------------
Среднеквадратическая ошибка MSE: 6,61
Средняя абсолютная ошибка: 1,62
Объясненная оценка дисперсии: 0,73
Оценка R-квадрата: 0,57
------------alpha=-5.0----------------------
Среднеквадратическая ошибка MSE: 7,47
Средняя абсолютная ошибка: 1,84
Объясненная оценка дисперсии: 0,64
Оценка R-квадрата: 0,46
------------alpha=-2.0----------------------
Среднеквадратическая ошибка MSE: 7,98
Средняя абсолютная ошибка: 1,96
Объясненная оценка дисперсии: 0,57
Оценка R-квадрата: 0,38
------------alpha=2.0----------------------
Среднеквадратическая ошибка MSE: 8,66
Средняя абсолютная ошибка: 2,03
Объясненная оценка дисперсии: 0,48
Оценка R-квадрата: 0,27
------------alpha=5.0----------------------
Среднеквадратическая ошибка MSE: 9,15
Средняя абсолютная ошибка: 2,06
Объясненная оценка дисперсии: 0,41
Оценка R-квадрата: 0,18
------------alpha=10----------------------
Среднеквадратическая ошибка MSE: 9,95
Средняя абсолютная ошибка: 2,12
Объясненная оценка дисперсии: 0,27
Оценка R-квадрата: 0,02
------------alpha=20----------------------
Среднеквадратическая ошибка MSE: 11,47
Средняя абсолютная ошибка: 2,33
Объясненная оценка дисперсии: -0,05
Оценка R-квадрата: -0,36
------------alpha=50----------------------
Среднеквадратическая ошибка MSE: 15,31
Средняя абсолютная ошибка: 2.78
Объясненная оценка дисперсии: -1,36
Оценка R-квадрата: -1,87

########################резюме########################## ######

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

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

#################################################################


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

Использованная литература:

1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.