基于LASSO的波士顿房价分析

1. 作者介绍

符振涛,男,西安工程大学电子信息学院,2021级研究生
研究方向:机器视觉与人工智能
电子邮件:[email protected]

吴燕子,女,西安工程大学电子信息学院,2021级研究生,张宏伟人工智能课题组
研究方向:人工智能与模式识别
电子邮件:[email protected]

2. 算法介绍

2.1 Lasso算法介绍

Lasso(least absolute shrinkage and selection operator,又译最小绝对值收敛和选择算子、套索算法)。是一种同时进行特征选择和正则化的回归分析方法。它通过构造一个惩罚函数得到一个较为精炼的模型,使得它压缩一些回归系数,即强制系数绝对值之和小于某个固定值;同时设定一些回归系数为零。
保留了子集收缩的优点,是一种处理具有复共线性数据的有偏估计。
擅长处理具有多重共线性的数据。

2.2 公式分析

在这里插入图片描述
LASSO就是在普通线性模型中增加了L1正则化惩罚项.其中正则化项是:在这里插入图片描述

2.3 特点分析

在这里插入图片描述
红色的椭圆代表的是随着λ的变化所得到的残差平方和,βˆ为椭圆的中心点,为对应普通线性模型的最小二乘估计。等高线和约束域的切点就是目标函数的最优解,对于Lasso方法,其约束域是正方形,会存在与坐标轴的切点,使得部分维度特征权重为0,因此很容易产生稀疏的结果。
所以,Lasso方法可以达到变量选择的效果,将不显著的变量系数压缩至0。
在这里插入图片描述

3. 实验过程

3.1 数据集介绍

使用sklearn.datasets.load_boston即可加载相关数据。该数据集是一个回归问题。每个类的观察值数量是均等的,共有 506 个观察,13 个输入变量和1个输出变量。
每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率,一氧化氮浓度,住宅平均房间数,到中心区域的加权距离以及自住房平均房价等等。
在这里插入图片描述

3.2 实验代码

#########导入波士顿房价数据集,以及设定alpha参数

from sklearn.linear_model import Lasso,Ridge
from sklearn.model_selection import train_test_split 
import matplotlib.pyplot as plt
import numpy as np
import mglearn
# 读取数据,并划分训练集和测试集
X,y = mglearn.datasets.load_extended_boston()
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=42)
# 通过设置不同的alpha值建立三个lasso实例
lasso = Lasso().fit(X_train,y_train)
lasso001 =Lasso(alpha=0.01).fit(X_train,y_train)
lasso00001 = Lasso(alpha=0.0001).fit(X_train,y_train)
# 输出三个不同alpha值的结果
print('**********************************')
print("Lasso alpha=1")
print ("training set score:{:.2f}".format(lasso.score(X_train,y_train)))
print ("test set score:{:.2f}".format(lasso.score(X_test,y_test)))
print ("Number of features used:{}".format(np.sum(lasso.coef_!=0)))

print('**********************************')
print("Lasso alpha=0.01")
print ("training set score:{:.2f}".format(lasso001.score(X_train,y_train)))
print ("test set score:{:.2f}".format(lasso001.score(X_test,y_test)))
print ("Number of features used:{}".format(np.sum(lasso001.coef_!=0)))

print('**********************************')
print("Lasso alpha=0.0001")
print ("training set score:{:.2f}".format(lasso00001.score(X_train,y_train)))
print ("test set score:{:.2f}".format(lasso00001.score(X_test,y_test)))
print ("Number of features used:{}".format(np.sum(lasso00001.coef_!=0)))
# 建立岭回归实例
ridge01 = Ridge(alpha=0.1).fit(X_train,y_train)

# 绘制三个lasso和一个岭回归的系数分布结果
plt.figure(figsize = (7,7))
plt.plot(lasso.coef_,'s',label = "Lasso alpha=1")
plt.plot(lasso001.coef_,'^',label = "Lasso alpha=0.01")
plt.plot(lasso00001.coef_,'v',label = "Lasso alpha=0.0001")
plt.plot(ridge01.coef_,'o',label = 'ridge alpha=0.1')
plt.xlabel('Coefficient index')
plt.ylabel('Coefficient magnitude')
plt.ylim(-25,25)
plt.legend(ncol=2,loc=(0,1.05)) 
plt.show()

3.3 运行结果

在这里插入图片描述
在这里插入图片描述)

3.4 结果分析

在这里插入图片描述
如图所示,alpha=1时,lasso在训练集和测试集的表现都很差,这表示存在欠拟合。
在减小alpha值为0.1并增加训练次数后,在训练集和测试集中的表现很好。用到了105个特征中的34个,当alpha值降为0.001后,表现出了过拟合。

猜你喜欢

转载自blog.csdn.net/m0_37758063/article/details/124026495