scikit-learn机器学习(二)--岭回归,Lasso回归和ElasticNet回归

scikit-learn机器学习(一)–多元线性回归模型
scikit-learn机器学习(二)–岭回归,Lasso回归和ElasticNet回归
scikit-learn机器学习(三)–逻辑回归和线性判别分析LDA

多元线性回归模型中,为了是均方差误差最小化,常见的做法是引入正则化,正则化就是给对模型的参数或者说是系数添加一些先验假设,控制模型的空间,使模型的复杂度较小。
正则化目的:防止过拟合
正则化本质:约束要优化的参数
正则化会保留样本的所有特征向量,但是会减少样本特征的数量级

关于正则化参考下面这篇博客:
https://blog.csdn.net/kinghannah/article/details/52065924

岭回归,Lasso回归和ElasticNet回归是常见的线性回归正则化方法,方法如下:

这里写图片描述

不同之处:
岭回归是在损失函数中加入L2范数惩罚项来控制模型的复杂度
Lasso回归是基于L1范数的
ElasticNet是岭回归和Lasso回归的融合,利用了L1和L2范数

L1范数和L2范数都可以用来度量向量间的差异,但是两者不同:
L1范数:
表示向量x中非零元素的的绝对值之和,又称为曼哈顿距离,最小绝对误差等,
用于度量向量间差异,如:绝对误差和
这里写图片描述
x1和x2为两个向量
L1范数功能:
可以实现特征稀疏,去掉一些没有信息的特征

**L2范数:
表示向量x中元素的平方和再开平方,如欧式距离,度量向量间差异,如平方差和
这里写图片描述
L2范数功能:
防止模型为了迎合模型训练而过于复杂出现过拟合能力,提高模型的泛化能力。

关于常见的范数介绍:
https://blog.csdn.net/shijing_0214/article/details/51757564

上面主要介绍了关于正则化和范数的问题,下面进入正题:

一丶岭回归

在scikit-learn中Ridge类实现了岭回归模型,依旧利用之前的糖尿病人数据样本集

python实现:

from sklearn import datasets,linear_model,discriminant_analysis
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

#加载数据
def load_data():
    diabetes=datasets.load_diabetes()
    return train_test_split(diabetes.data,diabetes.target,test_size=0.25,random_state=0)

#定义岭回归模型
def test_Ridge(*data):
    x_train,y_train,x_test,y_test=data
    regr=linear_model.Ridge()
    regr.fit(x_train,y_train)
     print('Coefficients:%s,intercept %.2f' % (regr.coef_, regr.intercept_))
    print("Residual sum of square:%.2f" % np.mean((regr.predict(x_test) - y_test) ** 2))
    print('Score:%.2f' % regr.score(x_test, y_test))
    plt.grid()
    plt.show()
x_train,x_test,y_train,y_test=load_data()
test_ridge(x_train,x_test,y_train,y_test)

结果:
这里写图片描述

与前面多元线性回归结果差不多
Ridge类中默认的正则化占比为alpha=1,我们可以修改alpha的值,alpha值越大正则化想的占比越大

不同alpha值,对预测性能的影响不同,给出检测代码:

def test_Ridge_alpha(*data):
    x_train, x_test, y_train, y_test = data
    alphas=[0.01,0.02,0.05,0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000]#alpha列表
    scores=[]#预测性能
    for each in alphas:
        regr = linear_model.Ridge(alpha=each)
        regr.fit(x_train, y_train)
        score=regr.score(x_test,y_test)
        scores.append(score)
    #画图
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    ax.plot(alphas,scores)
    ax.set_xlabel(r"$\alpha$")
    ax.set_ylabel(r"score")
    ax.set_xscale('log')
    ax.set_title("Ridge")
    plt.show()

结果如下:
这里写图片描述

二丶Lasso回归

python代码:
只需要换掉regr=linear_model.Ridge()换成Lasso即可

