机器学习之线性回归

以kaggle上的House Prices: Advanced Regression Techniques为例讲述线性回归

from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV

1、回归模型

(1)一般线性回归:Linear Regression without regularization


from sklearn.linear_model import LinearRegression

lr = LinearRegression()

lr.fit(X_train, y_train)

model = lr

rmse= np.sqrt(-cross_val_score(model, X_train, y_train, scoring = scorer, cv = 10))   #根均方误差

y_train_pred = lr.predict(X_train)

y_test_pred = lr.predict(X_test)


RMSE on Training set : 0.3887932081355326
RMSE on Test set : 0.42716116210823174

(2)岭回归:Linear Regression with Ridge regularization——L2正则化

采用正则化:处理共线性,滤除噪声,防止过拟合;

原理:引入额外的信息偏差,来惩罚极端参数权重;


from sklearn.linear_model import RidgeCV

ridge = RidgeCV(alphas = [0.01, 0.03, 0.06, 0.1, 0.3, 0.6, 1, 3, 6, 10, 30, 60])

ridge.fit(X_train, y_train)

alpha = ridge.alpha_

ridge = RidgeCV(alphas = [alpha * .6, alpha * .65, alpha * .7, alpha * .75, alpha * .8, alpha * .85, 

                          alpha * .9, alpha * .95, alpha, alpha * 1.05, alpha * 1.1, alpha * 1.15,

                          alpha * 1.25, alpha * 1.3, alpha * 1.35, alpha * 1.4], 

                cv = 10)

ridge.fit(X_train, y_train)

alpha = ridge.alpha_

model = ridge

rmse= np.sqrt(-cross_val_score(model, X_train, y_train, scoring = scorer, cv = 10))   #根均方误差

y_train_rdg = ridge.predict(X_train)

y_test_rdg = ridge.predict(X_test)


Ridge RMSE on Training set : 0.11540572328450796
Ridge RMSE on Test set : 0.11642721377799556

(3)使用Lasson正则化的线性回归:Linear Regression with Lasso regularization——L1正则化

LASSO:以最小绝对收缩和选择算子为代表,简单地用权重的绝对值之和替换权重的平方。

与L2正则化相反,L1正则化产生稀疏特征向量,使得大多数特征权重为0。

如果高维数据集具有许多不相关的特征,则稀疏性会很有帮助。


from sklearn.linear_model import LassoCV

lasso = LassoCV(alphas = [0.0001, 0.0003, 0.0006, 0.001, 0.003, 0.006, 0.01, 0.03, 0.06, 0.1, 

                          0.3, 0.6, 1], 

                max_iter = 50000, cv = 10)

lasso.fit(X_train, y_train)

alpha = lasso.alpha_

lasso = LassoCV(alphas = [alpha * .6, alpha * .65, alpha * .7, alpha * .75, alpha * .8, 

                          alpha * .85, alpha * .9, alpha * .95, alpha, alpha * 1.05, 

                          alpha * 1.1, alpha * 1.15, alpha * 1.25, alpha * 1.3, alpha * 1.35, 

                          alpha * 1.4], 

                max_iter = 50000, cv = 10)

lasso.fit(X_train, y_train)

alpha = lasso.alpha_

model = lasso

rmse= np.sqrt(-cross_val_score(model, X_train, y_train, scoring = scorer, cv = 10))   #根均方误差

y_train_las = lasso.predict(X_train)
y_test_las = lasso.predict(X_test)


Lasso RMSE on Training set : 0.11411150837458062
Lasso RMSE on Test set : 0.11583213221750702

(4)使用ElsticNet正则化的线性回归:Linear Regression with ElasticNet regularization——L1和L2正则化

ElasticNet是Ridge和Lasso回归之间的折中,用L1产生稀疏性,用L2克服Lasso的一些限制(例如LASSO不能选择比观察更多的特征)


import sklearn.linear_model import ElasticNetCV

elasticNet = ElasticNetCV(l1_ratio = [0.1, 0.3, 0.5, 0.6, 0.7, 0.8, 0.85, 0.9, 0.95, 1],

                          alphas = [0.0001, 0.0003, 0.0006, 0.001, 0.003, 0.006, 

                                    0.01, 0.03, 0.06, 0.1, 0.3, 0.6, 1, 3, 6], 

                          max_iter = 50000, cv = 10)

elasticNet.fit(X_train, y_train)

alpha = elasticNet.alpha_

ratio = elasticNet.l1_ratio_

elasticNet = ElasticNetCV(l1_ratio = [ratio * .85, ratio * .9, ratio * .95, ratio, ratio * 1.05, ratio * 1.1, ratio * 1.15],

                          alphas = [0.0001, 0.0003, 0.0006, 0.001, 0.003, 0.006, 0.01, 0.03, 0.06, 0.1, 0.3, 0.6, 1, 3, 6], 

                          max_iter = 50000, cv = 10)

elasticNet.fit(X_train, y_train)

if (elasticNet.l1_ratio_ > 1):

    elasticNet.l1_ratio_ = 1    

alpha = elasticNet.alpha_

ratio = elasticNet.l1_ratio_



elasticNet = ElasticNetCV(l1_ratio = ratio,

                          alphas = [alpha * .6, alpha * .65, alpha * .7, alpha * .75, alpha * .8, alpha * .85, alpha * .9, 

                                    alpha * .95, alpha, alpha * 1.05, alpha * 1.1, alpha * 1.15, alpha * 1.25, alpha * 1.3, 

                                    alpha * 1.35, alpha * 1.4], 

                          max_iter = 50000, cv = 10)

elasticNet.fit(X_train, y_train)

if (elasticNet.l1_ratio_ > 1):

    elasticNet.l1_ratio_ = 1    

alpha = elasticNet.alpha_

ratio = elasticNet.l1_ratio_


model = elasticNet

rmse= np.sqrt(-cross_val_score(model, X_train, y_train, scoring = scorer, cv = 10))   #根均方误差

y_train_ela = elasticNet.predict(X_train)

y_test_ela = elasticNet.predict(X_test)


ElasticNet RMSE on Training set : 0.11411150837458062
ElasticNet RMSE on Test set : 0.11583213221750702

此处ratio=1,即完全使用L1正则化,LASSO回归

posted @ 2019-01-13 20:22  hugechuanqi  阅读(368)  评论(0编辑  收藏  举报