如何在statsmodels中通过训练集测试集拆分训练线性回归模型
你遇到的报错由两个问题共同导致:
- 变量名不匹配:你导入的模块别名为
sm,但调用时写的是smf.OLS,未定义的变量名触发了属性检索错误 - API混淆:
statsmodels.formula.api下只提供小写的ols接口(接收公式+数据集参数),大写的OLS接口属于statsmodels.api模块,接收特征矩阵和目标向量作为入参。
以下是两种符合训练集/测试集拆分要求的正确实现方案:
方案1:沿用公式语法(和现有教程用法一致)
如果你习惯用y~x1+x2的公式写法,直接拆分完整DataFrame即可,不需要提前拆分特征和目标:
import statsmodels.formula.api as smf from sklearn.model_selection import train_test_split # 假设你的完整数据集存储在df变量中,目标列名为y,特征列名为x1/x2/x3 train_df, test_df = train_test_split(df, train_size=0.8, random_state=42) # 仅用训练集拟合模型 model = smf.ols('y ~ x1 + x2 + x3', data=train_df).fit() # 在测试集上做预测 y_pred = model.predict(test_df)
方案2:使用特征/目标拆分输入
如果你已经提前拆分好了特征矩阵和目标向量,用statsmodels.api的OLS接口即可:
import statsmodels.api as sm from sklearn.model_selection import train_test_split # 拆分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(features, target, train_size=0.8, random_state=42) # 手动添加截距项(statsmodels默认不会自动加截距) X_train_with_const = sm.add_constant(X_train) X_test_with_const = sm.add_constant(X_test) # 拟合模型 model = sm.OLS(y_train, X_train_with_const).fit() # 在测试集上做预测 y_pred = model.predict(X_test_with_const)
注意:如果省略sm.add_constant步骤,拟合出的会是过原点的回归模型,和公式语法的默认输出结果不一致
内容的提问来源于stack exchange,提问作者Yuxxxxxx
相关产品推荐
相关产品推荐

