Python统计建模入门:StatsModels库核心功能与OLS回归实战
2026/8/21 9:33:32 网站建设 项目流程

1. 项目概述:为什么是StatsModels?

如果你已经开始用Python处理数据,无论是做学术研究、市场分析还是机器学习项目,大概率已经接触过Pandas和NumPy。它们帮你完成了数据清洗和基础计算,但当你需要回答“变量A和B之间到底有没有关系?”、“这个促销活动到底带来了多少销量增长?”这类问题时,你就需要从描述性统计迈入推断性统计的世界。这时,StatsModels就该登场了。

StatsModels是一个专注于统计建模、假设检验和数据分析的Python库。它不像Scikit-learn那样以预测为核心,而是更侧重于模型的解释、统计推断和假设检验。简单来说,Scikit-learn告诉你“模型预测得准不准”,而StatsModels会深入告诉你“模型为什么这么预测”、“每个因素的影响有多大、是否显著”。对于需要撰写报告、发表论文或进行严谨业务归因的场景,StatsModels是不可或缺的工具。它提供了线性回归、广义线性模型、时间序列分析、非参数方法等丰富的统计模型,其API设计也贴近R语言风格,对熟悉统计学的用户非常友好。

2. 核心需求解析:何时需要StatsModels?

在数据科学项目中,我们常常面临不同的任务目标,选择合适的工具至关重要。StatsModels解决的是以下几类核心需求:

2.1 模型解释与统计推断

这是StatsModels的立身之本。当你需要一份详尽的回归分析报告,里面包含每个系数的估计值、标准误、t统计量、p值以及置信区间时,StatsModels的输出是标准且专业的。例如,在经济学中研究教育年限对收入的影响,你不仅想知道“多读一年书能多赚多少钱”(系数),更想知道“这个结论有多可靠”(p值)和“估计的误差范围有多大”(置信区间)。StatsModels的.summary()方法能一键生成这份报告。

2.2 诊断检验与模型验证

建立一个回归模型后,我们需检验其是否满足基本假设(如残差的正态性、同方差性、无自相关性)。StatsModels内置了丰富的诊断工具,如Durbin-Watson检验(自相关)、Breusch-Pagan检验(异方差)、Jarque-Bera检验(正态性)等。这些检验能帮助你判断模型结果的可靠性,并指导你进行模型改进(如添加变量、变换形式)。

2.3 复杂模型与专门领域分析

除了基础的普通最小二乘法(OLS),StatsModels支持更广泛的模型族:

  • 广义线性模型(GLM):用于因变量不符合正态分布的情况,如逻辑回归(二分类)、泊松回归(计数数据)。
  • 时间序列分析:ARIMA、VAR等模型,用于预测和分解具有时间依赖性的数据。
  • 方差分析(ANOVA):检验多组之间均值是否存在显著差异。
  • 生存分析:用于分析事件发生时间的数据。

当你面对这些特定类型的建模任务时,StatsModels提供了比通用机器学习库更专业、更全面的解决方案。

2.4 与Pandas的无缝集成

StatsModels的设计与Pandas的DataFrame深度结合。你可以直接使用DataFrame的列名作为公式的一部分,使得模型设定非常直观,代码可读性极高。例如,smf.ols('price ~ area + bedrooms', data=df)这样的公式接口,几乎是将统计学教科书上的模型写法直接搬到了代码里。

3. 环境准备与核心工具链

工欲善其事,必先利其器。一个稳定、隔离的Python环境是进行数据分析和建模的前提,它能避免不同项目间的包版本冲突。

3.1 Python环境搭建:Anaconda vs 原生Python

对于数据科学新手,我强烈推荐从Anaconda发行版开始。它是一个集成了Python、包管理工具conda以及数百个数据科学相关库(包括NumPy, Pandas, Matplotlib, StatsModels, Scikit-learn等)的科学计算平台。其优势在于开箱即用,环境管理直观。 安装完成后,你可以通过Anaconda Navigator图形界面或命令行来管理环境和安装包。对于有一定经验的用户,也可以使用原生Python配合pipvenv,这种方式更轻量,但对用户的依赖管理能力要求稍高。

3.2 安装StatsModels

无论使用哪种Python环境,安装StatsModels都非常简单。

  • 使用conda安装(推荐用于Anaconda用户)
    conda install statsmodels
    conda会自动处理StatsModels所依赖的NumPy、SciPy、Pandas等库的兼容版本。
  • 使用pip安装
    pip install statsmodels

