使用 scikit-learn 进行线性、套索和岭回归
介绍
许多组织正在使用监督式机器学习来识别和解决业务问题。常用的两种算法是分类和回归。在上一指南Scikit 机器学习中,我们学习了如何使用 scikit-learn 构建分类算法。
本指南将重点介绍回归。回归模型是预测连续结果的模型。一些示例包括预测一个国家的失业率、零售店的销售额、棒球联赛中球队将赢得的比赛数量或政党在选举中将赢得的席位数量。
在本指南中,您将学习如何使用 scikit-learn 实现以下线性回归模型:
- 线性回归
- 岭回归
- 套索回归
- 弹性网络回归
与往常一样,第一步是了解问题陈述。
问题陈述
失业是任何国家都面临的重大社会经济和政治问题,因此,管理失业是任何政府的首要任务。在本指南中,我们将尝试构建回归算法来预测经济体中的失业率。
本项目使用的数据来自 [https://research.stlouisfed.org/fred2] 提供的美国经济时间序列数据。数据包含 574 行和 5 个变量,如下所述:
- psavert——个人储蓄率。
- pce——个人消费支出,以十亿美元计。
- uempmed - 失业平均持续时间,以周为单位。
- pop- 总人口数,以千为单位。
- 失业 – 失业人数(千人)(因变量)。
评估指标
我们将使用两个指标——R 平方值和均方根误差 (RMSE) 来评估模型的性能。
R 平方值的范围从 0 到 1,通常以百分比表示。它是一种统计度量,表示目标变量的方差中由独立变量解释的比例。回归问题的另一个常用指标是 RMSE,它测量残差或误差的平均幅度。我们将使用这两个指标来评估模型性能。
理想情况下,较低的 RMSE 和较高的 R 平方值表明模型良好。
步骤
在本指南中,我们将遵循以下步骤:
步骤 1——加载所需的库和模块。
第 2 步——加载数据并执行基本数据检查。
步骤 3-为特征和响应变量创建数组。
步骤4-创建训练和测试数据集。
步骤 5 - 建立、预测和评估回归模型。我们将针对各种回归模型重复步骤 5。
以下部分将介绍这些步骤。
步骤 1 - 加载所需的库和模块
import pandas as pd
import numpy as np
from sklearn import model_selection
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from math import sqrt
第 2 步 - 读取数据并执行基本数据检查
第一行代码将数据读入为 pandas 数据框,而第二行打印形状 - 5 个变量的 574 个观测值。第三行给出数值变量的汇总统计信息。数据的平均失业率为 7771 千。此外,我们没有缺失值,因为所有变量的“计数”均为 574,这等于数据集中的记录数。
df = pd.read_csv('regressionexample.csv')
print(df.shape)
df.describe()
输出:
(574, 5)
| | pce | pop | psavert | uempmed | unemploy |
|-------|--------------|---------------|------------|------------|--------------|
| count | 574.000000 | 574.000000 | 574.000000 | 574.000000 | 574.000000 |
| mean | 4843.510453 | 257189.381533 | 7.936585 | 8.610105 | 7771.557491 |
| std | 3579.287206 | 36730.801593 | 3.124394 | 4.108112 | 2641.960571 |
| min | 507.400000 | 198712.000000 | 1.900000 | 4.000000 | 2685.000000 |
| 25% | 1582.225000 | 224896.000000 | 5.500000 | 6.000000 | 6284.000000 |
| 50% | 3953.550000 | 253060.000000 | 7.700000 | 7.500000 | 7494.000000 |
| 75% | 7667.325000 | 290290.750000 | 10.500000 | 9.100000 | 8691.000000 |
| max | 12161.500000 | 320887.000000 | 17.000000 | 25.200000 | 15352.000000 |
步骤 3 - 为特征和响应变量创建数组
第一行代码创建了一个名为“target_column”的目标变量对象。第二行给出了除目标变量“unemploy”之外的所有特征的列表。
第三行对预测变量进行归一化。这样做是因为变量的单位差异很大,可能会影响建模过程。为了防止这种情况,我们将通过将预测变量缩放到 0 到 1 之间来进行归一化。
第四行显示标准化数据的摘要。我们可以看到,所有独立变量现在都已在 0 到 1 之间缩放。目标变量保持不变。
target_column = ['unemploy']
predictors = list(set(list(df.columns))-set(target_column))
df[predictors] = df[predictors]/df[predictors].max()
df.describe()
输出:
| | pce | pop | psavert | uempmed | unemploy |
|-------|------------|------------|------------|------------|--------------|
| count | 574.000000 | 574.000000 | 574.000000 | 574.000000 | 574.000000 |
| mean | 0.398266 | 0.801495 | 0.466858 | 0.341671 | 7771.557491 |
| std | 0.294313 | 0.114466 | 0.183788 | 0.163020 | 2641.960571 |
| min | 0.041722 | 0.619258 | 0.111765 | 0.158730 | 2685.000000 |
| 25% | 0.130101 | 0.700857 | 0.323529 | 0.238095 | 6284.000000 |
| 50% | 0.325087 | 0.788627 | 0.452941 | 0.297619 | 7494.000000 |
| 75% | 0.630459 | 0.904651 | 0.617647 | 0.361111 | 8691.000000 |
| max | 1.000000 | 1.000000 | 1.000000 | 1.000000 | 15352.000000 |
步骤 4 - 创建训练和测试数据集
我们将在训练集上建立模型,并在测试集上评估其性能。这称为保留验证方法。
前几行代码分别创建独立变量 (X) 和因变量 (y) 的数组。第三行将数据分为训练数据集和测试数据集,其中“test_size”参数指定要保留在测试数据中的数据百分比。第四行打印训练集(4 个变量的 401 个观测值)和测试集(4 个变量的 173 个观测值)的形状。
X = df[predictors].values
y = df[target_column].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=40)
print(X_train.shape); print(X_test.shape)
输出:
(401, 4)
(173, 4)
第 5 步 - 建立、预测和评估回归模型
在此步骤中,我们将使用 scikit-learn 库实现各种线性回归模型。
线性回归
最简单的回归形式是线性回归,它假设预测变量与目标变量具有线性关系。假设输入变量具有高斯分布。另一个假设是预测变量彼此之间相关性不高(称为多重共线性问题)。
线性回归方程可以表示成以下形式:
y = a1x1 + a2x2 + a3x3 + ..... + anxn + b
当以下情况成立时:
- y 是目标变量。
- x1,x2,x3,...xn 是特征。
- a1,a2,a3,…,an 是系数。
- b是模型的参数。
模型的参数 a 和 b 通过普通最小二乘法 (OLS) 进行选择。该方法通过最小化残差的平方和(实际值 - 预测值)来实现。
为了拟合线性回归模型,第一步是实例化下面第一行代码中完成的算法。第二行在训练集上拟合模型。
lr = LinearRegression()
lr.fit(X_train, y_train)
输出:
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
一旦在训练集上建立了模型,我们就可以进行预测了。下面的第一行代码在训练集上进行预测。第二行和第三行代码在训练集上打印评估指标 - RMSE 和 R 平方。在第四行到第六行中,在测试数据集上重复相同的步骤。
pred_train_lr= lr.predict(X_train)
print(np.sqrt(mean_squared_error(y_train,pred_train_lr)))
print(r2_score(y_train, pred_train_lr))
pred_test_lr= lr.predict(X_test)
print(np.sqrt(mean_squared_error(y_test,pred_test_lr)))
print(r2_score(y_test, pred_test_lr))
输出:
971.0295047627518
0.8685609551239368
1019.3232585671161
0.8396633322870104
上面的输出显示,两个评估指标之一的 RMSE 对于训练数据为 971 千,对于测试数据为 1019 千。另一方面,R 平方值对于训练数据为 87%,对于测试数据为 84%,这是一个不错的表现。
正则化回归
如上所述,线性回归的工作原理是为每个独立变量选择系数,以最小化损失函数。但是,如果系数太大,则可能导致模型在训练数据集上过度拟合。这样的模型无法很好地概括未知数据。为了克服这个缺点,我们进行了正则化,惩罚了较大的系数。本指南的以下部分将讨论各种正则化算法。
岭回归
岭回归是线性回归的扩展,其中损失函数被修改以最小化模型的复杂性。此修改通过添加等于系数幅度平方的惩罚参数来完成。
损失函数 = OLS + alpha * 总和(系数值的平方)
在上面的损失函数中,alpha 是我们需要选择的参数。较低的 alpha 值可能导致过度拟合,而较高的 alpha 值可能导致欠拟合。
在 scikit-learn 中,使用 Ridge 类构建岭回归模型。下面的第一行代码实例化了 Ridge 回归模型,alpha 值为 0.01。第二行将模型拟合到训练数据。
第三行代码进行预测,第四行和第五行打印训练集上的评估指标 - RMSE 和 R 平方。第六至第八行代码在测试数据集上重复相同的步骤。
rr = Ridge(alpha=0.01)
rr.fit(X_train, y_train)
pred_train_rr= rr.predict(X_train)
print(np.sqrt(mean_squared_error(y_train,pred_train_rr)))
print(r2_score(y_train, pred_train_rr))
pred_test_rr= rr.predict(X_test)
print(np.sqrt(mean_squared_error(y_test,pred_test_rr)))
print(r2_score(y_test, pred_test_rr))
输出:
975.8314265299163
0.8672577596814723
1017.3110662731054
0.8402957317988335
上述输出显示,训练数据上岭回归模型的 RMSE 和 R 平方值分别为 975,000 和 86.7%。对于测试数据,这些指标的结果分别为 1017,000 和 84%。
套索回归
Lasso 回归,即最小绝对收缩和选择算子,也是线性回归的一种修改。在 Lasso 中,通过限制模型系数绝对值的总和(也称为 l1 范数),对损失函数进行了修改,以最小化模型的复杂性。
Lasso 回归的损失函数可以表示如下:
<font style="vertical
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~