5.4 套索回归(Lasso Regression)
5.4.1类
sklearn.linear_model.Lasso(alpha=1.0, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001,warm_start=False, positive=False, random_state=None, selection='cyclic')
5.4.2 参数
参数 |
解释 |
alpha |
float, 默认=1.0.乘以L1项的常数。默认为1.0。alpha=0相当于一个普通的最小二乘法,由线性回归对象求解。由于数值原因,不建议对套索对象使用alpha=0。鉴于此,您应该使用LinearRegression对象。 |
5.4.3 属性
属性 |
解释 |
coef_ |
ndarray of shape (n_features,) or (n_targets, n_features)参数向量(成本函数公式中的w)。 |
dual_gap_ |
float or ndarray of shape (n_targets,)给定param alpha,优化结束时的双间隙,与y的每次观测形状相同。 |
sparse_coef_ |
sparse matrix of shape (n_features, 1) or (n_targets, n_features)拟合系数的稀疏表示。 |
intercept_ |
float or ndarray of shape (n_targets,)决策函数中的独立项。 |
n_iter_ |
int or list of int由坐标下降解算器运行以达到指定公差的迭代次数。 |
5.4.4方法
fit(X, y[, sample_weight, check_input]) |
用坐标下降法拟合模型。 |
get_params([deep]) |
获取此估计器的参数。 |
path(*args, **kwargs) |
用坐标下降法计算弹性网径。 |
predict(X) |
用线性模型预测。 |
score(X, y[, sample_weight]) |
返回预测的确定系数R2。 |
set_params(**params) |
设置此估计器的参数。 |
5.4.5套索回归分析make_regression无噪音数据
from sklearn.linear_model import Lasso def Lasso_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 = lasso().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 Lasso()回归线(无噪音)" myutil.draw_line(X[:,0],y,clf,title) myutil.plot_learning_curve(Lasso(),X,y,title) myutil.show_pic(title)
输出
lr.coef_: [62.99450929] reg.intercept_: 0.04864585261562526 训练集得分: 99.98% 测试集得分: 99.98%
5.4.6套索回归分析make_regression数据
def Lasso_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 = Lasso().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 Lasso()回归线(有噪音)" myutil.draw_line(X[:,0],y,clf,title) myutil.plot_learning_curve(Lasso(),X,y,title) myutil.show_pic(title)
输出
lr.coef_: [67.98691254] reg.intercept_: 1.2985197378140656 训练集得分: 70.20% 测试集得分: 64.14%
5.4.7套索回归分析糖尿病数据
#对套索回归进行分析糖尿病数据 def Lasso_for_for_diabetes(): myutil = util() X,y = datasets.load_diabetes().data,datasets.load_diabetes().target X_train,X_test,y_train,y_test = train_test_split(X, y, random_state=8,test_size=0.3) lr = LinearRegression().fit(X_train,y_train) print('线性回归,糖尿病数据训练集得分: {:.2%}'.format(lr.score(X_train,y_train))) print('线性回归,糖尿病数据测试集得分: {:.2%}'.format(lr.score(X_test,y_test))) title = "线性回归 糖尿病数据" myutil.plot_learning_curve(LinearRegression(),X,y,title) myutil.show_pic(title) ####################################################################### lasso = Lasso().fit(X_train,y_train) print('alpha=1,糖尿病数据训练集得分: {:.2%}'.format(lasso.score(X_train,y_train))) print('alpha=1,糖尿病数据测试集得分: {:.2%}'.format(lasso.score(X_test,y_test))) print('alpha=1,糖尿病数据套索回归特征数: {}'.format(np.sum(lasso.coef_!=0))) title = "Lasso 糖尿病数据 alpha=1" myutil.plot_learning_curve(Lasso(),X,y,title) myutil.show_pic(title) ####################################################################### lasso10 = Lasso(alpha=10).fit(X_train,y_train) print('alpha=10,糖尿病数据训练集得分: {:.2%}'.format(lasso10.score(X_train,y_train))) print('alpha=10,糖尿病数据测试集得分: {:.2%}'.format(lasso10.score(X_test,y_test))) print('alpha=10,糖尿病数据套索回归特征数: {}'.format(np.sum(lasso.coef_!=0))) title = "Lasso 糖尿病数据 alpha=10" myutil.plot_learning_curve(Lasso(alpha=10),X,y,title) myutil.show_pic(title) ####################################################################### lasso01 = Lasso(alpha=0.1).fit(X_train,y_train) print('alpha=0.1,糖尿病数据训练集得分: {:.2%}'.format(lasso01.score(X_train,y_train))) print('alpha=0.1,糖尿病数据测试集得分: {:.2%}'.format(lasso01.score(X_test,y_test))) print('alpha=0.1,糖尿病数据套索回归特征数: {}'.format(np.sum(lasso.coef_!=0))) title = "Lasso 糖尿病数据 alpha= 0.1" myutil.plot_learning_curve(Lasso(alpha=0.1),X,y,title) myutil.show_pic(title) ####################################################################### title = "Lasso 波士顿房价数据 数据分布比较" plt.plot(lasso01.coef_,'s',label='套索回归 alpha=1') plt.plot(lasso0110.coef_,'^',label='套索回归 alpha=10') plt.plot(lasso01.coef_,'v',label='套索回归 alpha=0.1') plt.plot(lr.coef_,'o',label='线性回归 Regression') plt.xlabel(u'系数指数') plt.ylabel(u'系数大小') plt.hlines(0,0,len(lr.coef_)) myutil.show_pic(title)
输出
线性回归,糖尿病数据训练集得分: 53.50% 线性回归,糖尿病数据测试集得分: 45.41% alpha=1,糖尿病数据训练集得分: 36.73% alpha=1,糖尿病数据测试集得分: 38.28% alpha=1,糖尿病数据套索回归特征数: 3 alpha=10,糖尿病数据训练集得分: 0.00% alpha=10,糖尿病数据测试集得分: -0.01% alpha=10,糖尿病数据套索回归特征数: 0 alpha=0.1,糖尿病数据训练集得分: 52.36% alpha=0.1,糖尿病数据测试集得分: 47.71% alpha=0.1,糖尿病数据套索回归特征数: 7
由此可见,Alpha越小,特征数越多。
- alpha=1,特征数为3,得分低,出现欠拟合。
- alpha=0.1,降低alpha值可以加大得分,特征数提高到7。
- alpha=0.01,测试集得分: 0.45<alpha=0.1的测试集得分: 0.48,说明降低alpha值让模型更倾向于出现过拟合现象。
alpha =10 (^ 橘黄色上箭头)
alpha =1 (s 蓝色方块)
alpha = 0.1 (v 绿色下箭头)
线性:(o 红色圆点)