3.3 配套工具与IDE选择

  • Jupyter Notebook / JupyterLab:交互式数据分析的黄金标准。它允许你将代码、可视化图表、公式和文字叙述融合在一个文档中,非常适合探索性数据分析和教学演示。StatsModels的模型结果可以很方便地在Notebook中展示。
  • VS Code:功能强大的通用代码编辑器。通过安装Python扩展和Jupyter扩展,它也能提供类似Notebook的交互式单元格体验,同时具备更好的代码调试、版本控制和管理大型项目的能力。你需要正确配置Python解释器路径。
  • PyCharm:专业的Python IDE,尤其适合大型、复杂的项目。它提供了强大的代码自动补全、重构和调试工具。

注意:无论选择哪种IDE,请确保你激活了正确的Python环境(或虚拟环境),并在该环境下安装StatsModels。一个常见的错误是在系统Python中安装了包,却在项目的虚拟环境中运行代码,导致ImportError

3.4 核心依赖库简介

StatsModels建立在几个核心科学计算库之上,了解它们有助于理解错误信息:

  • NumPy:提供高性能的多维数组对象和数学函数。StatsModels的底层计算大量依赖NumPy数组。
  • Pandas:提供DataFrame数据结构,用于表格数据的读写、清洗、转换和分析。StatsModels的模型接口主要接收Pandas的DataFrame。
  • SciPy:提供科学计算的基础算法,如优化、线性代数、积分、插值等。StatsModels的许多统计检验和分布函数依赖于SciPy。
  • Matplotlib/Seaborn:绘图库。虽然StatsModels自身有一些绘图功能(如plot_partial_regression),但更复杂的可视化通常需要结合这些专门的绘图库来完成。

4. StatsModels核心模块与API初探

安装好后,让我们快速浏览一下StatsModels的主要组成部分和两种核心的API风格,这能帮助你在后续建模时选择最顺手的方式。

4.1 主要模块构成

StatsModels的功能按模块组织,常用的有:

  • statsmodels.api:通常以import statsmodels.api as sm导入。这是“数组接口”(array interface),要求用户将自变量和因变量准备为独立的NumPy数组或Pandas Series。这种方式更底层,控制更精细。
  • statsmodels.formula.api:通常以import statsmodels.formula.api as smf导入。这是“公式接口”(formula interface),允许用户使用R语言风格的字符串公式(如‘y ~ x1 + x2’)来指定模型,数据直接传入一个DataFrame。这种方式更简洁、直观,尤其适合从统计软件转过来的用户。
  • statsmodels.tsa.api:时间序列分析模块。
  • statsmodels.discrete:离散选择模型(如逻辑回归)。
  • statsmodels.robust:稳健回归模型。

对于初学者和大多数回归任务,smf(公式接口)是更友好的起点。

4.2 数组接口 vs 公式接口:一个简单对比

假设我们有一个DataFramedf,包含因变量price和自变量area,bedrooms

使用公式接口(smf)

import statsmodels.formula.api as smf model = smf.ols('price ~ area + bedrooms', data=df) results = model.fit() print(results.summary())

这种方式极其直观,公式‘price ~ area + bedrooms’直接对应统计学模型。添加交互项或多项式也很方便,如‘price ~ area + bedrooms + area:bedrooms’‘price ~ area + I(area**2)’

使用数组接口(sm)

import statsmodels.api as sm # 需要手动准备因变量y和自变量X(需添加常数项) X = df[['area', 'bedrooms']] X = sm.add_constant(X) # 非常重要!添加常数项(截距) y = df['price'] model = sm.OLS(y, X) results = model.fit() print(results.summary())

数组接口要求显式地将自变量组合成矩阵X,并且必须记得使用sm.add_constant来添加截距项,否则模型会强制通过原点,这通常不符合实际情况。这种方式在编程式生成大量模型或处理特殊数据结构时更有优势。

实操心得:我个人的习惯是,在探索性分析和快速建模时使用smf公式接口,因为写起来快,不易出错(忘加截距)。而在构建自动化建模管道或处理自定义设计矩阵时,使用sm数组接口,因为它更灵活,与NumPy/Pandas的数组操作结合更紧密。

4.3 模型拟合与结果解读

