为了更能体现基于机器学习的变量筛选的效果,向cancer数据集中增加噪声特征。
#增加噪声数据 import numpy as np rng = np.random.RandomState(33) #设定种子数,保证生成的随机数相同 noise = rng.normal(size=(len(data),50)) #基于这个随机数产生一个50个维度的正态分布数据 noiseDf = pd.DataFrame(noise) dataNoiseDf = pd.concat([dataDf,noiseDf],axis=1) #与噪声数据合并 #划分样本集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(dataNoiseDf, targetSer, random_state=33, test_size=0.40) #划分训练集和测试集 (1)单一模型SelectFromModel是sklearn中用于基于模型的特征选择的类,它可以选出重要性程度大于给定阈值的所有特征。
##基于单一算法 from sklearn.feature_selection import SelectFromModel from sklearn.ensemble import RandomForestClassifier select1 = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=0), threshold='median') #使用中位数作为阈值,选出40个显著特征 select1.fit(X_train, y_train) X_train_l1 = select1.transform(X_train) print("X_train.shape:{}".format(X_train.shape)) print("X_train_l1.shape:{}".format(X_train_l1.shape)) #可视化判定结果,黑色为显著特征,白色为非显著特征 import matplotlib.pyplot as plt mask1 = select1.get_support() print("Effective Features:{}".format(list(mask1))) plt.matshow(mask1.reshape(1,-1), cmap='gray_r') plt.xlabel("Feature Index")结果如下:
Out[20]: X_train.shape:(341, 80) X_train_l1.shape:(341, 40) Effective Features:[True, True, True, True, True, True, True, True, True, True, True, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, False, True, False, True, False, False, False, False, False, False, True, True, False, True, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, True]从图中可以清晰看到,只有1个原始特征没有被选择,并且大多数噪声特征都被剔除掉。
(2)迭代RFE(recursive feature elimination,递归特征消除)是sklearn中一种基于迭代的特征选择类,它从所有特征开始构建模型,并根据模型舍弃最不重要的特征,然后使用除了被舍弃的特征之外的全部特征构建一个新模型,如此反复,直到仅剩下预设数量的特征为止。
##基于迭代 from sklearn.feature_selection import RFE select2 = RFE(RandomForestClassifier(n_estimators=100, random_state=42), n_features_to_select=40) #直接设定最后要保留的特征个数为40个 select2.fit(X_train, y_train) X_train_l2 = select2.transform(X_train) #可视化判定结果,黑色为显著特征,白色为非显著特征 mask2 = select2.get_support() print("Effective Features:{}".format(list(mask2))) plt.matshow(mask2.reshape(1,-1), cmap='gray_r') plt.xlabel("Feature Index")结果如下:
Out[22]: Effective Features:[True, True, True, True, True, True, True, True, True, True, True, False, True, True, True, False, True, True, False, False, True, True, True, True, True, True, True, True, True, True, False, False, False, True, True, True, True, False, False, False, False, True, False, True, False, False, False, False, False, False, False, False, False, False, False, True, False, True, False, True, False, False, False, True, False, True, False, False, False, True, True, False, False, False, False, False, False, False, False, True]从图中可以清晰看到,有4个原始特征没有被选择,并且大多数噪声特征都被剔除掉,相比上一种基于单模型的效果要差一点。
[1] Python机器学习基础教程
[2] Python数据分析与数据化运营
[3] sklearn.datasets.load_breast_cancer
[4] sklearn.feature_selection.SelectFromModel
[5] sklearn.feature_selection.RFE