根据scikit-learn的RFE文档,算法会逐步选择更小的特征集,并且只保留权重最高的特征。权重较低的特征会被剔除,这个过程会重复进行,直到剩余特征的数量达到用户指定的数量(或默认情况下为原始特征数量的一半)。
RFECV文档指出,特征是通过RFE和KFCV进行排名的。
我们在RFECV文档示例中展示的代码中有一组25个特征:
from sklearn.svm import SVCfrom sklearn.cross_validation import StratifiedKFoldfrom sklearn.feature_selection import RFECV,RFEfrom sklearn.datasets import make_classification# 使用3个信息特征构建分类任务X, y = make_classification(n_samples=1000, n_features=25, n_informative=3, n_redundant=2, n_repeated=0, n_classes=8, n_clusters_per_class=1, random_state=0)# 创建RFE对象并计算交叉验证得分svc = SVC(kernel="linear")# "accuracy"评分与正确分类的数量成比例rfecv = RFECV(estimator=svc, step=1, cv=StratifiedKFold(y, 2),scoring='accuracy')rfecv.fit(X, y)rfe = RFE(estimator=svc, step=1)rfe.fit(X, y)print('原始特征数量为 %s' % X.shape[1])print("RFE最终特征数量 : %d" % rfe.n_features_)print("RFECV最终特征数量 : %d" % rfecv.n_features_)print('')import numpy as npg_scores = rfecv.grid_scores_indices = np.argsort(g_scores)[::-1]print('打印RFECV结果:')for f in range(X.shape[1]): print("%d. 特征数量: %d; 网格得分: %f" % (f + 1, indices[f]+1, g_scores[indices[f]]))
这是我得到的输出:
原始特征数量为 25RFE最终特征数量 : 12RFECV最终特征数量 : 3打印RFECV结果:1. 特征数量: 3; 网格得分: 0.8180412. 特征数量: 4; 网格得分: 0.8160653. 特征数量: 5; 网格得分: 0.8160534. 特征数量: 6; 网格得分: 0.7991075. 特征数量: 7; 网格得分: 0.7970476. 特征数量: 8; 网格得分: 0.7830347. 特征数量: 10; 网格得分: 0.7830228. 特征数量: 9; 网格得分: 0.7819929. 特征数量: 11; 网格得分: 0.77802810. 特征数量: 12; 网格得分: 0.77405211. 特征数量: 14; 网格得分: 0.76201512. 特征数量: 13; 网格得分: 0.76007513. 特征数量: 15; 网格得分: 0.75200314. 特征数量: 16; 网格得分: 0.75001515. 特征数量: 18; 网格得分: 0.75000316. 特征数量: 22; 网格得分: 0.74803917. 特征数量: 17; 网格得分: 0.74600318. 特征数量: 19; 网格得分: 0.73910519. 特征数量: 20; 网格得分: 0.73902120. 特征数量: 21; 网格得分: 0.73800321. 特征数量: 23; 网格得分: 0.72906822. 特征数量: 25; 网格得分: 0.72505623. 特征数量: 24; 网格得分: 0.72504424. 特征数量: 2; 网格得分: 0.50695225. 特征数量: 1; 网格得分: 0.272896
在这个特定示例中:
- 对于RFE:代码总是返回12个特征(大约是25的一半,符合文档的预期)
- 对于RFECV,代码返回的数字在1到25之间(不是特征数量的一半)
在我看来,当选择RFECV时,特征数量的选择似乎仅基于KFCV得分 – 即交叉验证得分覆盖了RFE的逐步特征修剪。
这是真的吗?如果有人想使用原生的递归特征消除算法,那么RFECV是使用这个算法还是使用它的混合版本?
在RFECV中,是否对修剪后的剩余特征子集进行交叉验证?如果是的话,RFECV在每次修剪后保留多少特征?
回答:
在经过交叉验证的版本中,每一步都会重新排列特征,并丢弃排名最低的特征——文档中将其称为“递归特征选择”。
如果你想将其与原始版本进行比较,你需要计算RFE选择的特征的交叉验证得分。我猜RFECV的答案是正确的——从特征减少时模型性能的显著提升来看,你可能有一些高度相关的特征,这些特征正在损害模型的性能。