Python执行前向逐步特征选择时遇TypeError问题求助
前向逐步特征选择报错解决
错误根源
你遇到的TypeError: 'numpy.float64' object is not callable,本质是命名冲突:代码里的auc被当成变量赋值成了浮点数,而非原本用来计算AUC的函数。当你尝试用auc(...)调用时,自然会报错——浮点数不能当函数用。
另外你的next_best函数还有两个明显逻辑bug:
- 函数里没定义
next_var就直接return(next_var),运行到这会触发未定义变量错误 - 循环里刚找到一个比当前最优AUC高的特征就立刻return,根本没遍历完所有候选变量,选出来的不是全局最优特征
修复步骤
1. 解决auc命名冲突
检查代码所有地方,把用auc当变量名的地方改掉(比如改成auc_score),确保auc指向的是计算AUC的函数(比如sklearn.metrics.roc_auc_score)。
2. 重写next_best函数逻辑
修正循环和return逻辑,遍历完所有候选特征再返回最优的那个,同时补全AUC计算的完整流程(原代码里的auc函数没实现,这里用sklearn的标准流程示例):
def next_best(current_var, candidate_var, target, Revised_Basetable): best_auc = -1 best_var = None # 遍历所有候选特征 for v in candidate_var: # 取出当前特征组合对应的数据集 selected_features = Revised_Basetable[current_var + [v]] # 用逻辑回归训练模型(你也可以换成其他模型) from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score model = LogisticRegression(max_iter=1000) model.fit(selected_features, target) # 预测概率并计算AUC y_pred_proba = model.predict_proba(selected_features)[:, 1] auc_v = roc_auc_score(target, y_pred_proba) # 更新最优特征 if auc_v >= best_auc: best_auc = auc_v best_var = v # 遍历完所有特征后返回最优的那个 return best_var
3. 修正主循环调用逻辑
确保初始变量正确,同时避免迭代次数超过候选特征数量:
# 初始化:current_var为空,candidate_var是所有待选特征 current_var = [] candidate_var = Revised_Basetable.columns.drop(target).tolist() # 迭代次数取26和候选特征数的较小值,防止索引越界 number_iterations = min(26, len(candidate_var)) for i in range(number_iterations): next_var = next_best(current_var, candidate_var, target, Revised_Basetable) if not next_var: break # 没有更优特征时提前终止循环 current_var.append(next_var) candidate_var.remove(next_var)
额外提醒
- 确保
Revised_Basetable是合法的DataFrame,所有特征列都是数值型(非数值特征要先做编码处理,比如独热编码) - 如果你的
auc是自定义函数,要保证它的参数格式和调用逻辑匹配,建议优先用sklearn的标准函数减少自定义bug
内容的提问来源于stack exchange,提问作者Tamera
相关产品推荐
相关产品推荐

