随机森林对特征重要性排序
two methods:?
1.Mean decrease impurity?不純度降低
大概是對于每顆樹,按照impurity(gini /entropy /information gain)給特征排序,然后整個森林取平均。最優條件的選擇依據是不純度。不純度在分類中通常為Gini不純度或信息增益/信息熵,對于回歸問題來說是方差。?
基于不純度對模型進行排序有幾點需要注意:?
(1)基于不純度降低的特征選擇將會偏向于選擇那些具有較多類別的變量(bias)。?
(2)當存在相關特征時,一個特征被選擇后,與其相關的其他特征的重要度則會變得很低,因為他們可以減少的不純度已經被前面的特征移除了。
sklearn實現如下:
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"] print type(X),X.shape Y = boston["target"] names = boston["feature_names"] print 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)結果如下:
Features sorted by their score: [(0.5104, 'RM'), (0.2837, 'LSTAT'), (0.0812, 'DIS'), (0.0303, 'CRIM'), (0.0294, 'NOX'), (0.0176, 'PTRATIO'), (0.0134, 'AGE'), (0.0115, 'B'), (0.0089, 'TAX'), (0.0077, 'INDUS'), (0.0051, 'RAD'), (0.0006, 'ZN'), (0.0004, 'CHAS')]2.Mean decrease accuracy?準確率降低
這種方法是直接測量每種特征對模型預測準確率的影響,基本思想是重新排列某一列特征值的順序,觀測降低了多少模型的準確率。對于不重要的特征,這種方法對模型準確率的影響很小,但是對于重要特征卻會極大降低模型的準確率。?大概就是measure一下對每個特征加躁,看對結果的準確率的影響。影響小說明這個特征不重要,反之重要?
具體步驟如下:?在隨機森林中某個特征X的重要性的計算方法如下:?
a:對于隨機森林中的每一顆決策樹,使用相應的OOB(袋外數據)數據來計算它的袋外數據誤差,記為errOOB1.?
b: 隨機地對袋外數據OOB所有樣本的特征X加入噪聲干擾(就可以隨機的改變樣本在特征X處的值),再次計算它的袋外數據誤差,記為errOOB2.?
c:假設隨機森林中有Ntree棵樹,那么對于特征X的重要性=∑(errOOB2-errOOB1)/Ntree,之所以可以用這個表達式來作為相應特征的重要性的度量值是因為:若給某個特征隨機加入噪聲之后,袋外的準確率大幅度降低,則說明這個特征對于樣本的分類結果影響很大,也就是說它的重要程度比較高。
示例如下
from sklearn.cross_validation import ShuffleSplit from sklearn.metrics import r2_score from collections import defaultdictX = 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) forfeat, score in scores.items()], reverse=True)輸出結果:
Features sorted by their score: [(0.7276, 'LSTAT'), (0.5675, 'RM'), (0.0867, 'DIS'), (0.0407, 'NOX'), (0.0351, 'CRIM'), (0.0233, 'PTRATIO'), (0.0168, 'TAX'), (0.0122, 'AGE'), (0.005, 'B'), (0.0048, 'INDUS'), (0.0043, 'RAD'), (0.0004, 'ZN'), (0.0001, 'CHAS')]在這個例子中, LSTAT 和RM是兩個對模型影響較大的特征,打亂他們的順序將會降低模型約73%與57%的準確率。
參考:http://blog.datadive.net/selecting-good-features-part-iii-random-forests/
總結
以上是生活随笔為你收集整理的随机森林对特征重要性排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 随机森林如何评估特征重要性
- 下一篇: 计算机网络技术专业学生自我介绍,计算机网