Lasso回归实验
实验说明
数据集我们使用的是 sklearn包中自带的波士顿房价数据集。
- 实验环境:Pycharm
- Python版本:3.6
- 需要的第三方库:sklearn、numpy
实验步骤
一个简单的 Lasso 回归实验还是那六个步骤:
- 加载数据集
- 拆分数据集
- 创建模型
- 在训练集学习得到模型
- 模型预测
- 模型评测
关于训练集和测试集的划分我们使用的是留出法。至于参数设置,我们设置随机种子为10,学习率为0.1,迭代次数为10000。
最后的结果我们使用四项指标来进行评估:
- 平均绝对误差MAE
- R2得分
代码如下:
# Lasso回归,Boston数据集
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_absolute_error, r2_score
# 加载数据集
boston_data = load_boston()
x = boston_data.data
y = boston_data.target
# 拆分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=10)
# 实例化Lasso模型
lasso = Lasso(alpha=0.1, max_iter=10000)
# 训练模型
lasso.fit(x_train, y_train)
# 输出权重系数
print("coef:", lasso.coef_)
# 输出截距
print("intercept:", lasso.intercept_)
# 模型预测
lasso_predict = lasso.predict(x_test)
# 模型评估
print("MAE: ", mean_absolute_error(y_test, lasso_predict))
print("r2-score: ", r2_score(y_test, lasso_predict))
可以看到,得到的指标为:平均绝对误差MAE为4.23,R2得分为0.64
参数优化
我们发现 R2得分确实有点低,只有 0.64。于是我们采用随机参数搜索的方式进行优化。
划分时随机种子设置为100。给超参数设置范围,采用随机参数选择的方式,10折交叉验证,迭代次数为100,来获得模型的最佳参数。
用最佳参数重新生成模型,再训练模型进行预测。
如果想要弄明白随机搜索的参数具体怎么设置,可以参考这一篇博客 sklearn——参数优化
代码如下:
# Lasso回归,Boston数据集
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.model_selection import RandomizedSearchCV
from sklearn.linear_model import Lasso
from sklearn.metrics import mean_absolute_error, r2_score
import numpy as np
# 加载数据集
boston_data = load_boston()
x = boston_data.data
y = boston_data.target
# 拆分数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=100)
# 设置超参数
alpha = [0.01, 0.005, 0.001, 0.0005, 0.0001, 0.02, 0.05, 0.1, 0.2, 0.5, 1]
max_iter = [int(x) for x in np.linspace(start=1000, stop=10000, num=1000)]
random_state = [int(x) for x in np.linspace(start=10, stop=300, num=10)]
# 参数字典
params_dict = {
'alpha': alpha,
'max_iter': max_iter,
'random_state': random_state
}
# 实例化Lasso模型
lasso = Lasso()
# 随机参数选择
rsCV = RandomizedSearchCV(
estimator=lasso,
param_distributions=params_dict,
n_iter=100,
scoring='r2',
cv=10
)
rsCV.fit(x_train, y_train)
# 输出参数信息
print("最佳度量值:", rsCV.best_score_)
print("最佳参数:", rsCV.best_params_)
print("最佳模型:", rsCV.best_estimator_)
# 用最佳参数生成模型
lasso = Lasso(alpha=rsCV.best_params_['alpha'], max_iter=rsCV.best_params_['max_iter'],
random_state=rsCV.best_params_['random_state'])
# 训练模型
lasso.fit(x_train, y_train)
# 模型预测
lasso_predict = lasso.predict(x_test)
# 模型评估
print("MAE: ", mean_absolute_error(y_test, lasso_predict))
print("r2-score: ", r2_score(y_test, lasso_predict))
可以看到,优化后的模型明显好于之前,平均绝对误差MAE为3.25,R2得分为0.76