5.2 Lasso回归分析

最小绝对收缩和选择算子回归(通常简单地称为Lasso回归),实际上是在多元线性回归上增加了一个惩罚范数l1,范数起到了增强模型稳定性、筛选模型特征的效果
Lasso回归成本函数
在这里插入图片描述
使用糖尿病数据集

# Lasso回归分析
## 加载包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
## 图像在jupyter notebook中显示
%matplotlib inline
## 显示的图片格式(mac中的高清格式),还可以设置为"bmp"等格式
%config InlineBackend.figure_format = "retina"
## 输出图显示中文
from matplotlib.font_manager import FontProperties
fonts = FontProperties(fname = "D:\Desktop\python在机器学习中的应用\方正粗黑宋简体.ttf",size=14)
import statsmodels.api as sm
import statsmodels.formula.api as smf
from sklearn import metrics
from sklearn.model_selection import train_test_split
## 忽略提醒
import warnings
warnings.filterwarnings("ignore")
## 糖尿病数据集
diabete = pd.read_csv("D:\Desktop\python在机器学习中的应用\diabetes.csv",sep="\t")
# ,sep="\t"以逗号作为分隔符
print(diabete.sample(5))

在这里插入图片描述

## 分析数据间的相关性
datacor = np.corrcoef(diabete,rowvar=0)
datacor = pd.DataFrame(data=datacor,columns=diabete.columns,index=diabete.columns)
## 热力图可视化相关系数
plt.figure(figsize=(8,8))
ax = sns.heatmap(datacor,square=True,annot=True,fmt = ".3f",
                 linewidths=.5,cmap="YlGnBu",
                 cbar_kws={"fraction":0.046, "pad":0.03})
ax.set_title("数据变量相关性",fontproperties = fonts)
plt.show()

在这里插入图片描述

## 定义回归函数
from sklearn.linear_model import  Lasso
from sklearn.metrics import r2_score,mean_absolute_error
def lasso_regression(data,test, predictors,pre_y, alpha):
# data 训练集,test 测试集, 
#predictors 自变量名称,pre_y 因变量名称, alpha 惩罚系数
# 拟合模型
    lassoreg = Lasso(alpha=alpha,normalize=True, 
                 max_iter=1e5,fit_intercept=False)
    lassoreg.fit(data[predictors],data[pre_y])
    y_pred = lassoreg.predict(test[predictors])
# 输出模型的结果
    ret = [alpha]
    ret.append(r2_score(test[pre_y],y_pred))
    ret.append(mean_absolute_error(test[pre_y],y_pred))
    ret.extend(lassoreg.coef_)
    return ret
## 建立lasso回归模型
# 初始化预测自变量 和预测因变量
predictors= ['AGE', 'SEX', 'BMI', 'BP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
prey = "Y"
# 定义alpha的取值范围
alpha_lasso = np.linspace(0.00005,2,20)
# 初始化数据表用来保存系数和得分
col = ['alpha','r2_score','mae','AGE', 'SEX', 'BMI', 'BP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
ind = ['alpha_%.2g'%alpha_lasso[i] for i in range(0,len(alpha_lasso))]
coef_matrix_lasso = pd.DataFrame(index=ind, columns=col)
## 百分之80的数据用于训练,剩余的数据用于测试
np.random.seed(123456)
index = np.random.permutation(diabete.shape[0])
trainindex = index[0:350]
testindex = index[350:-1]
diabete_train = diabete.iloc[trainindex,:]
diabete_test = diabete.iloc[testindex,:]

# 迭代alpha值:
for i in range(len(alpha_lasso)):
    coef_matrix_lasso.iloc[i] = lasso_regression(diabete_train,diabete_test,predictors,prey, alpha_lasso[i])
coef_matrix_lasso.sort_values("mae").head(5)

在这里插入图片描述
alpha_0.42时,mse(绝对误差)最小,在alpha_0.74时AGE、S5的系数为0,没有参与回归模型,即食用范数约束将这两个变量剔除了,下面回执的图像反映了在不同alpha下每个自变量系数的变化和平均绝对值误差(mse)的变化情况

ploty = ['AGE', 'SEX', 'BMI', 'BP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
shape = ["s","p","*","h","+","x","D","o","v",">"]
plt.figure(figsize=(15,6))
plt.grid("on")
plt.subplot(1,2,1)
for ii in np.arange(len(ploty)):
    plt.plot(coef_matrix_lasso["alpha"],coef_matrix_lasso[ploty[ii]],
             color = plt.cm.Set1(ii / len(ploty)),label = ploty[ii],
            marker = shape[ii])
    
    plt.legend()
    plt.xlabel("Alpha")
    plt.ylabel("标准化系数",FontProperties = fonts)
    

plt.subplot(1,2,2)
plt.plot(coef_matrix_lasso["alpha"],coef_matrix_lasso["mae"],linewidth = 2)
plt.xlabel("Alpha")
plt.ylabel("绝对值误差",FontProperties = fonts)
plt.suptitle("Lasso回归分析",FontProperties = fonts)
plt.show()

在这里插入图片描述

# 对全部的数据集拟合模型
lassoreg = Lasso(alpha=0.736874,normalize=True, 
                 max_iter=1e5,fit_intercept=False)
lassoreg.fit(diabete[predictors],diabete[prey])
Y_pre = lassoreg.predict(diabete[predictors])
## 绘制回归的预测结果和原始数据的差异
index = np.argsort(diabete.Y)
plt.figure(figsize=(12,5))
plt.plot(np.arange(diabete.shape[0]),diabete.Y[index],"r",label = "Original Y")
plt.plot(np.arange(diabete.shape[0]),Y_pre[index],"b--",label = "Prediction")
plt.legend()
plt.grid("on")
plt.xlabel("Index")
plt.ylabel("Y")
plt.title("Lasso回归结果对比",FontProperties = fonts)
plt.show()

在这里插入图片描述
缺点:波动较大

  • 14
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桃子技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值