统计学和机器学习都旨在从数据中提取洞察力,尽管它们的方法大相径庭。传统统计学主要关注推断,使用整个数据集来检验假设并估计更大总体上的概率。相反,机器学习强调预测和决策制定,通常采用训练-测试集分割方法,模型从一部分数据(训练集)中学习,并在未见过的数据(测试集)上验证其预测。
在这篇文章中,我们将演示如何通过这两种视角来看待线性回归这种看似直接的技术。我们将通过使用 Scikit-Learn 进行机器学习和 Statsmodels 进行统计推断来探索它们的独特贡献。
通过我的书《进阶数据科学》启动您的项目。它提供了带有可运行代码的自学教程。
让我们开始吧。

集成 Scikit-Learn 和 Statsmodels 进行回归。
图片来源:Stephen Dawson。保留部分权利。
概述
这篇博文分为三部分;它们是:
- 监督学习:分类与回归
- 深入了解以机器学习为重点的回归
- 通过统计洞察力增强理解
监督学习:分类与回归
监督学习是机器学习的一个分支,模型在标记数据集上进行训练。这意味着训练数据集中的每个示例都与正确的输出配对。一旦训练完成,模型就可以将其所学应用于新的、未见过的数据。
在监督学习中,我们遇到两个主要任务:分类和回归。这些任务由我们旨在预测的输出类型决定。如果目标是预测类别,例如确定电子邮件是否为垃圾邮件,我们正在处理分类任务。另外,如果我们估计一个值,例如根据汽车的特征计算其每加仑行驶里程 (MPG),则属于回归任务。输出的性质——类别或数字——决定了我们采用的适当方法。
在本系列中,我们将使用 Ames 房屋数据集。它提供了与房屋相关的特征的全面集合,包括建筑细节、状况和位置,旨在预测每栋房屋的“SalePrice”(销售价格)。
1 2 3 4 5 6 7 8 9 |
# 加载Ames数据集 导入 pandas 为 pd Ames = pd.read_csv('Ames.csv') # 显示数据集的前几行和“SalePrice”的数据类型 print(Ames.head()) sale_price_dtype = Ames['SalePrice'].dtype print(f"“SalePrice”的数据类型为 {sale_price_dtype}。") |
这将输出
1 2 3 4 5 6 7 8 9 |
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 行 x 85 列] “SalePrice”的数据类型是 int64。 |
“SalePrice”列的数据类型为int64
,表示它代表整数值。由于“SalePrice”是一个数值(连续)变量而不是分类变量,预测“SalePrice”将是一个回归任务。这意味着目标是根据数据集中提供的输入特征来预测一个连续量(房屋的销售价格)。
想开始学习进阶数据科学吗?
立即参加我的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
深入了解以机器学习为重点的回归
机器学习中的监督学习侧重于根据输入数据预测结果。在我们的案例中,使用 Ames 房屋数据集,我们的目标是根据房屋的居住面积预测其销售价格——这是一个经典的回归任务。为此,我们求助于 scikit-learn,它以其在构建预测模型方面的简单性和有效性而闻名。
首先,我们选择“GrLivArea”(地面居住面积)作为特征,选择“SalePrice”作为目标。下一步是使用 scikit-learn 的 train_test_split()
函数将数据集拆分为训练集和测试集。这一关键步骤允许我们在一组数据上训练模型,并在另一组数据上评估其性能,从而确保模型的可靠性。
我们这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 从 scikit-learn 导入线性回归 来自 sklearn.linear_model 导入 LinearRegression 从 sklearn.model_selection 导入 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) # 初始化并拟合线性回归模型 模型 = LinearRegression() model.fit(X_train, y_train) # 模型评分 score = round(model.score(X_test, y_test), 4) print(f"模型 R^2 分数: {score}") |
这将输出
1 |
模型 R^2 分数: 0.4789 |
上面代码中导入的 LinearRegression
对象是 scikit-learn 的线性回归实现。模型的 R² 分数为 0.4789,表明我们的模型仅凭居住面积就可以解释销售价格大约 48% 的变异——对于这样一个简单的模型来说,这是一个重要的洞察。这一步标志着我们初步涉足 scikit-learn 进行机器学习,展示了我们评估模型在未见过或测试数据上性能的简易程度。
通过统计洞察力增强理解
在探讨了 scikit-learn 如何帮助我们评估模型在未见过数据上的性能之后,现在我们将注意力转向 statsmodels
,这是一个提供不同分析视角的 Python 包。虽然 scikit-learn 擅长构建模型和预测结果,但 statsmodels
则通过深入研究数据和模型的统计方面而大放异彩。让我们看看 statsmodels
如何在不同层面提供洞察力。
1 2 3 4 5 6 7 8 9 10 |
导入 statsmodels.api 为 sm # 为截距向自变量添加一个常数 X_with_constant = sm.add_constant(X) # 拟合 OLS 模型 model_stats = sm.OLS(y, X_with_constant).fit() # 打印模型摘要 print(model_stats.summary()) |
首先需要强调的关键区别是 statsmodels
使用了我们数据集中的所有观测值。与我们将数据分成训练集和测试集的预测建模方法不同,statsmodels
利用整个数据集提供全面的统计洞察。这种对数据的充分利用允许详细理解变量之间的关系并提高统计估计的准确性。上面的代码应该输出以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
OLS 回归结果 ============================================================================== 因变量: SalePrice R-平方: 0.518 模型: OLS 调整 R-平方: 0.518 方法: 最小二乘法 F-统计量: 2774. 日期: 2024年3月31日 周日 Prob (F-统计量): 0.00 时间: 19:59:01 对数似然: -31668. 观测数量: 2579 AIC: 6.334e+04 残差自由度: 2577 BIC: 6.335e+04 模型自由度: 1 协方差类型: 非稳健 ============================================================================== 系数 标准误差 t P>|t| [0.025 0.975] ------------------------------------------------------------------------------ 常数 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 ============================================================================== Omnibus: 566.257 杜宾-沃森: 1.926 Prob(Omnibus): 0.000 贾克-贝拉 (JB): 3364.083 偏度: 0.903 Prob(JB): 0.00 峰度: 8.296 条件数: 5.01e+03 ============================================================================== 注意事项 [1] 标准误差假定误差的协方差矩阵已正确指定。 [2] 条件数很大,5.01e+03。这可能表明存在 强多重共线性或其他数值问题。 |
请注意,这与 scikit-learn 的回归结果不同,因为使用了完整数据集,没有进行训练-测试集分割。
让我们深入了解 statsmodels
对 OLS 回归的输出,并解释 P 值、系数、置信区间和诊断结果告诉我们关于模型的信息,特别关注从“GrLivArea”预测“SalePrice”。
P 值和系数
- “GrLivArea”的系数: “GrLivArea”的系数为 110.5551。这意味着每增加一平方英尺的居住面积,房屋的销售价格预计将增加约 110.55 美元。该系数量化了居住面积大小对房屋销售价格的影响。
- “GrLivArea”的 P 值:与“GrLivArea”系数相关的 P 值本质上为 0(由 0.000 附近的
P>|t|
表示),表明居住面积是销售价格的高度显著预测因子。在统计学上,我们可以拒绝系数为零(无效应)的零假设,并自信地指出居住面积与销售价格之间存在强烈的关系(但不一定是唯一因素)。
置信区间
- “GrLivArea”的置信区间:“GrLivArea”系数的置信区间为 [106.439, 114.671]。这个范围告诉我们,我们有 95% 的信心认为居住面积对销售价格的真实影响落在这个区间内。它提供了我们系数估计的精确度量。
诊断
- R-平方 (R²):R² 值为 0.518,表明居住面积可以解释销售价格约 51.8% 的变异。它是衡量模型拟合数据程度的指标。预计此数字与 scikit-learn 回归的结果不同,因为数据不同。
- F-统计量和 Prob (F-统计量):F-统计量是衡量模型整体显著性的指标。F-统计量为 2774,Prob (F-统计量) 基本上为 0,这表明模型具有统计显著性。
- Omnibus, Prob(Omnibus):这些测试评估残差的正态性。残差是预测值 ($\hat{y}$) 与实际值 ($y$) 之间的差值。线性回归算法基于残差呈正态分布的假设。Prob(Omnibus) 值接近 0 表明残差不呈正态分布,这可能会影响某些统计测试的有效性。
- Durbin-Watson:Durbin-Watson 统计量检验残差中是否存在自相关。它介于 0 和 4 之间。一个接近 2 (1.926) 的值表明没有强烈的自相关。否则,这表明 $X$ 和 $y$ 之间的关系可能不是线性的。
statsmodels
的这份综合输出提供了对“GrLivArea”如何以及为何影响“SalePrice”的深入理解,并辅以统计证据。它强调了不仅要使用模型进行预测,还要解释它们以基于坚实的统计基础做出明智决策的重要性。这种洞察力对于那些希望探索数据背后统计故事的人来说是无价的。
进一步阅读
API
教程
- Scikit-Learn 线性回归:带示例的综合指南 作者 Avijeet Biswal
书籍
- Python 数据科学手册 作者 Jake VanderPlas
Ames 住房数据集和数据字典
总结
在这篇文章中,我们探讨了监督学习的基本概念,特别关注回归分析。我们使用 Ames 住房数据集演示了如何利用 scikit-learn
进行模型构建和性能评估,以及如何利用 statsmodels
获取数据中的统计洞察。从数据到洞察的旅程强调了预测建模和统计分析在有效理解和利用数据方面的关键作用。
具体来说,你学到了:
- 监督学习中分类和回归任务的区别。
- 如何根据数据性质确定使用哪种方法。
- 如何使用
scikit-learn
实现一个简单的线性回归模型,评估其性能,并理解模型 R² 分数的意义。 - 使用
statsmodels
探索数据统计方面的价值,包括解释系数、P 值和置信区间,以及诊断测试对于模型假设的重要性。
您有任何问题吗?请在下面的评论中提出您的问题,我将尽力回答。
暂无评论。