You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R、Scikit-Learn与Statsmodels多线性回归拟合结果差异问题

多线性回归模型跨语言结果差异的排查与解决

以下是针对R lm()、Scikit-Learn LinearRegression、Statsmodels OLS结果不一致的核心排查点及解决方案:

  • Statsmodels 缺失截距项
    Statsmodels的OLS默认不添加截距,而R和Sklearn的回归模型默认包含截距,这是Statsmodels出现负R²的关键原因。
    解决:手动为自变量添加截距项:

    import statsmodels.api as sm
    X_with_intercept = sm.add_constant(X)  # 为X添加截距列
    model = sm.OLS(y, X_with_intercept).fit()
    print(f"R²: {model.rsquared}, 调整R²: {model.rsquared_adj}")
    
  • 数据标准化/归一化未同步
    若R中对特征做了标准化(如scale()),但Python中未复刻该步骤,会导致系数和R²偏差。
    解决:完全对齐R中的特征转换逻辑,例如用Sklearn实现标准化:

    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)  # 与R中scale(X)效果一致
    model = LinearRegression().fit(X_scaled, y)
    
  • 数据索引/行顺序不一致
    即使数据值相同,若R和Python中样本的行顺序、索引不匹配,会导致模型拟合的样本对应错误。
    解决:

    1. 导出数据时保留原始索引,导入Python后重置索引:
      import pandas as pd
      df = pd.read_csv("transformed_data.csv", index_col=0)
      df = df.reset_index(drop=True)
      X = df.drop("CTRRMAX", axis=1)
      y = df["CTRRMAX"]
      
    2. 验证R和Python中数据的统计量是否一致:
      • Python:print(X.mean(), X.var(), y.mean(), y.var())
      • R:cat(colMeans(X), apply(X,2,var), mean(y), var(y))
  • Sklearn 调整R²计算错误
    Sklearn未内置调整R²输出,若手动计算时公式错误会导致结果偏差。正确公式为:
    $$R^2_{adj} = 1 - \frac{(1-R^2)(n-1)}{n-p-1}$$
    (n=样本量,p=自变量个数)
    解决:用正确公式计算:

    from sklearn.linear_model import LinearRegression
    model = LinearRegression().fit(X, y)
    r2 = model.score(X, y)
    n, p = X.shape
    adj_r2 = 1 - (1 - r2) * (n - 1) / (n - p - 1)
    print(f"R²: {r2}, 调整R²: {adj_r2}")
    

内容的提问来源于stack exchange,提问作者Hallie Pimperl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:23:13