【机器学习】岭回归(Kernel Ridge Regression)附python代码

概述

岭回归,又叫吉洪诺夫正则化,是由Hoerl和Kennard于1970年提出的是一种专用于共线性数据分析的有偏估计回归法。岭回归实际上是一种改良的最小二乘估计法,具有L2正则化的线性最小二乘法。回归算法的,本质就是为了解决一个线性方程,而标准估计方法是普通的最小二乘法的线性回归。

岭回归

线性回归模型的目标函数是
f ( w ) = ∑ i = 1 m ( y i − x i T w ) 2 f(w) = \sum_{i=1}^{m}(y_{i}-x_{i}^{T}w)^{2} f(w)=i=1m(yixiTw)2
转换为矩阵形式是:
f ( w ) = ( y − X w ) T ( y − X w ) f(w) = (y-Xw)^{T}(y-Xw) f(w)=(yXw)T(yXw)
从上矩阵可以得到回归系数:
w ^ = ( X T X ) − 1 X T y \hat{w}=(X^{T}X)^{-1}X^{T}y w^=(XTX)1XTy
上述回归系数方程成立的条件是 X T X X^{T}X XTX可逆,但如果出现数据样本数比特征数少,或者特征高度相关的情况下,该矩阵的逆不能直接计算。而此时便需要用到岭回归。岭回归在最小二乘估计的基础上增加了一项,即岭回归估计:
w ^ = ( X T X + λ I ) − 1 X T y \hat{w}=(X^{T}X+\lambda I)^{-1}X^{T}y w^=(XTX+λI)1XTy
而岭回归模型的目标函数在线性模型的基础上加了L2范数的惩罚项:
f ( w ) = 1 2 m ∑ i = 1 m [ ( y i − x i T w ) 2 + λ ∑ j = 1 n w j 2 ] f(w) = \frac{1}{2m}\sum_{i=1}^{m}[(y_{i}-x_{i}^{T}w)^{2}+\lambda \sum_{j=1}^{n}w_{j}^{2}] f(w)=2m1i=1m[(yixiTw)2+λj=1nwj2]
惩罚函数便是:
λ ∑ j = 1 n w j 2 \lambda \sum_{j=1}^{n}w_{j}^{2} λj=1nwj2
这时,函数优化问题便可以转成:
f ( w ) = ∑ i = 1 m ( y i − x i T w ) 2 f(w) = \sum_{i=1}^{m}(y_{i}-x_{i}^{T}w)^{2} f(w)=i=1m(yixiTw)2
s . t . ∑ j = 1 n w j 2 ≤ t s.t.\sum_{j=1}^{n}w_{j}^{2}\leq t s.t.j=1nwj2t

适用范围

岭回归是在最小二乘法的基础上添加了对参数 w w w,当岭参数 λ \lambda λ为0时,得到最小二乘解,当岭参数 λ \lambda λ趋向更大时,岭回归系数 w w w估计趋向于0。
从岭回归的原理可以知道,岭回归就是改良后的最小二乘估计法,通过放弃最小二乘法的无偏性,通过损失部分特征信息,降低模型精度来得到更符合实际情况的回归系数。最小二乘法对每个变量很公平,但当自变量存在复共线性时,回归系估计的方差就很大,估计值就很不稳定。而岭回归通过给回归估计上增加一个偏差度,把一些系数缩减成很小的值甚至零,解决病态矩阵,从而降低模型误差。当实验数据的变量之间存在相关关系,岭回归就很适合用作集成模型的基模型。

python代码实现

import numpy as np
import pandas as pd
import os
''' 
导入数据
'''
file = os.path.abspath(os.path.join(os.getcwd(), ".."))  
data_file = os.path.join(file, 'data/train.csv')  
train = pd.read_csv(data_file)
data_file = os.path.join(file, 'data/test.csv')
test = pd.read_csv(data_file)
target_variable = train["y"].values
del train["y"]


from sklearn.model_selection import KFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.kernel_ridge import KernelRidge
from sklearn.preprocessing import RobustScaler
''' 
建模
'''
# 定义一个交叉评估函数 Validation function
n_folds = 5
def rmsle_cv(model):
    kf = KFold(n_folds, shuffle=True, random_state=42).get_n_splits(train.values)
    rmse= np.sqrt(-cross_val_score(model, train.values, target_variable, scoring="neg_mean_squared_error", cv = kf))
    return(rmse)

# 岭回归(Kernel Ridge Regression)  
KRR = make_pipeline(RobustScaler(), KernelRidge(alpha=0.6, kernel='polynomial', degree=2, coef0=2.5))
score = rmsle_cv(KRR)
print("\nLasso score: {:.4f} ({:.4f})\n".format(score.mean(), score.std())) 


''' 
预测
'''
y_train = target_variable
x_train = train.values   
KRR.fit(x_train,y_train)
y = KRR.predict(test.values)

引用

[1]: Hoerl A E, Kennard R W. Ridge regression: Biased estimation for nonorthogonal problems[J]. Technometrics, 1970, 12(1): 55-67.

你可能感兴趣的:(机器学习,python,人工智能,算法)