使用Python的mlxtend执行前向逐步特征选择时得分返回NaN的技术问题求助
解决Sequential Feature Selection返回NaN得分的问题
这个问题的核心原因很明确:你给分类模型用了回归任务的评分指标!
你用的RandomForestClassifier是分类模型,但指定了scoring="r2"——r²是专门用于回归任务的指标,分类模型的预测结果(类别标签或概率)无法用r²计算,所以所有步骤的得分都返回了NaN。
下面是具体的解决方案:
1. 匹配任务类型与评分指标
如果你的任务是分类任务(y是离散类别),把评分指标换成分类任务适用的选项,比如:
accuracy:准确率(最常用的分类指标)f1_macro:宏平均F1分数(适合不平衡数据集)roc_auc:ROC曲线下面积(适合二分类或多分类概率输出)
修改后的代码示例:
x_train, x_test = train_test_split(x, test_size = 0.2, random_state = 0) y_train, y_test = train_test_split(y, test_size = 0.2, random_state = 0) # 替换为分类任务的评分指标 sfs = SFS( RandomForestClassifier(n_estimators=100, random_state=0, n_jobs = -1), k_features = 28, forward = True, floating = False, verbose= 2, scoring= "accuracy", # 这里改成分类指标 cv = 4, n_jobs = -1 ).fit(x_train, y_train)
2. 确认任务类型,选择正确的模型
如果你的任务实际是回归任务(y是连续数值),那应该使用回归模型而非分类模型,此时r2指标是适用的。把RandomForestClassifier换成RandomForestRegressor即可:
from sklearn.ensemble import RandomForestRegressor x_train, x_test = train_test_split(x, test_size = 0.2, random_state = 0) y_train, y_test = train_test_split(y, test_size = 0.2, random_state = 0) # 使用回归模型,保留r2评分 sfs = SFS( RandomForestRegressor(n_estimators=100, random_state=0, n_jobs = -1), k_features = 28, forward = True, floating = False, verbose= 2, scoring= "r2", cv = 4, n_jobs = -1 ).fit(x_train, y_train)
3. 额外排查点(如果上述方案无效)
- 检查数据集是否存在缺失值:用
x_train.isnull().sum()和y_train.isnull().sum()查看,缺失值可能导致模型预测异常,进而出现NaN得分。 - 确认标签y的格式:分类任务中y应该是整数或字符串类型的类别,回归任务中y应该是连续数值类型。
内容的提问来源于stack exchange,提问作者Ankur Sharma
相关产品推荐
相关产品推荐

