弹性网络ElasticNet是同时使用了系数向量的 l1 范数和 l2 范数的线性回归模型,使得可以学习得到类似于Lasso的一个稀疏模型,同时还保留了 Ridge 的正则化属性,结合了二者的优点,尤其适用于有多个特征彼此相关的场合。
alpha: a值。
fit_intercept:一个布尔值,指定是否需要计算b值。如果为False,那么不计算b值(模型会认为你已经将数据中心化了)。
max_iter:整数值,指定最大迭代次数。
normalize:一个布尔值。如果为True,那么训练样本会在回归之前被归一化。
copy_X:一个布尔值,如果为True,则会复制X值
precompute:一个布尔值或者一个序列。他决定是否提前计算Gram矩阵来加速计算。
tol:一个浮点数,指定判断迭代收敛与否的阈值。
warm_start:一个布尔值,如为True,那么使用前一次训练结果继续训练。否则重头开始训练。
positive:一个布尔值,如为Ture,那么强制要求全中响亮的分量都为整数。
selection:一个字符串,可以为‘cyclic’(更新时候,从前向后一次选择权重向量的一个分量来更新)或者‘random’(随机选择权重向量的一个分量来更新),他指定了当每轮迭代的时候,选择权重向量的一个分量来更新
random_state:一个整数或者一个RandomState实例,或者为None。如果为整数,则他指定了随机数生成器种子。如果为RandomState实例,则指定了随机数生成器。如果为None,则使用默认的随机数生成器。
%config InteractiveShell.ast_node_interactivity = 'all' #同时输出多行结果
from sklearn.linear_model import ElasticNet
reg = ElasticNet(alpha=1.0, l1_ratio=0.7)
X = [[3], [8]]
y = [1, 2]
reg.fit(X, y)
ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7,
max_iter=1000, normalize=False, positive=False, precompute=False,
random_state=None, selection='cyclic', tol=0.0001, warm_start=False) #参数含义和lasso和ridge类似
reg.predict([[6]])
reg.coef_
reg.intercept_
ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7,
max_iter=1000, normalize=False, positive=False, precompute=False,
random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.7,
max_iter=1000, normalize=False, positive=False, precompute=False,
random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
array([1.54198473])
array([0.08396947])
1.0381679389312977
#修改参数比较结果
reg = ElasticNet(alpha=1.0, l1_ratio=0.3) # 修改参数,进行对比
reg.fit(X, y)
ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3,
max_iter=1000, normalize=False, positive=False, precompute=False,
random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
reg.predict([[6]])
reg.coef_
reg.intercept_
ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3,
max_iter=1000, normalize=False, positive=False, precompute=False,
random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
ElasticNet(alpha=1.0, copy_X=True, fit_intercept=True, l1_ratio=0.3,
max_iter=1000, normalize=False, positive=False, precompute=False,
random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
array([1.56834532])
array([0.13669065])
0.748201438848921
#利用IRIS数据集进行弹性网络回归
import pandas as pd
import numpy as np
from sklearn.datasets import load_iris
from sklearn import linear_model
from sklearn import metrics
#导入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
ElasticNet(alpha=0.1, copy_X=True, fit_intercept=True, l1_ratio=0.5,
max_iter=1000, normalize=False, positive=False, precompute=False,
random_state=None, selection='cyclic', tol=0.0001, warm_start=False)
RMSE: 0.25040264500501913