无论使用哪种接口,.fit()方法都是启动模型估计的核心。拟合后返回的结果对象(如results)包含了所有信息。 调用results.summary()会打印出一张非常丰富的统计表格,主要包含三大部分:

  1. 模型概览:R-squared(拟合优度)、Adj. R-squared(调整后拟合优度)、F-statistic(F统计量)等,用于评估模型整体表现。
  2. 系数表:这是核心。列出了每个自变量(包括截距const)的:
    • coef:系数估计值。解释为“在其他变量不变的情况下,该自变量每变动一个单位,因变量平均变动coef个单位”。
    • std err:标准误。衡量系数估计的精确度,越小越好。
    • t:t统计量,等于coef / std err
    • P>|t|:p值。检验该系数是否显著不等于0。通常p<0.05认为在95%置信水平下显著。
    • [0.025 0.975]:95%置信区间。我们有95%的把握认为,真实的系数值落在这个区间内。
  3. 诊断检验:如Omnibus、Jarque-Bera(检验残差正态性)、Durbin-Watson(检验残差自相关)等。

学会阅读这份摘要表,是使用StatsModels进行统计分析的基本功。

5. 从零实现一个完整的OLS回归案例

让我们通过一个完整的、可复现的案例,将上述所有知识点串联起来。我们将使用一个模拟的房屋数据集,研究房屋面积和卧室数量对价格的影响。

5.1 数据准备与探索

首先,我们生成一些模拟数据并做初步观察。

import numpy as np import pandas as pd import statsmodels.formula.api as smf import matplotlib.pyplot as plt import seaborn as sns # 设置随机种子保证可复现 np.random.seed(42) # 生成模拟数据 n_samples = 100 area = np.random.normal(120, 30, n_samples) # 面积,均值120平米,标准差30 bedrooms = np.random.randint(1, 5, n_samples) # 卧室数,1到4间 # 生成价格:基础价格 + 面积效应 + 卧室效应 + 随机噪声 price = 200000 + 3000 * area + 50000 * bedrooms + np.random.normal(0, 50000, n_samples) # 创建DataFrame df = pd.DataFrame({'price': price, 'area': area, 'bedrooms': bedrooms}) print(df.head()) print(df.describe()) # 可视化关系 fig, axes = plt.subplots(1, 2, figsize=(12, 4)) sns.scatterplot(data=df, x='area', y='price', ax=axes[0]) axes[0].set_title('Price vs Area') sns.boxplot(data=df, x='bedrooms', y='price', ax=axes[1]) axes[1].set_title('Price vs Bedrooms') plt.tight_layout() plt.show()

这一步帮助我们理解数据的基本分布和变量间的初步关系。散点图能看面积与价格的趋势,箱线图能看不同卧室数下的价格分布。

5.2 模型建立与拟合

使用公式接口建立多元线性回归模型。

# 使用公式接口建立模型 model = smf.ols('price ~ area + bedrooms', data=df) # 拟合模型 results = model.fit()

就这么简单,两行代码。smf.ols指定了模型和方法(普通最小二乘),‘price ~ area + bedrooms’定义了模型结构,data=df指明了数据源。

5.3 结果解读与诊断

现在,查看我们最关心的模型摘要。

print(results.summary())

输出表格会非常长,我们聚焦关键信息:

  • R-squared: 例如0.85,表示模型解释了价格85%的变异。调整后的R-squared(Adj. R-squared)考虑了自变量个数,更为稳健。
  • 系数表:
    • const(截距): 估计值可能在20万左右,代表面积为0、卧室为0时的“基础价格”(在现实中可能无实际意义,更多是数学上的调整)。
    • area: 系数估计值应接近我们模拟的3000。p值(P>|t|)应远小于0.05,表示面积对价格有显著正向影响。置信区间也应围绕3000。
    • bedrooms: 系数估计值应接近50000,同样显著。
  • F-statistic: 其p值(Prob F-statistic)远小于0.05,说明模型整体是显著的,至少有一个自变量对因变量有解释力。

5.4 模型诊断与假设检验

一个负责任的建模者不能只看summary()就下结论,必须检验模型假设。StatsModels提供了便捷的诊断绘图。

