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


这个方法中没有直接提供,但是很容易实现,下面继续在波士顿房价数据集上进行实现 。
from sklearn.cross_validation import ShuffleSplitfrom sklearn.metrics import r2_scorefrom sklearn.datasets import load_bostonfrom collections import defaultdictfrom sklearn.ensemble import RandomForestRegressorimport numpy as npboston = load_boston()X = boston["data"]Y = boston["target"]names = boston["feature_names"]rf = RandomForestRegressor()scores = defaultdict(list)# crossvalidate the scores on a number of different random splits of the datafor train_idx, test_idx in ShuffleSplit(len(X), 100, .3):X_train, X_test = X[train_idx], X[test_idx]Y_train, Y_test = Y[train_idx], Y[test_idx]r = rf.fit(X_train, Y_train)acc = r2_score(Y_test, rf.predict(X_test))for i in range(X.shape[1]):X_t = X_test.copy()np.random.shuffle(X_t[:, i])shuff_acc = r2_score(Y_test, rf.predict(X_t))scores[names[i]].append((acc - shuff_acc) / acc)print("Features sorted by their score:")print(sorted( [(float('%.4f'%np.mean(score)), feat) forfeat, score in scores.items()], reverse=True) )Features sorted by their score:[(0.7508, 'LSTAT'), (0.5691, 'RM'), (0.0947, 'DIS'), (0.0396, 'CRIM'), (0.0371, 'NOX'), (0.0223, 'PTRATIO'), (0.0173, 'TAX'), (0.0132, 'AGE'), (0.0071, 'B'), (0.0053, 'INDUS'), (0.0036, 'RAD'), (0.0005, 'CHAS'), (0.0003, 'ZN')]
在这个例子当中,LSTAT和RM这两个特征对模型的性能有着很大的影响,打乱这两个特征的特征值使得模型的性能下降了75%和57% 。注意,尽管这些我们是在所有特征上进行了训练得到了模型,然后才得到了每个特征的重要性测试,这并不意味着我们扔掉某个或者某些重要特征后模型的性能就一定会下降很多,因为即便某个特征删掉之后,其关联特征一样可以发挥作用,让模型性能基本上不变 。
5.4 总结
鉴于本人对特征降维和特征选择学的不是很好,再加上网上有很多好的文章,因此,本文主要是进行了整理工作,有参考的地方都已经标明了出处 。
特征选择主要参考基于模型的特征选择详解 ( & )这篇文章进行的,里面对各个方法的说明和对比写的非常好,建议多看几遍 。
贴上一张来自使用进行数据挖掘的表 。
参考文献