特征选择中RBFOpt算法类型设置报错,求正确配置方法
解决RBFOpt设置算法类别时的AttributeError问题
问题原因
RBFOpt的API在版本迭代后,algorithm_class参数不再通过RbfoptAlgorithm枚举类指定,而是直接接受字符串格式的算法名称作为有效值。你尝试的MSRSM、DIRECT、GA都是合法的算法标识,但不能通过枚举类调用。
另外补充一个适配场景的优化点:你的需求是特征选择(每个特征是选/不选的二元决策),所以变量类型应该设置为'B'(binary)而非'C'(continuous),这样更贴合问题的离散特性,能提升优化精度。
修正后的完整代码
import pandas as pd from sklearn.ensemble import RandomForestRegressor from rbfopt import RbfoptUserBlackBox, RbfoptSettings, RbfoptAlgorithm # 假设df已提前加载,包含10个特征和目标列Outcome_Sold target_col = 'Outcome_Sold' # 定义RBFOpt的目标函数 def objective_function(features): # 将模型输出的连续值转为二元选择逻辑(大于0.5视为选中特征) selected_features = [df.columns[i] for i in range(10) if features[i] > 0.5] if not selected_features: return 1.0 # 避免空特征集导致模型训练报错,返回最差得分 X = df[selected_features].values y = df[target_col].values model = RandomForestRegressor() model.fit(X, y) return -model.score(X, y) # 最小化负R²分数,等价于最大化R² # 特征选择的上下界(0=不选,1=选) lower_bound = [0] * 10 upper_bound = [1] * 10 # 变量类型改为二元类型,匹配特征选择场景 var_type = ['B'] * 10 # 创建黑盒函数实例 black_box = RbfoptUserBlackBox(10, lower_bound, upper_bound, var_type, obj_funct=objective_function) # 设置RBFOpt参数:直接用字符串指定算法类别 settings = RbfoptSettings() settings.algorithm_class = 'MSRSM' # 替换为'DIRECT'或'GA'均可 settings.num_global_search = 50 settings.num_rbf = 500 # 执行优化流程 algorithm = RbfoptAlgorithm(settings, black_box) best_val, best_x, _ = algorithm.optimize() print(f"最优负R²得分: {best_val}") print(f"选中的特征索引(大于0.5视为选中): {[i for i, val in enumerate(best_x) if val > 0.5]}")
关键修改说明
- 移除了
RbfoptAlgorithm枚举类的调用,直接用字符串赋值给settings.algorithm_class - 将
var_type从连续类型改为二元类型,适配特征选择的离散决策需求 - 增加空特征集的处理逻辑,避免模型训练报错
- 补充完整的优化执行代码,可直接运行验证结果
内容的提问来源于stack exchange,提问作者JohnH
相关产品推荐
相关产品推荐

