运行Python Probit模型时遇‘len() of unsized object’错误求解决
解决Probit模型运行时的"len() of unsized object"错误
问题根源
你直接对Spark DataFrame执行索引操作并转换为numpy数组,得到的是Spark Row对象的数组,而非数值型矩阵。Statsmodels无法识别这种非数值结构,从而抛出"len() of unsized object"错误。
解决方案
将Spark DataFrame转换为本地Pandas DataFrame后再处理,Statsmodels原生支持Pandas数据结构,能正确解析数值变量。
修正后的代码
import statsmodels.api as sm import pandas as pd # 从Spark获取数据并转换为Pandas DataFrame df = spark.sql("select * from knn_df").toPandas() cols=['constant','clnt_tenure_0_1', 'clnt_tenure_2_5', 'clnt_tenure_6_9', 'clnt_tenure_10_19', 'clnt_tenure_20p'] # 直接使用Pandas对象传入模型,无需转numpy数组 X = df[cols] y = df['nl'] # 用Series而非DataFrame,更符合Statsmodels要求 # 拟合Probit模型 probit_model = sm.Probit(y, X) result = probit_model.fit() print(result.summary2())
额外说明
- 导入修正:原代码中
import statsmodels.api as smf是错误的,smf通常对应statsmodels.formula.api,而基础的Probit模型应导入statsmodels.api(别名sm)或直接从statsmodels.discrete.discrete_model导入Probit。 - y的格式:使用
df['nl']得到Pandas Series,比二维DataFrame更适配Statsmodels的模型输入要求。 - 内存注意:如果数据集过大,
toPandas()可能导致内存溢出,此时需考虑采样或使用分布式统计库处理。
内容的提问来源于stack exchange,提问作者Aaron Fehl
相关产品推荐
相关产品推荐

