5.2 岭(Ridge)回归、套索(Lasso)回归与弹性网络(Elastic Net)的基本概念
有些数据是不太符合线性关系的,但是我们还是希望使用线性回归,在这里数学家加入了正则化Regularization的概念。
5.2.1 岭回归(Ridge Regression)
正则化Regularization为所有系数的平方和,即L2范数,对应的回归方法叫做Ridge回归,岭回归。
岭回归(英文名:Ridge Regression, Tikhonov Regularization)由前苏联安德烈·季霍诺夫 20世纪40年代提出。它是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。岭回归牺牲训练集得分,获得测试集得分。适合密集矩阵。
5.2.2 套索回归(Lasso Regression)
所有系数绝对值之和,即L1范数,对应的回归方法叫做套索(Lasso)回归。
在实践中,岭回归与套索回归首先岭回归。如果特征特别多,而某些特征更重要,具有选择性,那就选择套索(Lasso)回归可能更好。它适合稀疏矩阵。套索(Lasso)回归由加拿大学者罗伯特·提布什拉尼 1996年提出。
5.2.3 弹性网络(Elastic Net)
l弹性网络 是一种使用 L1, L2 范数作为先验正则项训练的线性回归模型。
l这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像 Lasso 一样,但是它仍然保持 一些像 Ridge 的正则性质。我们可利用 L1_ratio 参数控制 L1 和 L2 的凸组合。
l弹性网络在很多特征互相联系的情况下是非常有用的。Lasso 很可能只随机考虑这些特征中的一个,而弹性网络更倾向于选择两个。
l在实践中,Lasso 和 Ridge 之间权衡的一个优势是它允许在循环过程(Under rotate)中继承 Ridge 的稳定性。
5.3 岭(Ridge)回归
Sklearn类的岭(Ridge)回归以sklearn.linear_model.Ridge来实现。
类
sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver='auto')
属性
属性 |
解释 |
alpha |
{float, ndarray of shape (n_targets,)}, 默认=1.0 正则化强度;必须是正浮点数。正则化改进了问题的条件,减少了估计的方差。值越大,正则化越强。Alpha对应于其他线性模型中的1/(2C),如logisticsregression或LinearSVC。如果传递了数组,则假定惩罚是特定于目标的。因此它们在数量上必须一致。 |
solver |
{'auto','svd','cholesky','lsqr','sparse_cg','sag','saga'}, 默认='auto' 在计算例程中使用的解算器: •'auto'根据数据类型自动选择解算器。 •'svd'使用X的奇异值分解来计算岭系数。对于奇异矩阵,比'cholesky'更稳定。 •'cholesky'使用标准scipy.linalg.solve解决方案函数以获得闭式解。 •'sparse_cg'使用共轭梯度解算器,如中所示scipy.sparse.linalg.cg。作为一种迭代算法,该求解器比'cholesky'更适用于大规模数据(可以设置tol和max iter)。 •'lsqr'使用专用的正则化最小二乘例程scipy.sparse.linalg.lsqr。它是最快的,并且使用迭代过程。 •'sag'使用随机平均梯度下降,'sag'使用改进的无偏版本saga。这两种方法也都使用迭代过程,并且当n_samples和n_features都很大时,通常比其他解算器更快。 |
coef_ |
ndarray of shape (1, n_features) or (n_classes, n_features).权重向量。 |
intercept_ |
float or ndarray of shape (n_targets,)决策函数中的独立项。如果fit_intercept=False,则设置为0.0。 |
n_iter_ |
None or ndarray of shape (n_targets,).每个目标的实际迭代次数。仅适用于sag和lsqr解算器。其他解算器将不返回任何值。 |
方法
fit(X, y[, sample_weight]) |
拟合岭回归模型。 |
get_params([deep]) |
获取此估计器的参数。 |
predict(X) |
用线性模型预测。 |
score(X, y[, sample_weight]) |
返回预测的确定系数R2。 |
set_params(**params) |
设置此估计器的参数。 |
5.3.1 对无噪音make_regression数据进行岭回归
from sklearn.linear_model import Ridge def Ridge_for_make_regression(): myutil = util() X,y = make_regression(n_samples=100,n_features=1,n_informative=2,random_state=8) X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3) clf = Ridge().fit(X,y) print('lr.coef_: {} '.format(clf.coef_[:])) print('reg.intercept_: {}'.format(clf.intercept_)) print('训练集得分: {:.2%}'.format(clf.score(X_train,y_train))) print('测试集得分: {:.2%}'.format(clf.score(X_test,y_test))) title = "make_regression Ridge()回归线(无噪音)" myutil.draw_line(X[:,0],y,clf,title) cv = ShuffleSplit(n_splits=100,test_size=0.2,random_state=0) myutil.plot_learning_curve(clf,title,X,y,ylim=(0.9,1.01),cv=cv)
输出
lr.coef_: [63.7840862] reg.intercept_: 4.440892098500626e-15 训练集得分: 100.00% 测试集得分: 100.00%
5.3.2 对有噪音make_regression数据进行岭回归
def Ridge_for_make_regression_add_noise(): myutil = util() X,y = make_regression(n_samples=100,n_features=1,n_informative=2,noise=50,random_state=8) X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3) clf = Ridge().fit(X,y) print('lr.coef_: {} '.format(clf.coef_[:])) print('reg.intercept_: {}'.format(clf.intercept_)) print('训练集得分: {:.2%}'.format(clf.score(X_train,y_train))) print('测试集得分: {:.2%}'.format(clf.score(X_test,y_test))) title = "make_regression LinearRegression()回归线(有噪音)" myutil.draw_line(X[:,0],y,clf,title) cv = ShuffleSplit(n_splits=100,test_size=0.2,random_state=0) myutil.plot_learning_curve(clf,title,X,y,ylim=(0.9,1.01),cv=cv)
输出
lr.coef_: [68.77648945] reg.intercept_: 1.2498738851984426 训练集得分: 70.18% 测试集得分: 64.27%
由此可见,使用岭回归,对有噪音make_regression数据结果是非常不理想的。