def test_Lasso(*data):
    x_train, x_test, y_train, y_test = data
    regr=linear_model.Lasso()
    regr.fit(x_train,y_train)
    print('Coefficients:%s,intercept %.2f' % (regr.coef_, regr.intercept_))
    print("Residual sum of square:%.2f" % np.mean((regr.predict(x_test) - y_test) ** 2))
    print('Score:%.2f' % regr.score(x_test, y_test))
    plt.grid()
    plt.show()

结果:
这里写图片描述
不同alpha对性能的影响:
这里写图片描述

三丶ElasticNet回归

ElasticNet回归是利用了L1和L2范数的融合,所以在参数中除了alpha之外还有L1_ratio
默认alpha=1,l1_ratio=0.5

python代码:

def test_ElasticNet(*data):
    x_train, x_test, y_train, y_test = data
    regr=linear_model.ElasticNet()
    regr.fit(x_train,y_train)
    print('Coefficients:%s,intercept %.2f' % (regr.coef_, regr.intercept_))
    print("Residual sum of square:%.2f" % np.mean((regr.predict(x_test) - y_test) ** 2))
    print('Score:%.2f' % regr.score(x_test, y_test))
    plt.grid()
    plt.show()

结果如下:
这里写图片描述

不通alpha值和L1_ratio值对性能的影响:
python代码:

def test_ElasticNet_alpha_l1( *data):
    x_train, x_test, y_train, y_test = data
    alphas=np.logspace(-2,2)
    rhos=np.linspace(0.01,1)
    scores=[]
    for i in alphas:
        for j in rhos:
            regr=linear_model.ElasticNet(alpha=i,l1_ratio=j)
            regr.fit(x_train,y_train)
            scores.append(regr.score(x_test,y_test))
    ##绘图
    alphas,rhos=np.meshgrid(alphas,rhos)
    scores=np.array(scores).reshape(alphas.shape)
    from mpl_toolkits.mplot3d import Axes3D
    from matplotlib import cm
    fig=plt.figure()
    ax=Axes3D(fig)
    surf=ax.plot_surface(alphas,rhos,scores,rstride=1,cstride=1,cmap=cm.jet,linewidth=0,antialiased=False)
    fig.colorbar(surf,shrink=0.5,aspect=5)
    ax.set_title('ElasticNet')
    ax.set_xlabel(r"$\alpha$")
    ax.set_ylabel(r"$\rho$")
    ax.set_zlabel("score")
    plt.show()

结果:
这里写图片描述
ρ影响的是其性能下降速度
α增大,预测性能下降

本博客主要参考:
《Python大战机器学习》

  • 4
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Scikit-learn是一个用于机器学习的Python库,它提供了一系列用于回归分析的算法和工具。其中包括了非线性回归模型的实现。非线性回归是指因变量和自变量之间的关系不是简单的线性关系。 Scikit-learn中的非线性回归模型通过引入非线性的特征变换或者使用非线性的核函数来适应非线性数据关系。我们可以使用花费最小乘法(如岭回归Lasso回归、弹性网络等)或者支持向量回归(SVR)进行非线性回归建模。 非线性回归模型的使用步骤大致如下: 1. 载入数据:将数据导入Python环境,可以使用pandas库加载CSV文件或者直接导入NumPy数组格式的数据。 2. 特征转换:根据实际情况对特征进行非线性转换,例如多项式特征转换(PolynomialFeatures)或者其他的基函数转换。 3. 划分数据集:将数据集划分为训练集和测试集,训练集用于模型参数的学习,测试集用于模型的评估。 4. 模型训练:使用Scikit-learn中的非线性回归模型进行训练,例如岭回归Lasso回归、弹性网络或者支持向量回归(SVR)等。 5. 模型评估:根据测试集上的表现指标,如均方误差(Mean Squared Error)、R平方值(R-squared)等评估模型的性能。 6. 模型预测:使用训练好的模型对新样本进行预测,得到预测结果。 Scikit-learn非线性回归模型的优点是具有灵活性和可解释性。同时,Scikit-learn库还提供了交叉验证、特征选择、模型选择等功能,可以帮助我们更好地进行非线性回归问题的建模和评估。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值