调用RandomSurvivalForest训练时提示y需为结构化数组错误求解
问题原因
- 你的
y参数不符合sksurv的输入要求:sksurv所有模型的y都要求是包含两个字段的结构化numpy数组,第一个字段为布尔型的事件发生标识(对应你的below列),第二个字段为数值型的事件/截尾时间(对应你的day_of_quarter列),你当前的代码仅将事件标识列作为y输入,自然会触发格式校验错误。 - 你的特征矩阵
X设置错误:当前你把生存时间列day_of_quarter作为唯一特征输入,生存分析的特征矩阵应该是除了事件标识、生存时间之外,你用于预测生存结局的自变量集合,同时X需要为二维数组格式。
修复方案
步骤1:构造符合要求的y结构化数组
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sksurv.ensemble import RandomSurvivalForest # 读取数据,除了事件、时间列外,还要把你要用到的建模特征列一起读进来 df = data.select(col('below'),col('day_of_quarter'), *[你的其他建模特征列]).toPandas() # 构造sksurv要求的结构化y数组 y = np.zeros(len(df), dtype=[('event', bool), ('time', float)]) y['event'] = df['below'].astype(bool).values y['time'] = df['day_of_quarter'].values
步骤2:构造特征矩阵X
X不能包含below和day_of_quarter两列,需要替换为你实际用于建模的特征,如果只有单个特征,需要用双括号取列保证是二维格式:
# 示例:如果用col1、col2作为建模特征 X = df[['col1', 'col2']]
如果当前是测试场景没有其他特征,可以临时造一个测试特征验证代码逻辑:
df['test_feature'] = np.random.randn(len(df)) X = df[['test_feature']]
步骤3:切分数据集并训练
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.25, random_state=0) rsf = RandomSurvivalForest(n_estimators=1000, min_samples_split=10, min_samples_leaf=15, max_features="sqrt", n_jobs=-1, random_state=0) rsf.fit(X_train, y_train)
内容的提问来源于stack exchange,提问作者kmox
相关产品推荐
相关产品推荐

