数据挖掘:特征工程——特征提取与选择( 十 )


下面的例子是中基于随机森林的特征重要度度量方法:
from sklearn.datasets import load_bostonfrom sklearn.ensemble import RandomForestRegressorimport numpy as np#Load boston housing dataset as an exampleboston = load_boston()X = boston["data"]Y = boston["target"]names = boston["feature_names"]rf = RandomForestRegressor()rf.fit(X, Y)print("Features sorted by their score:")print(sorted(zip(map(lambda x: "%.4f"%x, rf.feature_importances_), names), reverse=True))Features sorted by their score:[('0.5128', 'LSTAT'), ('0.2896', 'RM'), ('0.0792', 'DIS'), ('0.0311', 'CRIM'), ('0.0188', 'NOX'), ('0.0179', 'AGE'), ('0.0174', 'TAX'), ('0.0123', 'PTRATIO'), ('0.0086', 'B'), ('0.0074', 'RAD'), ('0.0037', 'INDUS'), ('0.0007', 'ZN'), ('0.0007', 'CHAS')]#根据特征的重要性绘制柱状图features = data_fea.columnsimportances = rf.feature_importances_indices = np.argsort(importances[0:9])# 因指标太多,选取前10个指标作为例子plt.title('Index selection')plt.barh(range(len(indices)), importances[indices], color='pink', align='center')plt.yticks(range(len(indices)), [features[i] for i in indices])plt.xlabel('Relative importance of indicators')plt.show()
这里特征得分实际上采用的是 Gini。使用基于不纯度的方法的时候,要记住:
这种方法存在偏向,对具有更多类别的变量会更有利;对于存在关联的多个特征,其中任意一个都可以作为指示器(优秀的特征),并且一旦某个特征被选择之后,其他特征的重要度就会急剧下降(因为不纯度已经被选中的那个特征降下来了,其他的特征就很难再降低那么多不纯度了,这样一来,只有先被选中的那个特征重要度很高,其他的关联特征重要度往往较低) 。在理解数据时,这就会造成误解,导致错误的认为先被选中的特征是很重要的,而其余的特征是不重要的,但实际上这些特征对响应变量的作用确实非常接近的(这跟Lasso是很像的) 。
特征随机选择 方法稍微缓解了这个问题,但总的来说并没有完全解决 。下面的例子中,X0、X1、X2是三个互相关联的变量,在没有噪音的情况下,输出变量是三者之和 。
from sklearn.ensemble import RandomForestRegressorimport numpy as npsize = 10000np.random.seed(seed=10)X_seed = np.random.normal(0, 1, size)X0 = X_seed + np.random.normal(0, .1, size)X1 = X_seed + np.random.normal(0, .1, size)X2 = X_seed + np.random.normal(0, .1, size)X = np.array([X0, X1, X2]).TY = X0 + X1 + X2rf = RandomForestRegressor(n_estimators=20, max_features=2)rf.fit(X, Y)print('Scores for X0, X1, X2:', ['%.3f'%x for x in rf.feature_importances_])>>>Scores for X0, X1, X2 ['0.272', '0.548', '0.179']
当计算特征重要性时,可以看到X1的重要度比X2的重要度要高出3倍,但实际上他们真正的重要度是一样的 。尽管数据量已经很大且没有噪音,且用了20棵树来做随机选择,但这个问题还是会存在 。
需要注意的一点是,关联特征的打分存在不稳定的现象,这不仅仅是随机森林特有的,大多数基于模型的特征选择方法都存在这个问题 。
5.3.2.2 平均精确率减少
另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响 。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响 。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率 。