(1)线性回归的不足

对于一般地线性回归问题,参数的求解采用的是最小二乘法,其目标函数如下:

参数w的求解,也可以使用如下矩阵方法进行:

(2)岭回归

岭回归的优化目标:

对应的矩阵求解方法为:

 

 岭回归(ridge regression)是一种专用于共线性数据分析的有偏估计回归方法
 是一种改良的最小二乘估计法,对某些数据的拟合要强于最小二乘法。

(3)sklearn中的岭回归

在sklearn库中,可以使用sklearn.linear_model.Ridge调用岭回归模型,其主要参数有:
• alpha:正则化因子,对应于损失函数中的𝜶
• fit_intercept:表示是否计算截距,
• solver:设置计算参数的方法,可选参数‘auto’、‘svd’、‘sag’等

(4)交通流量预测实例

数据介绍:
数据为某路口的交通流量监测数据,记录全年小时级别的车流量。
实验目的:
根据已有的数据创建多项式特征,使用岭回归模型代替一般的线性模型,对车流量的信息进行多项式回归。
技术路线:sklearn.linear_model.Ridgefrom
sklearn.preprocessing.PolynomialFeatures

数据特征如下:
HR:一天中的第几个小时(0-23)
WEEK_DAY:一周中的第几天(0-6)
DAY_OF_YEAR:一年中的第几天(1-365)
WEEK_OF_YEAR:一年中的第几周(1-53)
TRAFFIC_COUNT:交通流量
全部数据集包含2万条以上数据(21626)

(5)实验过程

(1)建立工程,导入sklearn相关工具包:

import numpy as np
from sklearn.linear_model import Ridge
#通过sklean.linermodel加载岭回归方法
#from sklearn import cross_validation
from sklearn import model_selection
#加载交叉验证模块,加载matplotilib模块
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
#通过..加载..用于创建多项式特征,如ab,a^2,b^2

(2)数据加载

    #2数据加载
    data = np.genfromtxt(r'C:\Users\86493\Desktop\北理工机器学习慕课数据\回归\岭回归.txt', delimiter=',')
    #使用numpy的方法从txt文件中加载数据
    plt.plot(data[:,4])
    #使用plt展示车流量信息,如右图
    plt.show()

(3)数据处理

    #3数据处理
    x = data[:,:4]
    #X用于保存0-4维数据,即属性
    y = data[:,4]
    #y用于保存第4维数据,即车流量
    poly = PolynomialFeatures(9)
    #用于创建最高次数6次方的多项式特征,多次试验后决定采用6次
    x = poly.fit_transform(x)
    #X为创建的多项式特征

(4)划分训练集和测试集

    #4划分训练集和测试集
    train_x, test_x, train_y, test_y = \
    cross_validation.train_test_split(x, y, 
    test_size=0.3, random_state=0)
    #将所有数据划分为训练集和测试集,test_size表示测试集的比例
    #random_state是随机数种子

(5)创建回归器,并进行训练

    #5创建回归器,进行训练
    clf = Ridge(alpha=1.0, fit_intercept=True)
    #接下来创建岭回归实例
    clf.fit(train_x, train_y)
    #调用fit函数使用训练集训练回归器
    score = clf.score(test_x, test_y)
    #利用测试集计算回归曲线的拟合优度,clf.score返回值为0.7375
    #拟合优度,用于评价拟合好坏,最大为1,无最小值,当对所有输入都输出一个值时,拟合优度为0

(6)画出拟合曲线

    #6画出拟合曲线
    print('score:',score)
    start = 200
    end = 300
    #画一段200到300范围内的拟合曲线
    y_pre = clf.predict(x) #是调用predict函数的拟合值
    time = np.arange(start, end)
    plt.plot(time, y[start:end],'b', label="real")
    plt.plot(time, y_pre[start:end],'r', label="predict")
    #展示真实数据(蓝色)以及拟合的曲线(红色)
    plt.legend(loc="upper left") #设置图例的位置
    plt.show()

全部代码

import numpy as np
from sklearn.linear_model import Ridge
#通过sklean.linermodel加载岭回归方法
#from sklearn import cross_validation
from sklearn import model_selection
#加载交叉验证模块,加载matplotilib模块
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
#通过..加载..用于创建多项式特征,如ab,a^2,b^2

def main():
    #2数据加载
    data = np.genfromtxt(r'C:\Users\86493\Desktop\北理工机器学习慕课数据\回归\岭回归.txt', delimiter=',')
    #使用numpy的方法从txt文件中加载数据
    plt.plot(data[:,4])
    #使用plt展示车流量信息,如右图
    plt.show()

    #3数据处理
    x = data[:,:4]
    #X用于保存0-4维数据,即属性
    y = data[:,4]
    #y用于保存第4维数据,即车流量
    poly = PolynomialFeatures(9)
    #用于创建最高次数6次方的多项式特征,多次试验后决定采用6次
    x = poly.fit_transform(x)
    #X为创建的多项式特征

    #4划分训练集和测试集
    train_x, test_x, train_y, test_y = \
    cross_validation.train_test_split(x, y, 
    test_size=0.3, random_state=0)
    #将所有数据划分为训练集和测试集,test_size表示测试集的比例
    #random_state是随机数种子

    #5创建回归器,进行训练
    clf = Ridge(alpha=1.0, fit_intercept=True)
    #接下来创建岭回归实例
    clf.fit(train_x, train_y)
    #调用fit函数使用训练集训练回归器
    score = clf.score(test_x, test_y)
    #利用测试集计算回归曲线的拟合优度,clf.score返回值为0.7375
    #拟合优度,用于评价拟合好坏,最大为1,无最小值,当对所有输入都输出一个值时,拟合优度为0

    #6画出拟合曲线
    print('score:',score)
    start = 200
    end = 300
    #画一段200到300范围内的拟合曲线
    y_pre = clf.predict(x) #是调用predict函数的拟合值
    time = np.arange(start, end)
    plt.plot(time, y[start:end],'b', label="real")
    plt.plot(time, y_pre[start:end],'r', label="predict")
    #展示真实数据(蓝色)以及拟合的曲线(红色)
    plt.legend(loc="upper left") #设置图例的位置
    plt.show()
 
if __name__ == '__main__':
    main()

(7)结果分析

分析结论:预测值和实际值的走势大致相同

 

Logo

在这里,我们一起交流AI,学习AI,用AI改变世界。如有AI产品需求,可访问讯飞开放平台,www.xfyun.cn。

更多推荐