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

Lifelines中CoxPHFitter.fit()报错:布尔索引维度不匹配求助

解决Lifelines CoxPHFitter拟合时的IndexError问题

先把你的代码和报错情况整理出来:

你的代码

# imports...
from lifelines import CoxPHFitter
import pandas as pd
src_file = "Pred.csv"
df = pd.read_csv(src_file, header=0, delimiter=',')
df = df.drop(columns=['score'])
cph = CoxPHFitter()
cph.fit(df, duration_col='Length', event_col='Status', show_progress=True)

报错信息

Traceback (most recent call last):
  File "C:/Users/.../predictor.py", line 11, in <module>
    cph.fit(df, duration_col='Length', event_col='Status', show_progress=True)
  File "C:\Users\...\AppData\Local\conda\conda\envs\hrpred\lib\site-packages\lifelines\fitters\coxph_fitter.py", line 298, in fit
    self._check_values(df)
  File "C:\Users\...\AppData\Local\conda\conda\envs\hrpred\lib\site-packages\lifelines\fitters\coxph_fitter.py", line 323, in _check_values
    cols = str(list(X.columns[low_var]))
  File "C:\Users\...\AppData\Local\conda\conda\envs\hrpred\lib\site-packages\pandas\core\indexes\base.py", line 1754, in __getitem__
    result = getitem(key)
IndexError: boolean index did not match indexed array along dimension 0; dimension is 88 but corresponding boolean dimension is 76

这个错误的核心是:Lifelines在执行低方差特征检查时,内部生成的布尔筛选数组(维度76)和你的DataFrame实际列数(88)不匹配,导致索引越界。下面是几个有效的解决思路:


1. 直接跳过低方差检查(快速验证)

Lifelines默认会自动检查并提示低方差特征,你可以在fit方法里关闭这个检查,先验证是否能正常运行:

cph.fit(df, duration_col='Length', event_col='Status', show_progress=True, check_low_variance=False)

如果这样能成功运行,那问题确实出在低方差检查的逻辑和你的数据不兼容上。

2. 检查数据列的类型和完整性

维度不匹配大概率是你的DataFrame里存在非数值型的列(比如字符串、object类型),这些列在Lifelines内部会被自动排除在协变量之外,但低方差检查的逻辑没同步更新列数,导致索引错误。

你可以先运行以下代码排查:

# 查看所有列的类型和非空值情况
print(df.info())
# 查看所有列名
print(df.columns.tolist())
# 检查是否有非数值型协变量列(排除Length和Status)
non_numeric_cols = df.drop(['Length', 'Status'], axis=1).select_dtypes(exclude=['int64', 'float64']).columns
print("非数值型列:", non_numeric_cols.tolist())

如果发现有非数值型列,你需要把它们转换成数值型(比如用pd.get_dummies()做独热编码,或者用标签编码),再重新拟合。

3. 手动筛选高方差特征

你可以自己计算每列的方差,手动删除低方差的列,避免Lifelines内部检查出问题:

# 计算所有协变量列的方差(排除Length和Status)
covariates = df.drop(['Length', 'Status'], axis=1)
variances = covariates.var()

# 筛选方差大于阈值的列(比如0.001,可根据你的数据调整)
high_var_covariates = variances[variances > 0.001].index

# 重构DataFrame,只保留高方差协变量+时间/事件列
df_clean = df[list(high_var_covariates) + ['Length', 'Status']]

# 重新拟合
cph.fit(df_clean, duration_col='Length', event_col='Status', show_progress=True)

4. 检查数据是否有隐藏问题

另外,你可以检查数据是否有缺失值或者索引不连续的问题:

# 检查每列的缺失值数量
print(df.isnull().sum())
# 重置索引,避免索引不连续导致的异常
df = df.reset_index(drop=True)

至于为什么Lifelines的示例代码能正常运行,是因为示例数据是经过预处理的,所有协变量都是数值型,列数和内部检查的维度完全匹配,没有低方差或者类型不兼容的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:04:09