简单线性回归Lasso的应用及画图(三)

        上篇提到了Ridge,表现很好,避免了过拟合的情况,本文使用的模型是Lasso模型,就是在损失函数中加入了L1正则项,函数 表达式如下:

代码如下:

import numpy as np
from sklearn.linear_model import LassoCV
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.exceptions import ConvergenceWarning
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False

import warnings

warnings.filterwarnings(action='ignore', category=ConvergenceWarning)
np.random.seed(0)
np.set_printoptions(linewidth=1000)
N = 7
x = np.linspace(0, 6, N) +  0.5 * np.random.randn(N)
x = np.sort(x)
y = x ** 2 - 4 * x - 3 +  2 * np.random.randn(N)
x.shape = -1, 1 # 将一维转换成二维
y.shape = -1, 1

model = Pipeline([('poly', PolynomialFeatures()), ('linear', LassoCV(alphas=np.logspace(-3, 1, 50), 
                                                                     fit_intercept=False))])
np.set_printoptions(suppress=True)
plt.figure(figsize=(15, 12), facecolor='w')
d_pool = np.arange(1, N, 1)  # 阶
m = d_pool.size
    
title = 'Lasso回归'
plt.figure(figsize=(10, 8), facecolor='w')
plt.plot(x, y, 'ro', ms=20, zorder=N)
for i, d in enumerate(d_pool):
    print()
    model.set_params(poly__degree=d)
    model.fit(x, y.ravel())
    lin = model.get_params('linear')['linear']
    output = '%s:%d阶,系数为:' % (title, d)
    if hasattr(lin, 'alpha_'):
        idx = output.find('系数')
        output = output[:idx] + ('alpha=%.6f,' % lin.alpha_) + output[idx:]
    
    print(output, lin.coef_.ravel()) # 权重向量
    x_hat = np.linspace(x.min() - 1 , x.max() + 1, num=100)
    x_hat.shape = -1, 1
    y_hat = model.predict(x_hat)
    s = model.score(x, y)
    print('预测性能得分(R2):', s, '\n')
    
    z = N - 1 if (d == 2) else 0 
    # z是下面画图中的zorder参数的值,是指该线在图中的级别,数值越大,级别越高,
    # 在多线交叉时会显示在最上面,也就是会压住其他的线显示在最前面,这里是设置二阶拟合的级别最高
    label = '%d阶,$R^2$=%.3f' % (d, s)
    plt.plot(x_hat, y_hat, lw=5, alpha=1, label=label, zorder=z)

plt.legend(loc='upper left', facecolor='w', edgecolor='blue', fontsize='xx-large')
plt.grid(True)
plt.title(title, fontsize=18)
plt.xlabel('X', fontsize=16)
plt.ylabel('Y', fontsize=16)

plt.tight_layout(1, rect=(0, 0, 1, 0.95)) 
# tight_layout会自动调整子图参数,调整子图之间的间隔来减少堆叠,使之填充整个图像区域。
plt.suptitle('多项式曲线拟合比较', fontsize=22)
plt.show()

结果如下:

Lasso回归:1阶,alpha=0.409492,系数为: [-9.40044346  2.70249959]
预测性能得分(R2): 0.8223147303876452 


Lasso回归:2阶,alpha=0.281177,系数为: [-3.67532658 -2.70171287  0.82158722]
预测性能得分(R2): 0.9832461646064593 


Lasso回归:3阶,alpha=3.906940,系数为: [-0.         -0.         -0.54013885  0.13101959]
预测性能得分(R2): 0.6874609149073186 


Lasso回归:4阶,alpha=10.000000,系数为: [-0.         -0.         -0.         -0.07023922  0.01833554]
预测性能得分(R2): 0.6211160583873003 


Lasso回归:5阶,alpha=0.868511,系数为: [-0.36937929 -3.18728576 -0.          0.19377276  0.00562143 -0.00247015]
预测性能得分(R2): 0.9359952950972081 


Lasso回归:6阶,alpha=1.264855,系数为: [-0.         -2.76007908 -0.02129468  0.08959993  0.02364026 -0.00090978 -0.00031803]
预测性能得分(R2): 0.90503176902897 

画出的图形如下:

如图和系数可以看到效果不如Ridge的效果,尤其是系数中出现了很多0的现象,这就是Lasso的一大特性,Lasso具有特征选择的功能。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值