使用PyGAD进行特征选择:验证全特征最优子集的正确性
验证全特征最优结果的方法及代码问题修正
一、验证全特征是否为真最优子集
- 手动对比子集性能:挑选不同特征子集(比如LGBM特征重要性排名前10/20的特征、随机选15个特征),用和代码中相同的
cross_val_score(bst, X_subset, y_train, scoring="roc_auc", cv=2)计算平均得分,对比是否所有子集得分都低于全特征的得分。 - 特征重要性辅助验证:训练全特征的LGBM模型,输出特征重要性判断冗余特征:
找出重要性极低的特征,去掉这些特征后重新计算交叉验证得分,看是否接近甚至超过全特征的得分。bst.fit(X_train, y_train) print(dict(zip(bc.feature_names, bst.feature_importances_))) - 提升交叉验证稳定性:将CV折数从2折改为5折或10折,减少结果随机性,再看全特征是否依然是最优。
- 测试集泛化验证:用全特征和其他候选子集分别在测试集上训练模型,计算roc_auc得分:
# 全特征测试得分 bst.fit(X_train, y_train) full_score = roc_auc_score(y_test, bst.predict_proba(X_test)[:,1]) # 子集测试得分(示例:选前10个重要特征) top_features = sorted(zip(bst.feature_importances_, bc.feature_names), reverse=True)[:10] top_features = [f for _,f in top_features] bst.fit(X_train[top_features], y_train) subset_score = roc_auc_score(y_test, bst.predict_proba(X_test[top_features])[:,1]) print(f"全特征测试得分:{full_score}, 子集测试得分:{subset_score}")
二、代码中导致全特征被选中的潜在问题
你的GA设置和模型参数可能让算法倾向于保留全特征,而非找到更优子集:
- 基因空间设置错误:
gene_space = np.full(m,1)会让初始种群全是全选特征的个体,且mutation_type="random"的突变范围是-2到5,但你的特征选择逻辑是solution ==1才选中,大部分突变后的基因值不是1,对应的子集得分会更低,导致GA更易保留全1的个体。应该把基因空间设为只能取0或1:gene_space = [0, 1] - 突变参数不合理:
mutation_percent_genes=100会每次突变所有基因,个体变化过于剧烈,难以收敛到优质子集,建议调低到10%-20%:mutation_percent_genes = 15 - 初始范围错误:
init_range_low=-2和init_range_high=5不符合0/1基因的要求,应该改为:init_range_low = 0 init_range_high = 1 - 模型过于简单:
n_estimators=1, max_depth=2的LGBM模型容量太低,无法挖掘特征间的冗余性,全特征能给简单模型提供更多信息,导致得分最高。可以尝试调优模型:bst = lgbm(random_state=42, n_estimators=100, max_depth=5)
内容的提问来源于stack exchange,提问作者SimplyhumanRight
相关产品推荐
相关产品推荐

