• 注册
当前位置:1313e > python >正文

python数据拟合固定参数_ElasticNet回归的python实现及与岭回归、lasso的效果比较

13524e4ea533b08b4fa2ba7ca5df428b.png

1. ElasticNet回归与岭回归、Lasso回归

ElasticNet回归也叫弹性网络回归,是岭回归和Lasso回归的组合,而说起Lasso回归和岭回归,就不得不说起回归的正则化。正则化是用于解决回归里的过拟合问题,即我们的算法过度拟合了数据,导致算法的泛化能力不足,在新的数据集中预测的效果很差。如下图的蓝色曲线所示,它拟合了训练数据的所有点,但是一旦换了新的训练数据,其效果就可能很差,这就是过拟合问题。

978db44eaf4a1cb343b6b6059da5d4f6.png

正则化就是解决过拟合问题的一种方法,它采用的是在原有模型中加入一个正则化项或惩罚项,比如数据的平方项或绝对值项,从而影响每次训练的损失函数,使得在训练数据上的偏差较大,在未知数据上的方差较小,从而避免过拟合问题。其效果如上图的红色曲线所示。

具体来说,岭回归就是在损失函数中加入了平方和的正则化方法(l2正则),即:

854361b76274059e3c530d65a8f745e8.png

Lasso回归就是在损失函数中加入了绝对值和的正则化方法(l1正则),即:

77c6485fc0be9c1c6990f492601109a3.png

而ElasticNet回归则是融合了两种正则方法,即:

0d675261221d4b46c179bd68d7277a08.png

2. ElasticNet回归的Python实现

ElasticNet回归在Python中有sklearn.linear_model.ElasticNetCV和sklearn.linear_model.ElasticNet两个函数可供选择,直接可以调用函数,以sklearn.linear_model.ElasticNet为例,我们采用Python自带的iris数据库来进行训练与效果评价。

#导入基本程序包
import pandas  as pd
import numpy  as np
from sklearn.datasets import load_iris
from sklearn import linear_model#导入IRIS数据集 
iris = load_iris() #特征矩阵 
X=iris.data #目标向量 
y=iris.target
from sklearn.cross_validation import train_test_split #导入数据划分包
#以20%的数据构建测试样本,剩余作为训练样本
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.20,random_state =1)
elastic= linear_model.ElasticNet(alpha=0.1,l1_ratio=0.5)  # 设置lambda值,l1_ratio值
elastic.fit(X_train,y_train)  #使用训练数据进行参数求解
y_hat2 = elastic.predict(X_test)  #对测试集的预测
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat2)))  #计算RMSE
得到结果为RMSE: 0.250402645005019

这里需要注意的是,ElasticNet最基本的参数是alpha、l1_ratio,alpha其正则化选项中的λ,l1_ratio则是对应α。这里的random_state就是为了保证程序每次运行都分割一样的训练集和测试集。

3、ElasticNet回归与岭回归、lasso的效果比较

我们将ElasticNet回归得到的RMSE评价效果与岭回归、lasso进行比较,如下:

ridge= linear_model.Ridge(alpha=0.1)  # 设置lambda值
ridge.fit(X_train,y_train)  #使用训练数据进行参数求解
y_hat = ridge.predict(X_test)  #对测试集的预测
from sklearn import metrics  #导入metrics评价模块
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat)))  #计算RMSE
得到岭回归的RMSE: 0.24949141419802712
lasso= linear_model.Lasso(alpha=0.1)  # 设置lambda值
lasso.fit(X_train,y_train)  #使用训练数据进行参数求解
y_hat1 = lasso.predict(X_test)  #对测试集的预测
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat1)))  #计算RMSE   
lasso= linear_model.Lasso(alpha=0.1)  # 设置lambda值
lasso.fit(X_train,y_train)  #使用训练数据进行参数求解
y_hat1 = lasso.predict(X_test)  #对测试集的预测
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat1)))  #计算RMSE

得到岭回归的RMSE: 0.24949141419802712;得到Lasso回归的RMSE: 0.25558013168847055

这是我们看到,在相同的lambda值下,ElasticNet回归的RMSE介于岭回归、lasso之间,即比Lasso回归的效果好,比岭回归的效果差。

但是我们可以调整ElasticNet回归的l1_ratio值,此时ElasticNet回归会在l1正则、l2正则有不同的倾斜,因而得到不同的结果:

elastic1= linear_model.ElasticNet(alpha=0.1,l1_ratio=0.4)  # 设置lambda值,l1_ratio值
elastic1.fit(X_train,y_train)  #使用训练数据进行参数求解
y_hat3 = elastic1.predict(X_test)  #对测试集的预测
print ("RMSE:", np.sqrt(metrics.mean_squared_error(y_test, y_hat3)))  #计算RMSE

如上,我们设置l1_ratio=0.4,最终得到的RMSE: 0.24517143123222396,小于岭回归和Lasso,效果较好。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录
相关推荐