# 绘制回归诊断图 fig = plt.figure(figsize=(12, 8)) # 使用StatsModels内置的诊断绘图功能 sm.graphics.plot_regress_exog(results, 'area', fig=fig) # 也可以使用更综合的诊断图 fig = sm.graphics.plot_partial_regression_grid(results, fig=fig) # 注意:此函数用法可能有变,新版推荐用plot_partial_regression plt.tight_layout() plt.show() # 更常用的综合诊断四图 fig = sm.graphics.plot_regress_exog(results, 'area') # 针对单个变量的诊断 # 或者使用更传统的残差诊断图(需从results中提取残差等) residuals = results.resid fitted_values = results.fittedvalues fig, axes = plt.subplots(2, 2, figsize=(12, 10)) # 1. 残差与拟合值图(检验同方差性) axes[0, 0].scatter(fitted_values, residuals) axes[0, 0].axhline(y=0, color='r', linestyle='--') axes[0, 0].set_xlabel('Fitted Values') axes[0, 0].set_ylabel('Residuals') axes[0, 0].set_title('Residuals vs Fitted') # 2. Q-Q图(检验残差正态性) sm.qqplot(residuals, line='45', fit=True, ax=axes[0, 1]) axes[0, 1].set_title('Normal Q-Q') # 3. 标准化残差平方根与拟合值图(也检验同方差性) standardized_residuals = np.sqrt(np.abs(residuals / residuals.std())) axes[1, 0].scatter(fitted_values, standardized_residuals) axes[1, 0].set_xlabel('Fitted Values') axes[1, 0].set_ylabel('Sqrt(|Standardized Residuals|)') axes[1, 0].set_title('Scale-Location') # 4. 残差与杠杆值图(识别强影响点) sm.graphics.influence_plot(results, ax=axes[1, 1], criterion="cooks") axes[1, 1].set_title('Residuals vs Leverage') plt.tight_layout() plt.show()

通过这些图,我们可以判断:

  1. 残差vs拟合值图:点应随机分布在水平线y=0周围,无明显的漏斗或曲线形状,否则可能存在异方差或非线性关系。
  2. Q-Q图:点应大致分布在45度对角线上,否则残差可能偏离正态分布。
  3. Scale-Location图:类似第一张图,用于判断异方差性。
  4. 残差vs杠杆图:帮助识别高杠杆点(对模型参数影响大的点)和高残差点(模型预测不好的点)。图中右上或右下的点需要特别关注。

5.5 模型预测与应用

模型通过检验后,就可以用来预测了。

# 预测已有数据 df['predicted_price'] = results.predict() # 不传参数则预测训练样本 print(df[['price', 'predicted_price']].head()) # 预测新数据 new_data = pd.DataFrame({'area': [150, 200], 'bedrooms': [3, 4]}) new_predictions = results.predict(new_data) print("对新数据的预测价格:") print(new_predictions) # 获取预测的置信区间 predictions_summary = results.get_prediction(new_data).summary_frame(alpha=0.05) # 95%置信区间 print(predictions_summary[['mean', 'mean_se', 'mean_ci_lower', 'mean_ci_upper']])

.predict()方法非常方便。get_prediction()不仅能给出点预测(mean),还能给出预测的标准误(mean_se)和置信区间(mean_ci_lower, mean_ci_upper),这对于评估预测的不确定性至关重要。

6. 常见问题、误区与排查技巧

在实际使用中,你肯定会遇到各种报错和令人困惑的结果。这里记录了一些典型问题和我的解决思路。

6.1 安装与导入问题

  • ImportError: cannot import name ‘xxx’ from ‘statsmodels’: 这通常是版本不匹配或环境混乱导致的。首先,确认你安装的StatsModels版本。在终端执行pip show statsmodelsconda list statsmodels。尝试升级到最新稳定版:pip install --upgrade statsmodels。如果问题依旧,检查你的Python环境路径,确保你不是在多个Python版本或环境中切换导致了混乱。一个干净的重置方法是:创建一个新的虚拟环境,然后重新安装所有依赖。

  • ModuleNotFoundError: No module named ‘patsy’: 当你使用公式接口(smf)时,需要patsy这个包来解析公式。它通常会和StatsModels一起被安装。如果缺失,手动安装即可:pip install patsy

