线性模型
一般我们可以把线性模型写作:
的形式。sklearn中列举了线性回归、岭回归、lasso回归等线性模型,模型实在是多⊙▽⊙”,现将几个我印象比较深的做一下整理。
为了方便起见,我们令
,因此预测值
,真实值为
,样本数量为m个,即
;特征为n个,即
。
【线性回归】
线性回归采用的是最小二乘法的思想,即使所有预测值
与其真实值
的欧氏距离的平方最小,
其损失函数写为:
有时为了方便求导会改写为
【Ridge回归】
岭回归,其实就是在线性回归的最小二乘法基础上加了正则化项(有时也喜欢叫惩罚项)。
主要是因为最小二乘法采用的是无偏估计,它的无偏性导致其对病态数据会很敏感,比如出现了一个离所有数据都很远的数据,为了最小化所有数据到拟合模型的距离之和最小,我们的模型必然会偏向这个数据,这样我们的模型的拟合效果并不符合实际。(其实也就是过拟合现象,众所周知,我们常用正则化来处理过拟合现象)
因此,岭回归针对最小二乘法进行了改进,即
,观察这个公式我们可以发现
越大,我们为了使
最小,必须使
越小越好。
下图是
和系数
的关系,我们可以看出,当
很大,
趋向于0;而当
趋于0时,此时的系数
趋于一般最小二乘法的解,系数会出现很大的振荡。因此我们有必要调整
,保持这两者之间的平衡。(在官方库中
是用
表示的)
岭回归损失函数写为
为了方便求导会改写为
【Lasso回归】
emmm,Lasso回归和Ridge回归其实差不多嘛,主要区别在于正则化项Lasso回归用的是系数的L1范数(曼哈顿距离),即
而Ridge回归用的是系数的L2范数(欧几里得距离)。
Lasso回归损失函数写为
为了方便求导会改写为
我们根据前一篇的线性回归练习,加上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回归可以使得一些特征的
系数均变成0,增强了模型泛化能力
【Elastic Net】
Elastic Net也是对最小二乘法做了正则化处理,它用一个超参数
来平衡L1和L2正则化的比重,即
在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