【机器学习实战】sklearn库中出现的线性模型(补充前篇线性回归)

线性模型

一般我们可以把线性模型写作: f(x)=wTx+b f ( x ) = w T x + b 的形式。sklearn中列举了线性回归、岭回归、lasso回归等线性模型,模型实在是多⊙▽⊙”,现将几个我印象比较深的做一下整理。
为了方便起见,我们令 wT=(w1,w2,...,wn,b) w T = ( w 1 , w 2 , . . . , w n , b ) ,因此预测值 f(x)=w1x1+w2x2+...+wnxn+b=wTx f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w n x n + b = w T x ,真实值为 y y ,样本数量为m个,即(x1,x2,...,xm);特征为n个,即 (x1,x2,...,xn) ( x 1 , x 2 , . . . , x n )

【线性回归】

线性回归采用的是最小二乘法的思想,即使所有预测值 f(x) f ( x ) 与其真实值 y y 的欧氏距离的平方最小,minw||wTxy||2
其损失函数写为: L(w)=((i=1m|f(xi)yi|2)12)2=i=1m(f(xi)y)2 L ( w ) = ( ( ∑ i = 1 m | f ( x i ) − y i | 2 ) 1 2 ) 2 = ∑ i = 1 m ( f ( x i ) − y ) 2
有时为了方便求导会改写为 L(w)=12mi=1m(f(xi)y)2 L ( w ) = 1 2 m ∑ i = 1 m ( f ( x i ) − y ) 2

【Ridge回归】

岭回归,其实就是在线性回归的最小二乘法基础上加了正则化项(有时也喜欢叫惩罚项)。
主要是因为最小二乘法采用的是无偏估计,它的无偏性导致其对病态数据会很敏感,比如出现了一个离所有数据都很远的数据,为了最小化所有数据到拟合模型的距离之和最小,我们的模型必然会偏向这个数据,这样我们的模型的拟合效果并不符合实际。(其实也就是过拟合现象,众所周知,我们常用正则化来处理过拟合现象)
因此,岭回归针对最小二乘法进行了改进,即 minw||wTxy||2+λ||w||2 min w | | w T x − y | | 2 + λ | | w | | 2 ,观察这个公式我们可以发现 λ λ 越大,我们为了使||wTxy||2+λ||w||2最小,必须使 w w 越小越好。
下图是λ和系数 w w 的关系,我们可以看出,当λ很大, w w 趋向于0;而当λ趋于0时,此时的系数 w w 趋于一般最小二乘法的解,系数会出现很大的振荡。因此我们有必要调整λ,保持这两者之间的平衡。(在官方库中 λ λ 是用α表示的)
from 官网
岭回归损失函数写为 L(w)=i=1m(f(xi)y)2+λj=1nw2j L ( w ) = ∑ i = 1 m ( f ( x i ) − y ) 2 + λ ∑ j = 1 n w j 2
为了方便求导会改写为 L(w)=12mi=1m(f(xi)y)2+λj=1nw2j L ( w ) = 1 2 m ∑ i = 1 m ( f ( x i ) − y ) 2 + λ ∑ j = 1 n w j 2

【Lasso回归】

emmm,Lasso回归和Ridge回归其实差不多嘛,主要区别在于正则化项Lasso回归用的是系数的L1范数(曼哈顿距离),即 minw||wTxy||2+λ||w|| min w | | w T x − y | | 2 + λ | | w | |
而Ridge回归用的是系数的L2范数(欧几里得距离)。
Lasso回归损失函数写为 L(w)=i=1m(f(xi)y)2+λj=1n|wj| L ( w ) = ∑ i = 1 m ( f ( x i ) − y ) 2 + λ ∑ j = 1 n | w j |
为了方便求导会改写为 L(w)=12mi=1m(f(xi)y)2+λj=1n|wj| L ( w ) = 1 2 m ∑ i = 1 m ( f ( x i ) − y ) 2 + λ ∑ j = 1 n | w j |

我们根据前一篇的线性回归练习,加上Lasso回归。

model_lasso=linear_model.Lasso(alpha=10)
model_lasso.fit(X_train,y_train)
print(model_lasso.coef_)     #系数,有些模型没有系数(如k近邻)
print(model_lasso.intercept_) #与y轴交点,即截距
y_lasso_pred = model_lasso.predict(X_test)
print("使用Lasso Regression模型的均方误差为:",metrics.mean_squared_error(y_test, y_lasso_pred))
print("使用Lasso Regression模型的均方根误差为:",np.sqrt(metrics.mean_squared_error(y_test, y_lasso_pred)))
输出为:
[ 0.0313973   0.         -0.         -0.72770526]
[ 31.34104409]
使用Lasso Regression模型的均方误差为: 32.9339470534
使用Lasso Regression模型的均方根误差为: 5.7388105957

可以发现对于Lasso或是Ridge都是需要设置 α α (即λ)参数的。我们可以比较一下不同 α α 参数下,模型评分的大小。
此处评分用的是R2score,即决定系数。我们常用决定系数来判断回归模型的拟合程度。

alphas = [0.0001, 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000]
scores1 = []
scores2 = []
for i, alpha in enumerate(alphas):
    model_ridge = linear_model.Ridge(alpha=alpha)
    model_ridge.fit(X_train, y_train)
    scores1.append(model_ridge.score(X_test, y_test))
    model_lasso = linear_model.Lasso(alpha=alpha)
    model_lasso.fit(X_train, y_train)
    scores2.append(model_lasso.score(X_test, y_test))
figure = plt.figure(figsize=(8,6))
ax = figure.add_subplot(1, 1, 1)
ax.plot(alphas, scores1,color='red',lw=1,label='Ridge')
ax.plot(alphas, scores2,lw=1,label='Lasso')
plt.legend(loc='upper right',frameon=False)
ax.set_xlabel(r"$\alpha$")
ax.set_ylabel(r"score")
ax.set_xscale("log")
ax.set_title("Ridge&Lasso")
plt.show()

输出为:
这里写图片描述
Lasso回归可以使得一些特征的w系数均变成0,增强了模型泛化能力

【Elastic Net】

Elastic Net也是对最小二乘法做了正则化处理,它用一个超参数 ρ ρ 来平衡L1和L2正则化的比重,即minw||wTxy||2+λρ||w||+λ(1ρ)2j=1nwj2
在Elastic Net中我们需要注意两个超参数,一个是 λ λ (正则化超参数),一个是ρ(范数权重超参数)。

【逻辑回归】

这是一个名为回归,实质用于分类问题的线性模型(打入回归队伍的分类间谍2333)
在sklearn中,我们可以使用LogisticRegression这个类来做二分类,也可以用one vs rest的方法做多分类。同时,我们还可以选择L1或者L2正则化来防止过拟合。
对于逻辑回归的实践放在下一篇来写,会参照官方文档来看看这个类中的参数、属性和方法。

官方库中还提供了很多线性模型算法库,就不一一细看了,网上已有总结的博文,大家可以去看。http://www.cnblogs.com/pinard/p/6026343.html

参考:
http://scikit-learn.org/stable/modules/linear_model.html
http://www.cnblogs.com/pinard/p/6026343.html
代码保存于:
https://github.com/htshinichi/ML_practice

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值