6.2 模型拟合与结果解读问题

  • 系数符号与预期相反: 这可能是多重共线性的典型信号。当两个或多个自变量高度相关时,模型很难区分它们各自对因变量的独立影响,导致系数估计不稳定甚至符号错误。解决方法:1) 检查自变量间的相关系数矩阵(df.corr()),剔除相关性极高的变量之一;2) 使用方差膨胀因子(VIF)来量化共线性程度。StatsModels没有直接计算VIF的函数,但可以用statsmodels.stats.outliers_influence.variance_inflation_factor来计算。

    from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.tools.tools import add_constant X = add_constant(df[['area', 'bedrooms']]) # 计算VIF需要包含常数项 vif_data = pd.DataFrame() vif_data["feature"] = X.columns vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] print(vif_data)

    通常,VIF大于10(有些严格标准是5)就表明存在严重的多重共线性。

  • R-squared很高,但系数都不显著(p值很大): 这同样是多重共线性的一个可能迹象。模型整体拟合度看似不错(所有变量联合解释力强),但无法辨别出单个变量的贡献。另一个可能是样本量太小。检查共线性并考虑增加样本量。

  • OLS模型拟合时提示‘LinAlgError: Singular matrix’: 矩阵奇异,无法求逆。这通常意味着你的自变量中存在完全共线性。例如,不小心把因变量也放入了自变量,或者自变量中有一列是常数,或者其中一列是其他几列的线性组合(比如“总面积”和“卧室面积+客厅面积”同时存在)。检查你的数据,移除冗余变量。

6.3 使用数组接口(sm.api)时的经典错误

  • 忘记添加常数项(截距): 这是新手使用数组接口时最常犯的错误。如果你使用sm.OLS(y, X),而X中没有一列全为1的值,那么模型会强制拟合一个通过原点的回归线(即截距为0)。这通常不符合实际情况,会导致系数估计有偏。务必在拟合前使用X = sm.add_constant(X)

  • 因变量y或自变量X的数据类型问题sm.OLS期望输入是类似数组的对象。如果你传入的是Pandas DataFrame的单个列(Series),没问题。但如果你传入一个多列的DataFrame作为y,可能会出错。确保y是一维的,X是二维的。

6.4 模型诊断与优化

  • 残差图显示明显的模式(如曲线、漏斗形): 这违背了线性回归的“线性”和“同方差”假设。

    • 非线性:尝试对自变量或因变量进行变换,如取对数(np.log(area))、平方根,或添加多项式项(在公式中用I(area**2))。
    • 异方差(漏斗形):可以考虑使用加权最小二乘法(WLS)代替OLS,或者对因变量进行变换(如对数变换)。StatsModels中可以使用sm.WLS
    • 残差自相关(时间序列数据中常见):考虑使用时间序列模型,或在线性模型中添加滞后项。
  • Q-Q图显示残差非正态: 对于大样本数据,中心极限定理保证了系数估计量的渐近正态性,因此轻微的偏离正态可能影响不大,但会影响假设检验(p值)的精确性。可以考虑:1) 检查是否有异常值;2) 对变量进行变换;3) 使用更稳健的估计方法。

  • 存在强影响点(高杠杆点、离群点): 在残差vs杠杆图中,右上角的点对模型参数影响巨大。需要审视这些数据点是否合理。如果是数据录入错误,则修正或删除。如果是真实的极端值,可以考虑使用稳健回归sm.RLM),它对异常值不敏感。

6.5 公式接口(smf)使用技巧

  • 分类变量的处理: StatsModels的公式接口能自动处理分类变量(C())。例如,‘price ~ area + C(bedrooms)’会把bedrooms当作分类变量,为每个类别(除了一个作为基准)生成一个虚拟变量。这对于卧室数量这种虽然是整数但更适合看作分类的情况很有用。

    model_cat = smf.ols('price ~ area + C(bedrooms)', data=df).fit() print(model_cat.summary())
  • 交互项: 使用冒号:表示交互项。‘price ~ area + bedrooms + area:bedrooms’表示同时考虑面积和卧室数的主效应以及它们的交互效应。星号*表示主效应加交互效应,即A*B等价于A + B + A:B

  • 公式中函数的使用: 可以使用I()来包裹数学表达式,防止公式解析器误解。例如,‘price ~ area + I(area**2)’添加了面积的二次项。也可以使用np.log()等NumPy函数,如‘np.log(price) ~ area’

7. 进阶应用:从OLS走向更广阔的模型世界

掌握了OLS之后,StatsModels的宝库才刚刚打开。你的数据和分析需求会引导你探索更复杂的模型。

