13. 岭回归

岭回归

岭回归(ridge regression)是一种专用于共线性数据分析的有偏估计回归方法。是一种改良的最小二乘估计法,对某些数据的拟合要强于最小二乘法。
对于一般地线性回归问题,参数的求解采用的是最小二乘法,其目标函数如下:
a r g m i n ∣ ∣ X w − y ∣ ∣ 2 argmin||\mathbf{Xw-y}||^2 argminXwy2
参数 w \mathbf{w} w的求解,可以使用:
w = ( X T X ) − 1 X T y \mathbf{w}=(\mathbf{X^TX})^{-1}\mathbf{X^Ty} w=(XTX)1XTy
对于矩阵 X \mathbf{X} X,若某些列线性相关性较大(即训练样本中某些属性相性相关),就会导致 X T X \mathbf{X^TX} XTX的值接近0,在计算 ( X T X ) − 1 (\mathbf{X^TX})^{-1} (XTX)1时就会出现不稳定性。
岭回归的优化目标:
a r g m i n ∣ ∣ X w − y ∣ ∣ 2 + α ∣ ∣ w ∣ ∣ 2 argmin||\mathbf{Xw-y}||^2+\alpha ||\mathbf{w}||^2 argminXwy2+αw2
对应的矩阵求解方法:
w = ( X T X + α I ) − 1 X T y \mathbf{w}=(\mathbf{X^TX}+\alpha\mathbf{I})^{-1}\mathbf{X^Ty} w=(XTX+αI)1XTy

sklearn中的岭回归

sklearn.linear_model.Ridge
主要参数:

参数说明
alpha正则化因子,对应于损失函数中的 α \alpha α
fit_intercept是否计算截距
solver设置计算参数的方法,可选参数‘auto’、‘svd’、‘sag’等。

交通流量预测

数据

这里写图片描述

HR:一天中的第几个小时(0-23)
WEEK_DAY:一周中的第几天(0-6)
DAY_OF_YEAR:一年中的第几天(1-365)
WEEK_OF_YEAR:一年中的第几周(1-53)
TRAFFIC_COUNT:交通流量

代码

import numpy as np
import matplotlib.pyplot as plt
# 通过sklearn.liner_model加载岭回归方法
from sklearn.linear_model import Ridge
# 交叉验证模块
from sklearn import cross_validation
# 多项式模块
from sklearn.preprocessing import PolynomialFeatures

'''数据加载'''
# 从上向下忽略一行(第一行),以逗号作为分隔。
data = np.genfromtxt('Data/岭回归.csv', delimiter=',', skip_header=1)
# 不要第一列(ID)
data = data[:, 1:]
# plt.plot(data[:, 4])
# plt.show()

'''数据处理'''
# X用于保存0-3维数据,即属性
X = data[:, :4]
# y用于保存第4维数据,即车流量
y = data[:, 4]
# 用于创建最高次数6次方的的多项式特征,多次试验后决定采用6次
poly = PolynomialFeatures(6)
# X为创建的多项式特征
X = poly.fit_transform(X)
# 将所有数据划分为训练集和测试集,test_size表示测试集的比例,random_state是随机数种子
train_set_X, test_set_X, train_set_y, test_set_y = cross_validation.train_test_split(X, y,
                                                                                     test_size=0.3, random_state=0)

'''创建回归器,并进行训练'''
# 创建岭回归实例
clf = Ridge(alpha=1.0, fit_intercept=True)
# 调用fit函数使用训练集训练回归器
clf.fit(train_set_X,train_set_y)
# 利用测试集计算回归曲线的拟合优度,clf.score返回值为0.7375
# 拟合优度,用于评价拟合好坏,最大为1,无最小值,当对所有输入都输出同一个值时,拟合优度为0。
print('拟合优度:', clf.score(test_set_X, test_set_y))

'''画出拟合曲线'''
# 画一段200到300范围内的拟合曲线
start = 200
end = 300
# 调用predict函数拟合值
y_pre = clf.predict(X)
# 画图
time = np.arange(start, end)
plt.plot(time, y[start:end], 'blue', label="real")
plt.plot(time, y_pre[start:end], 'red', label='predict')
# 设置图例的位置
plt.legend(loc='upper left')
plt.show()

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值