天天看点

【机器学习】岭回归

1.在之前关于回归的讨论中,我们讨论了标准方程法,这一方法实际有比较大的缺陷,因为在标准方程法中,我们采使用了矩阵的一个很重要或者说很苛刻的性质:矩阵可逆。然而再很多的时候,矩阵是不可逆的。比如数据存在多重共线性的时候,(多重共线值得就是数据的若干个特征存在类似的回归性质,其实通俗一点举个例子就是:比如我们在接一个n元一次方程的时候,我们需要n个方程,但是并且这n个方程必须是互不相关的,比如有一个方程是另一个方程的两倍,那么这个方程组基本上就是没有办法接出来唯一解的。从矩阵的角度来看,这个系数矩阵经过标准化不再是一个满秩矩阵)这样得到的矩阵在标准化以后很有可能不再是满秩矩阵。这样标准方程法就不能在使用了,统计学家为了应对这一这一问题,引入岭回归的概念。

2.首先我们需要知道什么叫做正则化,对于代价函数的正则化,通常有两种正则化方式:l1正则化,l2正则化。这两种正则化的区别就是代价函数的附加值(或者叫做惩罚值)不同,第一个数加上所有参数绝对值之和,第二个数加上所有参数的平方和。这里我们采用l2正则化:

【机器学习】岭回归

其中

【机器学习】岭回归

叫做岭回归系数。这个代价函数是由两部分组成,前边是残差,后边是附加惩罚。二者并不是独立的,互相影响。但是我们依然可以对这个代价函数求导得到权值最优解:

【机器学习】岭回归

其实就是在原来的基础上附加一个单位矩阵,使得原本不是满秩矩阵X^T*X变成一个满秩矩阵。这样就可以求逆矩阵了。

3.知道了这些,我们实战一下:首先介绍一种数据集:lonely数据集,这是一种用于验证程序正确与否的很经典的数据集,是一个美国的某个地方数据,因为这种数据经常的存在多重共线性,所以比较适合用来做测试。

我们的数据集长这个样子:

【机器学习】岭回归

然后开始我们的程序:首先载入数据并且分割数据,数据中的第一行是某一个指标,也就是我们需要预测的值。其他数据是数据集。我们这次将要采用交叉验证的方法(交叉验证其实就是把训练数据集分割成两个部分,一个用来训练模型,另一部分用来验证数据)。

import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
from sklearn import linear_model
data=np.genfromtxt("D:/ML/data.csv",delimiter=',')
# print(data)
# 切分数据
x_data=data[1:,2:]#选取的数据就是从第一行到最后一行,第二列到最后一列
# print(x_data)
y_data=data[1:,1]#这是目标预测值
# print(y_data)      

载入数据之后,我们需要产生岭系数,我们采用Python库函数:np.linspace().默认产生50个数据。然后调用Sklearn中的回归函数得到答案。完整代码如图所示:

import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
from sklearn import linear_model
data=np.genfromtxt("D:/ML/data.csv",delimiter=',')
# print(data)
# 切分数据
x_data=data[1:,2:]#选取的数据就是从第一行到最后一行,第二列到最后一列
# print(x_data)
y_data=data[1:,1]#这是目标预测值
# print(y_data)
# 这个默认会产生50个0.001-1的数据,作为岭回归的系数
alphas_to_test=np.linspace(0.001,1)
# 这个就是调用sklearn库函数中的岭回归方法,CV的意思就是交叉验证.
# 第一个参数的意思就是岭回归系数,他会验证这50个数据,
model=linear_model.RidgeCV(alphas_to_test,store_cv_values=True)
model.fit(x_data,y_data)
# 岭回归选区最好的岭系数
# print(model.alpha_)
# 解释一下这里的意思:这行代码执行玩以后的结果是:(16, 50).16是交叉验证产生的,每一行数据都会做一次测试集合,50指的是岭系数一共验证了50个
# print(model.cv_values_.shape)

# 我们首先可以看一下岭系数和loss值的关系
plt.plot(alphas_to_test,model.cv_values_.mean(axis=0))
#选取最优岭系数的位置
plt.plot(model.alpha_,min(model.cv_values_.mean(axis=0)),'ro')
plt.show()      

然后我们做出来岭回归系数和loss值(代价函数值)之间的函数图像,并且把最佳的岭系数标记出来得到如下图所示:

上一篇: swift2.0笔记2
下一篇: swift2.0笔记3