数据挖掘(六)——回归算法

本文主要介绍回归问题的算法,包括线性回归、岭回归、losso回归、多项式回归算法。

理论介绍见(2条消息) 回归算法_langsiming的博客-CSDN博客_回归算法

1、线性回归

  • 一元线性回归分析
  • 多元线性回归分析

数据挖掘(六)——回归算法

数据挖掘(六)——回归算法

这里的目标函数(损失函数)的推导实际运用了极大似然的思想, 假设误差服从高斯分布,使误差最小。

2、岭回归

岭回归是对线性回归的变体

数据挖掘(六)——回归算法

3、losso回归

losso回归模型是对线性回归的另一种改进,可以防止出现过拟合

数据挖掘(六)——回归算法

4、多项式回归

数据挖掘(六)——回归算法

多项式模型的损失函数与多元线性回归的损失函数相同,都是最小二乘误差。求解最优模型也是求解使得损失函数最小的参数,还是用梯度下降法。

5、梯度下降法

10 回归算法 – 梯度下降在线性回归中的应用 – 简书 (jianshu.com)

  • 批量梯度下降

数据挖掘(六)——回归算法
  • 随机梯度下降

数据挖掘(六)——回归算法
  • 小批量梯度下降

数据挖掘(六)——回归算法

6、正则化

数据挖掘(六)——回归算法

其中,L1范数容易得到稀疏解 。

6、评估指标

数据挖掘(六)——回归算法

7、回归算法实操

实验介绍

本实验使用Lasso回归模型作为汽车价格预测的模型,该模型相对于岭回归模型来说,更容易产生权重为0的特征项,这个特点符合汽车价格预测的任务。因为影响汽车的价格的关键因素不多,数据集中的很多特征项可以不考虑在内。

数据集

汽车价格预测,根据汽车的各种特征属性,对汽车的价格进行预测。汽车价格预测数据集主要包含以下,主要包括3类指标:

  • 汽车的各种特性.

symboling保险风险评级:(-3, -2, -1, 0, 1, 2, 3).

normalized-losses 每辆保险车辆年平均相对损失支付.

  • 类别属性

make: 汽车的商标(奥迪,宝马。。。)

fuel-type: 汽油还是天然气

aspiration: 涡轮

num-of-doors: 两门还是四门

body-style: 硬顶车、轿车、掀背车、敞篷车

drive-wheels: 驱动轮

engine-location: 发动机位置

engine-type: 发动机类型

num-of-cylinders: 几个气缸

fuel-system: 燃油系统

  • 连续指标

bore: continuous from 2.54 to 3.94.

stroke: continuous from 2.07 to 4.17.

compression-ratio: continuous from 7 to 23.

horsepower: continuous from 48 to 288.

peak-rpm: continuous from 4150 to 6600.

city-mpg: continuous from 13 to 49.

highway-mpg: continuous from 16 to 54.

price: 价格,5118 ~45400.

任务一 导入包

导入相关的工具包,便于后续的开发使用。

输入:

导入相关包
import numpy as np
import pandas as pd

导入可视化包
import matplotlib.pyplot as plt
import seaborn as sns
import missingno as msno #缺失数据可视化工具包

统计函数工具包
from statsmodels.distributions.empirical_distribution  import ECDF
from sklearn.metrics import mean_squared_error, r2_score

机器学习模型工具包
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LinearRegression, Lasso, LassoCV
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.ensemble import RandomForestRegressor

设置固定的随机数种子,保证每次随机产生的数字的一致
seed = 100

任务二 获取数据

使用pandas,从本地获取数据集,数据集的地址需要根据实际的路径替换。

输入:


csv_dir = '/data/dm/Auto-Data.csv' # 根据实际路径进行替换
## 通过查看CSV中的数据看到,缺失数据是用 ‘?’表示的
## 因此注意,使用pandas读入数据时需要指定na_values,否则在缺失值可视化时不能正常显示
data = pd.read_csv(csv_dir, na_values='?', engine='python')

任务三 探索数据

  1. 了解数据类型及基本情况
  2. 数据质量检查:主要包括检查数据中是否有错误,如性别类型,是否会有拼写错误的,把female 拼写为fmale等等,诸如此类

步骤1 数据概览

