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

使用NumPy数组调用statsmodels.logit时遭遇PatsyError:模型缺少必需因变量问题求助

解决statsmodels logit数组调用时的PatsyError问题

嘿,这个问题我之前也踩过坑!问题出在你调用sm.logit()时的参数顺序搞反了,导致函数无法识别正确的因变量。

核心错误原因

statsmodels的logit()函数在使用数组形式调用时,参数顺序是固定的:

sm.logit(endog, exog)

其中:

  • endog:必须是因变量(目标变量),也就是你要预测的Y_train
  • exog:是自变量特征矩阵,也就是你的X_train

你当前代码里写的sm.logit(X_train, Y_train)把自变量放在了第一个参数位置,函数会错误地将X_train当成需要预测的结果变量,但它是多特征的矩阵,不符合因变量的要求,因此抛出了PatsyError: model is missing required outcome variables。

修正后的代码

只需要调换参数顺序即可:

logit_model = sm.logit(Y_train, X_train).fit()

这个顺序和你用公式法的逻辑是一致的:公式里y ~ age+...中y是因变量,对应数组法里第一个参数的Y_train,后面的特征对应X_train。

额外优化:简化你的数据处理代码

你当前代码里重复执行了多次astype('category')和replace操作,显得冗余,可以简化成一次性处理:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import statsmodels.api as sm

bank = pd.read_csv("C:/Bank.csv")
print(bank.isnull().sum())  # 检查缺失值

# 一次性定义所有需要二进制编码的变量映射
binary_mappings = {
    'y': {'no': 0, 'yes': 1},
    'default': {'no': 0, 'yes': 1},
    'loan': {'no': 0, 'yes': 1},
    'housing': {'no': 0, 'yes': 1}
}

# 批量处理二进制编码
for col, mapping in binary_mappings.items():
    bank[col] = bank[col].replace(mapping).astype(int)

# 剩余的object类型列转为category(如果后续需要用到的话)
remaining_cat_cols = bank.select_dtypes(['object']).columns.difference(binary_mappings.keys())
bank[remaining_cat_cols] = bank[remaining_cat_cols].astype('category')

# 拆分特征和目标变量
bankx = bank[["age","default","balance","housing","loan","duration","campaign","pdays", "previous"]]
banky = bank["y"]
X = np.array(bankx)
Y = np.array(banky)

X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size=0.25)

# 修正参数顺序后的logit调用
logit_model = sm.logit(Y_train, X_train).fit()
print(logit_model.summary())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:47:35