隨機森林是以決策樹為基學(xué)習(xí)器的集成學(xué)習(xí)算法。隨機森林非常簡單,易于實現(xiàn),計算開銷也很小,更令人驚奇的是它在分類和回歸上表現(xiàn)出了十分驚人的性能,因此,隨機森林也被譽為“代表集成學(xué)習(xí)技術(shù)水平的方法”。
一、隨機森林RF簡介
只要了解決策樹的算法,那么隨機森林是相當(dāng)容易理解的。隨機森林的算法可以用如下幾個步驟概括:
用有抽樣放回的方法(bootstrap)從樣本集中選取n個樣本作為一個訓(xùn)練集。
用抽樣得到的樣本集生成一棵決策樹。在生成的每一個結(jié)點:
隨機不重復(fù)地選擇d個特征;
利用這d個特征分別對樣本集進行劃分,找到最佳的劃分特征(可用基尼系數(shù)、增益率或者信息增益判別)。
重復(fù)步驟1到步驟2共k次,k即為隨機森林中決策樹的個數(shù)。
用訓(xùn)練得到的隨機森林對測試樣本進行預(yù)測,并用票選法決定預(yù)測的結(jié)果。
下圖比較直觀地展示了隨機森林算法(圖片出自文獻2):
圖1:隨機森林算法示意圖
沒錯,就是這個到處都是隨機取值的算法,在分類和回歸上有著極佳的效果,是不是覺得強的沒法解釋~
然而本文的重點不是這個,而是接下來的特征重要性評估。
二、特征重要性評估
現(xiàn)實情況下,一個數(shù)據(jù)集中往往有成百上前個特征,如何在其中選擇比結(jié)果影響最大的那幾個特征,以此來縮減建立模型時的特征數(shù)是我們比較關(guān)心的問題。這樣的方法其實很多,比如主成分分析,lasso等等。不過,這里我們要介紹的是用隨機森林來對進行特征篩選。
用隨機森林進行特征重要性評估的思想其實很簡單,說白了就是看看每個特征在隨機森林中的每棵樹上做了多大的貢獻,然后取個平均值,最后比一比特征之間的貢獻大小。
好了,那么這個貢獻是怎么一個說法呢?通常可以用基尼指數(shù)(Gini index)或者袋外數(shù)據(jù)(OOB)錯誤率作為評價指標(biāo)來衡量。
我們這里只介紹用基尼指數(shù)來評價的方法,首先對另一種方法做個簡單介紹。
的定義為:在 RF 的每棵樹中,使用隨機抽取的訓(xùn)練自助樣本建樹,并計算袋外數(shù)據(jù) OOB)的預(yù)測錯誤率,然后隨機置換變量X,的觀測值后再次建樹并計算 OOB 的預(yù)測錯誤率,最后計算兩次 OOB 錯誤率的差值經(jīng)過標(biāo)準(zhǔn)化處理后在所有樹中的平均值即為變量 ,的置換重要性 ()
我們將變量重要性評分(variable importance measures)用 來表示,將Gini指數(shù)用 來表示,假設(shè)有 個特征 ,,,,, 棵決策樹, 個類別,現(xiàn)在要計算出每個特征 的Gini指數(shù)評分 ,亦即第 個特征在RF所有決策樹中節(jié)點分裂不純度的平均改變量。
第 棵樹節(jié)點 的 指數(shù)的計算公式為:
其中, 表示有 個類別, 表示節(jié)點 中類別 所占的比例。直觀地說,就是隨便從節(jié)點 中隨機抽取兩個樣本,其類別標(biāo)記不一致的概率。
特征 在第 棵樹節(jié)點 的重要性,即節(jié)點 分枝前后的 指數(shù)變化量為:
其中,和 分別表示分枝后兩個新節(jié)點的指數(shù)。如果,特征 在決策樹 i 中出現(xiàn)的節(jié)點為集合,那么 在第 棵樹的重要性為:
三、舉個例子
值得慶幸的是,sklearn已經(jīng)幫我們封裝好了一切,我們只需要調(diào)用其中的函數(shù)即可。
我們以UCI上葡萄酒的例子為例,首先導(dǎo)入數(shù)據(jù)集。
importpandasaspd
url='http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
df=pd.read_csv(url,header=None)
df.columns=['Classlabel','Alcohol','Malicacid','Ash',
'Alcalinityofash','Magnesium','Totalphenols',
'Flavanoids','Nonflavanoidphenols','Proanthocyanins',
'Colorintensity','Hue','OD280/OD315ofdilutedwines','Proline']
然后,我們來大致看下這時一個怎么樣的數(shù)據(jù)集
importnumpyasnp
np.unique(df['Classlabel'])
輸出為
array([1,2,3],dtype=int64)
可見共有3個類別。然后再來看下數(shù)據(jù)的信息:
df.info()
輸出為
RangeIndex: 178 entries, 0 to 177
Data columns (total 14 columns):
Class label 178 non-null int64
Alcohol 178 non-null float64
Malic acid 178 non-null float64
Ash 178 non-null float64
Alcalinity of ash 178 non-null float64
Magnesium 178 non-null int64
Total phenols 178 non-null float64
Flavanoids 178 non-null float64
Nonflavanoid phenols 178 non-null float64
Proanthocyanins 178 non-null float64
Color intensity 178 non-null float64
Hue 178 non-null float64
OD280/OD315 of diluted wines 178 non-null float64
Proline 178 non-null int64
dtypes: float64(11), int64(3)
memory usage: 19.5 KB
可見除去class label之外共有13個特征,數(shù)據(jù)集的大小為178。
按照常規(guī)做法,將數(shù)據(jù)集分為訓(xùn)練集和測試集。
try:
fromsklearn.cross_validationimporttrain_test_split
except:
fromsklearn.model_selectionimporttrain_test_split
fromsklearn.ensembleimportRandomForestClassifier
x,y=df.iloc[:,1:].values,df.iloc[:,0].values
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
feat_labels=df.columns[1:]
forest=RandomForestClassifier(n_estimators=10000,random_state=0,n_jobs=-1)
forest.fit(x_train,y_train)
好了,這樣一來隨機森林就訓(xùn)練好了,其中已經(jīng)把特征的重要性評估也做好了,我們拿出來看下。
importances=forest.feature_importances_
indices=np.argsort(importances)[::-1]
forfinrange(x_train.shape[1]):
print("%2d)%-*s%f"%(f+1,30,feat_labels[indices[f]],importances[indices[f]]))
輸出的結(jié)果為
1) Color intensity 0.182483
2) Proline 0.158610
3) Flavanoids 0.150948
4) OD280/OD315 of diluted wines 0.131987
5) Alcohol 0.106589
6) Hue 0.078243
7) Total phenols 0.060718
8) Alcalinity of ash 0.032033
9) Malic acid 0.025400
10) Proanthocyanins 0.022351
11) Magnesium 0.022078
12) Nonflavanoid phenols 0.014645
13) Ash 0.013916
對的就是這么方便。
如果要篩選出重要性比較高的變量的話,這么做就可以
threshold=0.15
x_selected=x_train[:,importances>threshold]
x_selected.shape
輸出為
(124, 3)
瞧,這不,幫我們選好了3個重要性大于0.15的特征了嗎~
審核編輯:郭婷
-
RF
+關(guān)注
關(guān)注
65文章
3050瀏覽量
166963 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1208瀏覽量
24689
原文標(biāo)題:利用隨機森林評估特征重要性原理與應(yīng)用
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論