分析数据类型,看哪些是分类数据,哪些是数值型数据,
用来进行数据类型转换的依据
data.dtypes
输出
symboling              int64
normalized-losses    float64
make                  object
fuel-type             object
aspiration            object
num-of-doors          object
body-style            object
drive-wheels          object
engine-location       object
wheel-base           float64
length               float64
width                float64
height               float64
curb-weight            int64
engine-type           object
num-of-cylinders      object
engine-size            int64
fuel-system           object
bore                 float64
stroke               float64
compression-ratio    float64
horsepower           float64
peak-rpm             float64
city-mpg               int64
highway-mpg            int64
price                float64
dtype: object
查看数据的基本信息
## 返回数据总量,特征列数量,所有特征列的数据类型、空值数量等简要信息
data.info()

查看数据量的大小,并预览数据的前5条数据
print(data.shape)   # 205,26
data.head(5)

查看数据有哪些特征列
print(data.columns)

输出:

Index(['symboling', 'normalized-losses', 'make', 'fuel-type', 'aspiration',
       'num-of-doors', 'body-style', 'drive-wheels', 'engine-location',
       'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-type',
       'num-of-cylinders', 'engine-size', 'fuel-system', 'bore', 'stroke',
       'compression-ratio', 'horsepower', 'peak-rpm', 'city-mpg',
       'highway-mpg', 'price'],
      dtype='object')
对数值型数据进行描述统计,会返回一个DataFrame结构的数据
## DataFrame.describe(percentiles=None, include=None, exclude=None)
## 参数解释:
##percentiles: 1、百分位数:数字列表,可选:输出中包含的百分位数。 全部应该在0和1之间。默认值为[.25,.5,.75],返回第25,第50和第75百分位数
##include:要包括在结果中的白名单数据类型。
###        all:输入的所有列都将包含在输出中;类似dtypes的列表:
###        将结果限制为提供的数据类型。 将结果限制为数字类型,提交numpy.number。要将其限制为分类对象,请提交numpy.object数据类型。 字符串也可以以select_dtypes的样式使用(例如,df.describe(include = ['O']))
###        默认:结果将包括所有数字列
data_desc = data.describe()
print(data_desc)

步骤2 检查数据

所有分类型的特征
classes = ['make', 'fuel-type', 'aspiration', 'num-of-doors',
           'body-style', 'drive-wheels', 'engine-location',
           'engine-type', 'num-of-cylinders', 'fuel-system']

