【机器学习】用 Scikit-Learn 与 Statsmodels 进行回归分析
【精选优质专栏推荐】
- 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用
- 《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看
- 《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解
- 《网安渗透工具使用教程(全)》 —— 一站式工具手册
- 《CTF 新手入门实战教程》 —— 从题目讲解到实战技巧
- 《前后端项目开发(新手必知必会)》 —— 实战驱动快速上手
每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

前言
统计学与机器学习都旨在从数据中提取洞察,但它们的方法存在显著差异。传统统计学主要关注推断,通过使用整个数据集来检验假设并估计总体的概率。而机器学习则更强调预测与决策,通常采用训练-测试拆分的方法,让模型从部分数据(训练集)中学习,并在未见过的数据(测试集)上验证预测效果。
在本文中,我们将演示如何从这两种视角看待看似简单的线性回归技术。通过使用 Scikit-Learn 进行机器学习和 Statsmodels 进行统计推断,我们将探索它们各自的独特价值。
监督学习:分类与回归
监督学习是机器学习的一个分支,其模型在带标签的数据集上进行训练。这意味着训练数据集中的每个样本都对应一个正确的输出。训练完成后,模型可以将所学应用于新的、未见过的数据。
在监督学习中,我们通常遇到两类任务:分类和回归。任务类型取决于我们希望预测的输出类型。如果目标是预测类别,例如判断一封邮件是否为垃圾邮件,则属于分类任务;如果目标是估计数值,例如根据汽车特征预测其每加仑行驶里程(MPG),则属于回归任务。输出的性质——类别还是数值——决定了我们采用的方法。
在本系列中,我们将使用 Ames 房屋数据集。该数据集提供了与房屋相关的全面特征信息,包括建筑细节、房屋状况和地理位置,目标是预测每栋房屋的“SalePrice”(销售价格)。
# 加载 Ames 数据集
import pandas as pd
Ames = pd.read_csv('Ames.csv')
# 显示数据集前几行及 'SalePrice' 列的数据类型
print(Ames.head())
sale_price_dtype = Ames['SalePrice'].dtype
print(f"'SalePrice' 列的数据类型为 {sale_price_dtype}.")
运行结果应为:
PID GrLivArea SalePrice ... Prop_Addr Latitude Longitude
0 909176150 856 126000 ... 436 HAYWARD AVE 42.018564 -93.651619
1 905476230 1049 139500 ... 3416 WEST ST 42.024855 -93.663671
2 911128020 1001 124900 ... 320 S 2ND ST 42.021548 -93.614068
3 535377150 1039 114000 ... 1524 DOUGLAS AVE 42.037391 -93.612207
4 534177230 1665 227000 ... 2304 FILLMORE AVE 42.044554 -93.631818
[5 rows x 85 columns]
'SalePrice' 列的数据类型为 int64.
“SalePrice” 列的数据类型为 int64,表明其为整数值。由于 “SalePrice” 是数值型(连续型)变量而非类别型变量,因此预测“SalePrice”属于回归任务。这意味着我们的目标是基于数据集提供的输入特征,预测房屋的连续数值——即房屋的销售价格。
聚焦机器学习的回归分析
在机器学习中,监督学习侧重于根据输入数据预测结果。在本例中,我们使用 Ames 房屋数据集,目标是从房屋的居住面积预测其销售价格——这是一个典型的回归任务。为此,我们选择了以简洁高效著称的 Scikit-Learn 来构建预测模型。
首先,我们选择“GrLivArea”(地面居住面积)作为特征,“SalePrice”作为目标。接下来,使用 Scikit-Learn 的 train_test_split() 函数将数据集划分为训练集和测试集。这一步至关重要,它允许我们在一部分数据上训练模型,并在另一部分未见过的数据上评估模型性能,从而保证模型的可靠性。
# 导入线性回归模型
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 选择特征和目标
X = Ames[['GrLivArea']] # 特征:GrLivArea,二维矩阵
y = Ames['SalePrice'] # 目标:SalePrice,一维向量
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化并训练线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
# 模型评分
score = round(model.score(X_test, y_test), 4)
print(f"Model R^2 Score: {score}")
运行结果示例:
Model R^2 Score: 0.4789
上面代码中导入的 LinearRegression 是 Scikit-Learn 对线性回归的实现。模型的 R² 分数为 0.4789,说明仅凭居住面积这一特征,我们的模型可以解释销售价格约 48% 的变化——对于如此简单的模型,这已经是相当有价值的洞察。
这标志着我们在 Scikit-Learn 中进行机器学习探索的起点,同时展示了在未见过的数据上评估模型性能的便捷性。
利用统计方法加深理解
在了解了 Scikit-Learn 如何评估模型在测试数据上的表现后,我们转向 statsmodels,一个提供不同分析角度的 Python 包。
与专注于预测的 Scikit-Learn 不同,Statsmodels 擅长深入数据和模型的统计分析。以下演示如何使用 Statsmodels 获得更深入的统计洞察:
import statsmodels.api as sm
# 为自变量添加常数项以计算截距
X_with_constant = sm.add_constant(X)
# 拟合 OLS 模型
model_stats = sm.OLS(y, X_with_constant).fit()
# 输出模型摘要
print(model_stats.summary())
Statsmodels 的一个关键区别是它使用数据集中的所有观测值。不同于训练-测试拆分的预测建模方法,Statsmodels 利用整个数据集提供全面的统计洞察。这使得我们可以深入理解变量间关系,并提升统计估计的精确性。
运行上述代码后,将得到如下输出(部分示例):
OLS Regression Results
==============================================================================
Dep. Variable: SalePrice R-squared: 0.518
Model: OLS Adj. R-squared: 0.518
...
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 1.377e+04 3283.652 4.195 0.000 7335.256 2.02e+04
GrLivArea 110.5551 2.099 52.665 0.000 106.439 114.671
==============================================================================
...
注意,这与 Scikit-Learn 的回归不同,因为 Statsmodels 使用了完整的数据集,没有进行训练-测试拆分。
统计结果解读:
P 值与系数
- GrLivArea 系数:110.5551,意味着居住面积每增加一平方英尺,房价预计增加约 110.55 美元。该系数量化了居住面积对房价的影响。
- GrLivArea 的 P 值:接近 0(P>|t| 约 0.000),表明居住面积是房价的高度显著预测因子。从统计学角度,可拒绝“系数为零”的原假设,说明居住面积与房价存在强相关关系。
置信区间
- GrLivArea 置信区间:[106.439, 114.671],表示我们有 95% 的信心认为居住面积对房价的真实影响位于该区间内,提供了系数估计的精确性衡量。
诊断指标
- R²:0.518,说明居住面积可以解释约 51.8% 的房价变异性。
- F 统计量及其概率:F=2774,Prob(F-statistic) ≈ 0,说明模型整体显著。
- Omnibus 及 Prob(Omnibus):用于检验残差的正态性,Prob 接近 0 表示残差可能不完全服从正态分布,这可能影响部分统计检验的有效性。
- Durbin-Watson:1.926,接近 2,表明残差中不存在明显自相关。
通过 Statsmodels 输出,我们可以深入理解为什么“GrLivArea”会影响“SalePrice”,并获得统计证据。这强调了不仅仅是用模型进行预测,更要通过统计解释做出基于数据的决策的重要性。
总结
本文介绍了监督学习的基础概念,特别聚焦回归分析。通过 Ames 房屋数据集,我们展示了如何使用 Scikit-Learn 构建和评估预测模型,以及如何利用 Statsmodels 对数据进行统计分析。整个流程体现了预测建模与统计分析在理解和有效利用数据中的关键作用。
更多推荐



所有评论(0)