python机器学习算法实训 - (二) 手写岭回归和lasso回归

是的,我来更新了。
线性模型之间还是很相似的,有了线性回归,其他的也好展开了。
理论部分两张图来自林轩田老师的机器学习基石,向同学们推荐一手。

岭回归和Lasso回归

1.1 什么是过拟合

python机器学习算法实训 - (二) 手写岭回归和lasso回归_第1张图片
如图所示,在数据量不够大的情况下,如果我们使用一个高阶多项式(图中红色曲线所示),例如10阶,对目标函数(蓝色曲线)进行拟合。拟合曲线波动很大,虽然Ein很小,但是Eout很大,也就造成了过拟合现象。
我们看似在数据集上获得了很好地效果,但可想而知测试集表现会很糟糕,因为它太多考虑了数据集的噪声。

1.2 为什么需要岭回归

岭回归与Lasso回归的出现是为了解决线性回归出现的过拟合以及在通过 正规方程方法求解θ的过程中出现的x转置乘以x不可逆这两类问题的, 这两种回归均通过在损失函数中引入正则化项来达到目的,具体三者的 损失函数对比见下图
python机器学习算法实训 - (二) 手写岭回归和lasso回归_第2张图片
其中λ称为正则化参数,如果λ选取过大,会把所有参数θ均最小化,造成欠拟合,如果λ选取过小,会导致对过拟合问题解决不当,因此λ 的选取是一个技术活。
岭回归(ridge regression)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。

1.3 岭回归和lasso回归

岭回归与Lasso回归最大的区别在于岭回归引入的是L2范数惩罚项, Lasso回归引入的是L1范数惩罚项,Lasso回归能够使得损失函数中的许 多θ均变成0,这点要优于岭回归,因为岭回归是要所有的θ均存在的, 这样计算量Lasso回归将远远小于岭回归。
python机器学习算法实训 - (二) 手写岭回归和lasso回归_第3张图片
python机器学习算法实训 - (二) 手写岭回归和lasso回归_第4张图片
L1有利于得到稀疏解,即解向量有很多0.

1.4 代码实现

本质只是在线性回归中加入正则项而已,我们直接来看干货

#岭回归预测销售额
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split

#岭回归预测销售额
data = pd.read_csv('/data/shixunfiles/f4a77266e4adb25e4ab168f994f6a7e6_1582712806305.csv')
x = data[['TV', 'Radio', 'Newspaper']]
y = data['Sales']
#划分数据集,80%用于训练数据集,20%用于测试数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8, random_state=0)

#sklearn库中岭回归模型
r = Ridge()
ridge = r.fit(x_train, y_train)
print('Training set score:{}'.format(ridge.score(x, y)))
print('riddge.coef_:{}'.format(ridge.coef_))
print('ridge.intercept_:{}'.format(ridge.intercept_))
order = y_test.argsort(axis=0)
y_test = y_test.values[order]
x_test = x_test.values[order, :]
y_predict = r.predict(x_test)
#计算测试集上的均方误差
mse = np.average((y_predict - np.array(y_test)) ** 2)
#计算测试集上的均方根误差
rmse = np.sqrt(mse)
print('MSE= ', mse)
print('RMSE= ', rmse)
#绘制岭回归销售额和真实销售额折线图
plt.figure(facecolor='w')
t = np.arange(len(x_test))
plt.plot(t, y_test, 'r-', linewidth=2, label=u'real data')
plt.plot(t, y_predict, 'b-', linewidth=2, label=u'predicted data')
plt.legend(loc='upper right')
plt.title(u'predict sales by ridge regression', fontsize=18)
plt.grid(b=True)
plt.show()
#自己编写岭回归算法
x_T = np.transpose(x_train)
num = 20000
k_mat = np.linspace(-10000, num-1-10000, num=num)
beta = np.zeros([num, 3])
xMat = np.mat(x_train)
yMat = np.mat(y_train).T
iner = np.zeros((np.shape(xMat)[1],np.shape(xMat)[1]))
weights = np.zeros((np.shape(xMat)[1],np.shape(yMat)[0]))
for k in range(num):
    xTx = xMat.T * xMat
    iner = xTx +  np.eye(np.shape(xMat)[1]) * k_mat[k]
    weights = iner.I * (xMat.T * yMat)
    beta[k,:] = weights.T
print(beta)
plt.plot(beta)
plt.show()
a = [0.05263455, 0.25295774, 0.00258252]
y = np.dot(x_test, a)
plt.plot(y_test, 'r-', linewidth=2, label=u'real data')
plt.plot(y_predict, 'b-', linewidth=2, label=u'predicted data')
plt.plot(y)
plt.show()

结果:
python机器学习算法实训 - (二) 手写岭回归和lasso回归_第5张图片
岭迹图:
python机器学习算法实训 - (二) 手写岭回归和lasso回归_第6张图片

你可能感兴趣的:(机器学习,算法,机器学习,python,数据分析,数据挖掘)