对于每一个分类型的特征,使用.unique()查看有多少取值
for each in classes:
    print(each + ':
')
    print(data[each].unique())
    print('
')

任务四 数据预处理

数据预处理是非常重要的环节,干净合理的数据是模型成功的关键因素,。数据预处理主要包括以下几个环节:

  1. 缺失值处理
  2. 异常值处理:对数值型、类别性特征进行缺失值处理。
  3. 特征重加工:对数值型的特征进行特征重加工,例如去除相关性较高的特征。
  4. 特征编码:对类别型特征进行编码,便于回归模型的处理。

步骤1 缺失值分析&处理

缺失值查看:观测异常值的缺失情况,可通过missingno提供的可视化工具,也可以以计数的形式,查看缺失值及所占比例。

缺失值处理方法: 1、缺失值较少时可以直接去掉; 2、缺失值较多时可用已有的值取平均值或众数; 3、用已知的数做回归模型,进行预测。

缺失值查看

通过图示查看缺失值
seaborn预先定义了5中主题样式,以适合不同场景需要,sns.set style参数:
## darkgrid 黑色网格(默认)
## whitegrid 白色网格
## dark 黑色背景
## white 白色背景
## ticks 刻度值
sns.set(style='ticks') #设置sns的样式背景
msno.matrix(data)

输出:

数据挖掘(六)——回归算法
缺失值统计

根据以上数据可以看出,只有nrmaized-losses列缺失值比较多,其余的缺失值很少
看一下具体缺失多少
null_cols = ['normalized-losses', 'num-of-doors', 'bore', 'stroke', 'horsepower', 'peak-rpm', 'price']
total_rows = data.shape[0]
for each_col in null_cols:
    # 使用.isnull().sum() 统计空值数量
    # print('{}:{}'.format(each_col,data[each_col].isnull().sum() / total_rows))
    print('{}:{}'.format(each_col, pd.isnull(data[each_col]).sum() / total_rows))

输出:

normalized-losses:0.2
num-of-doors:0.00975609756097561
bore:0.01951219512195122
stroke:0.01951219512195122
horsepower:0.00975609756097561
peak-rpm:0.00975609756097561
price:0.01951219512195122
#normalized-losses缺失值处理

查看nrmaized-losses的分布情况
sns.set(style='darkgrid')
plt.figure(figsize=(12,5))
plt.subplot(121)

累计分布曲线
cdf = ECDF(data['normalized-losses'])
cdf = [[each_x, each_y] for each_x, each_y in zip(cdf.x, cdf.y)]
cdf = pd.DataFrame(cdf, columns=['x','y'])
sns.lineplot(x="x", y="y",data=cdf)

输出:

数据挖掘(六)——回归算法
plt.subplot(122)
直方图
x = data['normalized-losses'].dropna()
sns.distplot(x, hist=True, kde=True, kde_kws={"color": "k", "lw": 3, "label": "KDE"},
                   hist_kws={"histtype": "step", "linewidth": 3,
                             "alpha": 1, "color": "g"})

输出:

数据挖掘(六)——回归算法
查看不同symboling下normalized-losses分布,symboling保险风险评级:(-3, -2, -1, 0, 1, 2, 3).

data.groupby('symboling')['normalized-losses'].describe()

out:

数据挖掘(六)——回归算法
其他维度的缺失值较小,直接删除
sub_set = ['num-of-doors', 'bore', 'stroke', 'horsepower', 'peak-rpm', 'price']
## 使用dropna方法删除缺失值
## 使用reset_index重置索引值,drop=True表示丢弃原索引
data = data.dropna(subset=sub_set).reset_index(drop=True)

用分组的平均值进行填充
## groupby:分组处理
### 一般情况下,我们在groupby之后使用aggregate , filter 或 apply来汇总数据
### aggregation会返回数据的缩减版本,而transformation能返回完整数据的某一变换版本供我们重组。
### 这样的transformation,输出的形状和输入一致。一个常见的例子是通过减去分组平均值来居中数据。
## fillna:空值填充方法
data['normalized-losses'] = data.groupby('symboling')['normalized-losses'].transform(lambda x: x.fillna(x.mean()))
print(data.shape) #(193, 26)
data.head()

out:

数据挖掘(六)——回归算法

步骤2 异常值分析&处理

异常值检测方法: 一般异常值的检测方法有基于统计的方法,基于聚类的方法,以及一些专门检测异常值的方法等。 常用的是基于统计的方法:

  1. 基于正态分布的方法: 数据需要服从正态分布。在3∂原则下,异常值如超过3倍标准差,则认为是异常值 。
  2. 基于四分位矩的方法: 利用箱型图的四分位距(QR)对异常值进行检测。四分位距(QR)就是上四分位与下四分位的差值。而我们通过QR的1.5倍为标准,规定:超过上四分位+1.5倍QR距离,或者下四分位-1.5倍QR距离的点为异常值(使用’*’表示),规定:超过上四分位+3倍QR距离,或者下四分位-3倍QR距离的点为极端异常值(使用’O’表示)。

异常值处理方法:对检测到的异常值一般会进行删除操作。

异常值查看

所有数值型特征列
num = ['symboling', 'normalized-losses', 'length', 'width', 'height', 'horsepower', 'wheel-base',
       'bore', 'stroke','compression-ratio', 'peak-rpm','engine-size','highway-mpg']

可以一次性绘制出所有的箱线图,但由于其度量并不一致,可以分别绘制.

用sns绘制时,需要考虑到缺失值的情况,这里直接用dataframe的功能绘制
箱线图的理解:
for each in num:
    plt.figure()
    x = data[each]
    x.plot.box()
在箱线图中可以直接观测到离群点,一般应将其删除
异常值的处理
data_outliers=data.copy()
for each in num:
    #定义一个下限
    lower = data_outliers[each].quantile(0.25)-1.5*(data_outliers[each].quantile(0.75)-data_outliers[each].quantile(0.25))
    #定义一个上限
    upper = data_outliers[each].quantile(0.25)+1.5*(data_outliers[each].quantile(0.75)-data_outliers[each].quantile(0.25))

    #重新加入一列,用于判断
    data_outliers['qutlier'] = (data_outliers[each] < lower) | (data_outliers[each] > upper)

    #&#x8FC7;&#x6EE4;&#x6389;&#x5F02;&#x5E38;&#x6570;&#x636E;
    data_outliers = data_outliers[data_outliers['qutlier'] ==False]
    plt.figure()
    data_outliers[each].plot.box()
    data_outliers = data_outliers.drop('qutlier',axis=1)

步骤3 数据相关性分析&处理

对于一个模型来说,特征并不是越多越好,而是越简洁包含的信息越多越好。对于有些特征之间,线性关联性非常强,这样的特征可以只保留一个的,减少特征的冗余。

&#x76F8;&#x5173;&#x6027;&#x8BA1;&#x7B97;

&#x4F7F;&#x7528;corr()&#x8BA1;&#x7B97;&#x6570;&#x636E;&#x7684;&#x76F8;&#x5173;&#x6027;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x4ECD;&#x662F;dataframe&#x7C7B;&#x578B;&#x6570;&#x636E;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5F15;&#x7528;
### &#x76F8;&#x5173;&#x7CFB;&#x6570;&#x7684;&#x53D6;&#x503C;&#x8303;&#x56F4;&#x4E3A;[-1, 1],&#x5F53;&#x63A5;&#x8FD1;1&#x65F6;&#xFF0C;&#x8868;&#x793A;&#x4E24;&#x8005;&#x5177;&#x6709;&#x5F3A;&#x70C8;&#x7684;&#x6B63;&#x76F8;&#x5173;&#x6027;&#xFF0C;
### &#x6BD4;&#x5982;&#x2018;s&#x2019;&#x548C;&#x2018;x&#x2019;&#xFF1B;&#x5F53;&#x63A5;&#x8FD1;-1&#x65F6;&#xFF0C;&#x8868;&#x793A;&#x6709;&#x5F3A;&#x70C8;&#x7684;&#x7684;&#x8D1F;&#x76F8;&#x5173;&#x6027;&#xFF0C;&#x6BD4;&#x5982;&#x2018;s&#x2019;&#x548C;&#x2018;c&#x2019;&#xFF0C;
### &#x800C;&#x82E5;&#x503C;&#x63A5;&#x8FD1;0&#xFF0C;&#x5219;&#x8868;&#x793A;&#x76F8;&#x5173;&#x6027;&#x5F88;&#x4F4E;.

cor_matrix = data_outliers.corr()
cor_matrix
&#x76F8;&#x5173;&#x6027;&#x53EF;&#x89C6;&#x5316;&#x5C55;&#x793A;

&#x5E03;&#x5C14;&#x578B;&#x7684;mask&#xFF0C;&#x7136;&#x540E;&#x4ECE;&#x4E2D;&#x53D6;&#x4E0A;&#x4E09;&#x89D2;&#x77E9;&#x9635;&#x3002;&#x53BB;&#x4E0B;&#x4E09;&#x89D2;&#x77E9;&#x9635;&#x662F;np.tril_indices_from(mask)
&#x5176;&#x76EE;&#x7684;&#x662F;&#x5254;&#x9664;&#x5197;&#x4F59;&#x6620;&#x5C04;&#xFF0C;&#x53EA;&#x53D6;&#x4E00;&#x534A;&#x5C31;&#x597D;
mask = np.zeros_like(cor_matrix, dtype=np.bool)
mask[np.triu_indices_from(mask)] = True
sns.heatmap(cor_matrix,
            vmin=-1, vmax=1,
            square=True,
            cmap=sns.color_palette("RdBu_r", 100),
            mask=mask,
            linewidths=.5);

输出热力图:

数据挖掘(六)——回归算法
&#x5F3A;&#x76F8;&#x5173;&#x7279;&#x5F81;&#x67E5;&#x770B;

&#x67E5;&#x770B;&#x76F8;&#x5173;&#x6027;&#x8F83;&#x9AD8;&#x7684;&#x5143;&#x7D20;&#xFF0C;&#x5206;&#x6790;&#x5173;&#x7CFB;&#xFF0C;&#x5BF9;&#x7279;&#x5F81;&#x8FDB;&#x884C;&#x5904;&#x7406;&#x3002;
## &#x6BD4;&#x5982;&#xFF1A;&#x53BB;&#x9664;&#x76F8;&#x5173;&#x6027;&#x8F83;&#x9AD8;&#x7684;&#x7279;&#x5F81;
## &#x6216;&#x8005;&#xFF1A;&#x5BF9;&#x6709;&#x903B;&#x8F91;&#x76F8;&#x5173;&#x6027;&#x7684;&#x7279;&#x5F81;&#x8FDB;&#x884C;&#x878D;&#x5408;&#x52A0;&#x5DE5;
cor_matrix *= np.tri(*cor_matrix.values.shape, k=-1).T
cor_matrix = cor_matrix.stack()#&#x5728;&#x7528;pandas&#x8FDB;&#x884C;&#x6570;&#x636E;&#x91CD;&#x6392;&#xFF0C;stack:&#x4EE5;&#x5217;&#x4E3A;&#x7D22;&#x5F15;&#x8FDB;&#x884C;&#x5806;&#x79EF;&#xFF0C;unstack:&#x4EE5;&#x884C;&#x4E3A;&#x7D22;&#x5F15;&#x5C55;&#x5F00;&#x3002;
cor_matrix = cor_matrix.reindex(cor_matrix.abs().sort_values(ascending=False).index).reset_index()
cor_matrix.columns = ["FirstVariable", "SecondVariable", "Correlation"]
cor_matrix.head(10)

输出:

数据挖掘(六)——回归算法
&#x6839;&#x636E;&#x7ED3;&#x679C;
## 1.city-mpg highway-mpg&#x4E4B;&#x95F4;&#x76F8;&#x4F3C;&#x5EA6;&#x8FC7;&#x9AD8;&#xFF0C;&#x53EA;&#x4FDD;&#x7559;&#x4E00;&#x4E2A;&#x5373;&#x53EF;
## 2.city-mpg &#x548C; curb-weight&#x4E4B;&#x95F4;&#x76F8;&#x5173;&#x6027;&#x4E5F;&#x8FC7;&#x9AD8;&#xFF0C;&#x53EA;&#x4FDD;&#x7559;&#x4E00;&#x4E2A;&#x5373;&#x53EF;
## 3.data2.length * data2.width * data2.height&#x4E09;&#x8005;&#x4E4B;&#x95F4;&#x548C;
&#x6570;&#x636E;&#x9884;&#x5904;&#x7406;
data2 = data_outliers.copy()
data2['volume'] = data2.length * data2.width * data2.height
#drop&#x9ED8;&#x8BA4;&#x5220;&#x9664;&#x884C;&#x5143;&#x7D20;&#xFF0C;&#x5220;&#x9664;&#x5217;&#x9700;&#x52A0; axis = 1
data2.drop(['width', 'length', 'height',
           'curb-weight', 'city-mpg'],
          axis = 1, # 1 for columns
          inplace = True)
data2.info()

步骤4 数值特征的标准化

对于数值型的特征,需要进行标准化处理,减少由于不同数量级的度量范围对模型带来的影响。

&#x76EE;&#x6807;&#x9884;&#x6D4B;&#x6570;&#x636E;
target = data2['price']
target = data2.price

&#x7279;&#x5F81;&#x6570;&#x636E;
features = data2.drop(columns=['price'])

&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x7684;&#x7279;&#x5F81;
num = ['symboling', 'normalized-losses', 'volume', 'horsepower', 'wheel-base',
       'bore', 'stroke','compression-ratio', 'peak-rpm','engine-size','highway-mpg']

&#x5BF9;&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x7684;&#x7279;&#x5F81;&#x8FDB;&#x884C;&#x6807;&#x51C6;&#x5316;&#x5904;&#x7406;
standard_scaler = StandardScaler()
features[num] = standard_scaler.fit_transform(features[num])
features.head(10)
&#x7ED8;&#x5236;&#x7BB1;&#x7EBF;&#x56FE;&#x770B;&#x6570;&#x636E;&#x5206;&#x5E03;
&#x4F7F;&#x7528;pandas &#x7684;plot.box&#x51FD;&#x6570;
&#x6B64;&#x65F6;&#x6570;&#x636E;&#x5DF2;&#x7ECF;&#x5F52;&#x4E00;&#x5316;&#x5904;&#x7406;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x5728;&#x4E00;&#x5F20;&#x56FE;&#x4E2D;&#x5C55;&#x793A;&#x6240;&#x6709;&#x7279;&#x5F81;&#x7684;&#x7BB1;&#x7EBF;&#x56FE;
features.plot.box(title="Auto-Car", vert=False)
plt.xticks(rotation=-20)

out:

(array([-3., -2., -1.,  0.,  1.,  2.,  3.]),
 )

步骤5 类别特征的编码

由于是回归模型,因此需要对类别特征进行数字化的编码处理。便于后续模型的数值化处理。

&#x7C7B;&#x522B;&#x5C5E;&#x6027;&#x7684;one-hot&#x7F16;&#x7801;

## &#x9700;&#x8981;&#x8FDB;&#x884C;one-hot&#x7F16;&#x7801;&#x7684;&#x7279;&#x5F81;&#x5217;
classes = ['make', 'fuel-type', 'aspiration', 'num-of-doors',
           'body-style', 'drive-wheels', 'engine-location',
           'engine-type', 'num-of-cylinders', 'fuel-system']

## &#x4F7F;&#x7528;pandas&#x7684;get_dummies&#x8FDB;&#x884C;one-hot&#x7F16;&#x7801;
dummies = pd.get_dummies(features[classes])
print(dummies.columns)

## one-hot&#x7F16;&#x7801;&#x52A0;&#x5DE5;&#x597D;&#x7684;&#x7279;&#x5F81;&#x6570;&#x636E;
features3 = features.join(dummies).drop(classes, axis = 1)
print(features3.columns)
features3.head()

任务五 数据建模

步骤1 划分数据集

输入:

使用sklearn.model_selection.train_test_split随机划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features3, target,
                                                    test_size = 0.3,
                                                    random_state = seed)

步骤2 回归模型

lasso回归模型中有一个超参数需要选择,也就是正则化的参数alpha,合适的超参数选择是获取好的模型的重要因素。超参数选择的可以使用的方法很多,常见的有网格查找法,还有就是机器学习工具包sklearn中自带的交叉验证法.

#lassocv&#xFF1A;&#x4EA4;&#x53C9;&#x9A8C;&#x8BC1;&#x6A21;&#x578B;&#xFF0C;

#lassocv &#x8FD4;&#x56DE;&#x62DF;&#x5408;&#x4F18;&#x5EA6;&#x8FD9;&#x4E00;&#x7EDF;&#x8BA1;&#x5B66;&#x6307;&#x6807;&#xFF0C;&#x8D8A;&#x8D8B;&#x8FD1;1&#xFF0C;&#x62DF;&#x5408;&#x7A0B;&#x5EA6;&#x8D8A;&#x597D;
lassocv = LassoCV(cv = 10, random_state=seed,alphas =(2,3,4,5,6,7,8,9,10,11))
#&#x5236;&#x5B9A;&#x6A21;&#x578B;&#xFF0C;&#x5C06;&#x8BAD;&#x7EC3;&#x96C6;&#x5E73;&#x5747;&#x5207;10&#x5206;&#xFF0C;9&#x4EFD;&#x7528;&#x6765;&#x505A;&#x8BAD;&#x7EC3;&#xFF0C;1&#x4EFD;&#x7528;&#x6765;&#x505A;&#x9A8C;&#x8BC1;&#xFF0C;&#x53EF;&#x8BBE;&#x7F6E;alphas=[]&#x662F;&#x591A;&#x5C11;&#xFF08;&#x5E8F;&#x5217;&#x683C;
#&#x5F0F;&#xFF09;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E0D;&#x8BBE;&#x7F6E;&#x5219;&#x627E;&#x9002;&#x5408;&#x8BAD;&#x7EC3;&#x96C6;&#x6700;&#x4F18;alpha
lassocv.fit(features3, target)                    # &#x8BAD;&#x7EC3;&#x6A21;&#x578B;
lassocv_score = lassocv.score(features3, target)  # &#x6D4B;&#x8BD5;&#x6A21;&#x578B;,&#x8FD4;&#x56DE;r^2&#x503C;?????

lassocv_alpha = lassocv.alpha_                    # &#x6700;&#x4F73;&#x60E9;&#x7F5A;&#x7CFB;&#x6570;alpha

plt.figure(figsize = (10, 4))
plt.plot(lassocv_alpha, lassocv_score, '-ko')

plt.axhline(lassocv_score, color = 'c')
plt.xlabel(r'$alpha$')       # X&#x8F74;&#x6807;&#x7B7E;
plt.ylabel('CV Score')        # Y&#x8F74;&#x6807;&#x7B7E;
plt.xscale('log', basex = 2)  # x&#x8F74;&#x523B;&#x5EA6;&#x4EE5;&#x5BF9;&#x6570;&#x4E3A;&#x5E95;

sns.despine(offset = 15)

print('CV results:', lassocv_score, lassocv_alpha)

out:

数据挖掘(六)——回归算法

步骤3 查看模型训练结果

查看哪些特征是比较重要的,哪些特征是不重要的。因为LASSO回归的特性,会产生很多特征的重要性参数为0。

&#x7279;&#x5F81;&#x6743;&#x91CD;&#x7684;&#x5206;&#x5E03;

lassocv.coef_&#x662F;&#x53C2;&#x6570;&#x5411;&#x91CF;w&#xFF0C;&#x8FD4;&#x56DE;&#x7ECF;&#x8FC7;&#x5B66;&#x4E60;&#x540E;&#x7684;&#x6240;&#x6709; feature &#x7684;&#x53C2;&#x6570;&#x3002;
coefs = pd.Series(lassocv.coef_, index = features3.columns)
print(coefs)

&#x6253;&#x5370;&#x4FE1;&#x606F;
print("Lasso picked " + str(sum(coefs != 0)) + " features and eliminated the other " +
      str(sum(coefs == 0)) + " features.")

&#x53EF;&#x89C6;&#x5316;&#x7279;&#x5F81;&#x6743;&#x91CD;&#x7684;&#x5206;&#x5E03;
## &#x9009;&#x53D6;&#x524D;5&#x4E2A;&#x91CD;&#x8981;&#x548C;&#x540E;5&#x4E2A;&#x91CD;&#x8981;&#x7279;&#x5F81;
coefs = pd.concat([coefs.sort_values().head(5), coefs.sort_values().tail(5)])   #&#x5C06;&#x76F8;&#x540C;&#x5B57;&#x6BB5;&#x9996;&#x5C3E;&#x76F8;&#x63A5;
## &#x53EF;&#x89C6;&#x5316;&#x5C55;&#x793A;
plt.figure(figsize = (10, 4))
coefs.plot(kind = "barh", color = 'c')
plt.title("Coefficients in the Lasso Model")
plt.show()

步骤4 模型测试

&#x8BAD;&#x7EC3;&#x6A21;&#x578B;
model_l1 = LassoCV(alphas=(2,3,4,5,6,7,8,9,10,11), cv=10, random_state=seed).fit(X_train, y_train)

&#x6A21;&#x578B;&#x9884;&#x6D4B;![img](https://arch-source-hebutai.obs.cn-north-4.myhuaweicloud.com:443/service-course/fbb46e56_735.png?AccessKeyId=BJHU7DFLUZHKDPEEKMJL&Expires=1622363406&Signature=BqFHw7iVgX%2Bzr78UKCEje7EYGNA%3D)
y_pred_l1 = model_l1.predict(X_test)

&#x6A21;&#x578B;&#x6253;&#x5206;
model_l1.score(X_test, y_test)

out:

0.6181257534685929
&#x67E5;&#x770B;&#x9884;&#x6D4B;&#x503C;&#x548C;&#x771F;&#x5B9E;&#x503C;&#x4E4B;&#x95F4;&#x7684;&#x5DEE;&#x5F02;
plt.rcParams['figure.figsize'] = (6.0, 6.0)

## &#x6784;&#x9020;pandas &#x6570;&#x636E;&#x5E93;&#x3002;preds&#xFF1A;&#x9884;&#x6D4B;&#x503C;&#xFF0C;true&#xFF1A;&#x771F;&#x5B9E;&#x503C;&#xFF0C;residuals&#xFF1A;&#x771F;&#x5B9E;&#x503C;-&#x9884;&#x6D4B;&#x503C;
preds = pd.DataFrame({"preds": model_l1.predict(X_train), "true": y_train})
preds["residuals"] = preds["true"] - preds["preds"]
## &#x53EF;&#x89C6;&#x5316; {preds&#xFF1A;&#x9884;&#x6D4B;&#x503C; }&#x548C; {residuals&#xFF1A;&#x771F;&#x5B9E;&#x503C;-&#x9884;&#x6D4B;&#x503C; }&#x4E4B;&#x95F4;&#x7684;&#x5173;&#x7CFB;
sns.scatterplot(x='preds',y="residuals",data=preds)

数据挖掘(六)——回归算法

Original: https://blog.csdn.net/weixin_46310648/article/details/117386013
Author: ??(lxy)
Title: 数据挖掘(六)——回归算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/631550/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球