【机器学习】Feature selection – Part III: random forests

Selecting good features – Part III: random forests


在我以前的文章中,我研究了单变量的特征选择和线性模型,以及用于特征选择的正则化。

在这篇文章中,我将讨论随机森林,另一种流行的特征排名方法。

随机森林特征重要性

随机森林由于其相对良好的准确性、鲁棒性和易用性而成为最流行的机器学习方法之一。它们还提供了两种简单的特征选择方法:平均减少杂质(mean decrease impurity)和平均减少精度(mean decrease accuracy)

平均减少杂质

随机森林由许多决策树组成。决策树中的每个节点都是单个特性的一个条件,用于将数据集分成两个,以便类似的响应值最终出现在相同的集合中。选择局部最优条件的度量称为杂质。对于分类,它通常是基尼杂质或信息增益/熵,对于回归树是方差。因此,当训练树时,可以计算每个特征减少树中加权杂质的程度。对于森林,每个特征中的杂质减少量可以被平均,并且根据这个度量对特征进行排序

这是sklearning的随机森林实现(随机森林分类器和随机森林回归器)中公开的特征重要性度量。

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
import numpy as np
#Load boston housing dataset as an example
boston = 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: round(x, 4), rf.feature_importances_), names), 
             reverse=True))

在使用基于杂质的排名时,有几件事情需要牢记。首先,基于杂质减少的特征选择偏向于具有更多类别的优选变量(参见随机森林变量重要性度量中的偏差)。其次,当数据集具有两个(或多个)相关特征时,那么从模型的角度来看,这些相关特征中的任何一个都可以用作预测器,而没有具体的偏好。但是一旦其中之一被使用,其他的重要性显著降低,因为实际上它们能够去除的杂质已经被第一特征去除了。因此,它们报告的重要性将较低。当我们希望使用特征选择来减少过拟合时,这并不是一个问题,因为删除大部分由其他特征复制的特征是有意义的。但在解释数据时,可能导致错误的结论,即其中一个变量是强预测因子,而同一组中的其他变量不重要,而实际上它们与响应变量的关系非常密切。

由于在每个节点创建时随机选择特征,这种现象的影响稍微降低了,但一般来说,这种影响并没有完全消除。在下面的示例中,我们有三个相关变量X_0X_1X_2,并且数据中没有噪声,输出变量只是三个特征的和:

size = 10000
np.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]).T
Y = X0 + X1 + X2
  
rf = RandomForestRegressor(n_estimators=20, max_features=2)
rf.fit(X, Y);
print("Scores for X0, X1, X2:", map(lambda x:round (x,3),
                                    rf.feature_importances_))

当我们计算特征导入时,我们看到X_1的重要性比X_2高10倍以上,而它们的“真”重要性非常相似。尽管数据是无噪声的,但这种情况还是会发生的,我们使用20棵树、随机选择的特征(在每次分割时,只考虑三个特征中的两个)和一个足够大的数据集。

然而,需要指出的一点是,解释相关变量的重要性/排序的难度不是随机森林特有的,而是适用于大多数基于模型的特征选择方法

平均递减精度

另一种流行的特征选择方法是直接测量每个特征对模型精度的影响。其基本思想是对每个特征的值进行置换,并测量置换降低模型精度的程度。显然,对于不重要的变量,置换应该对模型精度影响很小甚至没有影响,而置换重要变量应该显著降低模型精度

这种方法在sklearning中没有直接公开,但是实现起来很简单。继续前面对波士顿住房数据集中的特征进行排序的示例:

from sklearn.cross_validation import ShuffleSplit
from sklearn.metrics import r2_score
from collections import defaultdict
 
X = boston["data"]
Y = boston["target"]
 
rf = RandomForestRegressor()
scores = defaultdict(list)
 
#crossvalidate the scores on a number of different random splits of the data
for 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([(round(np.mean(score), 4), feat) for
              feat, score in scores.items()], reverse=True))

在本例中,LSTAT和RM是强烈影响模型性能的两个特性:置换它们分别使模型性能降低~73%和~57%。请记住,这些测量只是在模型经过训练(并且取决于)之后才进行的。这并不意味着,如果我们在没有这些特征的情况下训练模型,那么模型的性能将下降那么多,因为可以使用其他相关的特征来代替。

总结

随机森林是一种流行的特征排序方法,因为它们非常容易应用:一般来说,它们只需要很少的特征工程和参数调整,并且平均减少的杂质在大多数随机森林库中被暴露。但是,它们也有自己的陷阱,特别是在数据解释方面。通过相关特征,强特征可以以低分结束,并且该方法可以偏向于具有多个类别的变量。只要牢记这些问题,就没有理由不从您的数据中尝试它们。

接下来:稳定性选择,递归特征消除,并排比较所有讨论的方法的一个例子。

原文链接:http://blog.datadive.net/selecting-good-features-part-iii-random-forests/

猜你喜欢

转载自blog.csdn.net/ARPOSPF/article/details/85036757