7.1 广义线性模型(GLM)

当你的因变量不是连续的正态分布数据时,OLS就不适用了。例如:

  • 因变量是二元的(0/1,成功/失败):使用逻辑回归(Logistic Regression)。
    # 假设df中有一个‘sold’列,表示房屋是否售出(1或0) model_logit = smf.glm('sold ~ area + price', data=df, family=sm.families.Binomial()).fit() print(model_logit.summary()) # 系数解释为对数几率(log-odds)的变化
  • 因变量是计数数据(如一周内的客户访问次数):使用泊松回归或负二项回归。
    model_poisson = smf.glm('visit_count ~ marketing_spend', data=df, family=sm.families.Poisson()).fit()

GLM通过一个链接函数(link function)将因变量的期望值与自变量的线性组合连接起来,从而处理非正态的响应变量。

7.2 时间序列分析

对于按时间顺序收集的数据(如每日销售额、月度气温),StatsModels的tsa模块提供了强大工具。

  • ARIMA模型:用于单变量时间序列的预测。
    from statsmodels.tsa.arima.model import ARIMA # 假设‘sales’是一个Pandas Series,索引是时间 model_arima = ARIMA(df['sales'], order=(1,1,1)) # (p,d,q)参数 results_arima = model_arima.fit() results_arima.summary() forecast = results_arima.forecast(steps=10) # 预测未来10期

7.3 模型比较与选择

当你建立了多个候选模型(例如,一个包含交互项的模型和一个不包含的模型),可以使用统计检验来比较它们。

  • 似然比检验(Likelihood Ratio Test):适用于嵌套模型(一个模型是另一个模型的特殊形式)。
    model_simple = smf.ols('price ~ area', data=df).fit() model_complex = smf.ols('price ~ area + bedrooms + area:bedrooms', data=df).fit() # 执行似然比检验 lr_test_statistic = -2 * (model_simple.llf - model_complex.llf) # llf是对数似然值 # 自由度是复杂模型与简单模型的参数个数差 from scipy.stats import chi2 p_value = chi2.sf(lr_test_statistic, df=2) # 假设参数差为2 print(f"LR test p-value: {p_value:.4f}") # 如果p值很小(<0.05),则拒绝简单模型,支持复杂模型。
  • 信息准则:如AIC(Akaike Information Criterion)和BIC(Bayesian Information Criterion),可用于比较非嵌套模型。值越小,模型在拟合优度和复杂度之间的权衡越好。可以直接从results.aicresults.bic获取。

8. 与Scikit-learn的协同:取长补短

你可能会问,既然Scikit-learn也有线性回归(LinearRegression),我该用哪个?答案是:结合使用,各取所长。

  • Scikit-learn的优势

    • 统一的APIfitpredictscore,与机器学习工作流(如管道Pipeline、网格搜索GridSearchCV)集成得天衣无缝。
    • 性能与扩展:对于超大数据集,有时优化得更好,且易于与其它预测模型(如随机森林、SVM)结合成集成模型。
    • 预测导向:更关注预测准确度(如MSE, R² score)。
  • StatsModels的优势

    • 统计推断:提供详细的假设检验、p值、置信区间,这是Scikit-learn所缺乏的。
    • 模型诊断:丰富的诊断工具和统计检验。
    • 专业模型:更全面的传统统计模型,如时间序列、面板数据模型。

最佳实践

  1. 探索与解释阶段用StatsModels:当你需要理解变量关系、检验假设、撰写分析报告时。
  2. 构建预测管道用Scikit-learn:当你需要将回归模型作为复杂机器学习流水线的一部分,进行交叉验证、超参数调优和部署时。

你甚至可以将两者结合:用StatsModels做深入分析和变量筛选,然后用筛选后的变量在Scikit-learn中构建最终的预测模型。例如,先用StatsModels的回归找出显著变量(p<0.05),再将这些变量用于Scikit-learn的LinearRegression或更复杂的模型中进行预测优化。

我个人在项目中经常这样操作:先用smf.ols快速跑一遍,看哪些变量显著、是否存在共线性、模型假设是否满足。在确认数据质量和模型设定没问题后,如果项目核心是预测,我会将数据导入Scikit-learn的流程,利用其PipelineGridSearchCV来优化预测性能。这套组合拳,既能保证分析的深度,又能兼顾工程的效率。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询