Python機(jī)器學(xué)習(xí)利用隨機(jī)森林對特征重要性計(jì)算評估
1 前言
隨機(jī)森林是以決策樹為基學(xué)習(xí)器的集成學(xué)習(xí)算法。隨機(jī)森林非常簡單,易于實(shí)現(xiàn),計(jì)算開銷也很小,更令人驚奇的是它在分類和回歸上表現(xiàn)出了十分驚人的性能,因此,隨機(jī)森林也被譽(yù)為“代表集成學(xué)習(xí)技術(shù)水平的方法”。
2 隨機(jī)森林(RF)簡介
只要了解決策樹的算法,那么隨機(jī)森林是相當(dāng)容易理解的。隨機(jī)森林的算法可以用如下幾個(gè)步驟概括:
1.用有抽樣放回的方法(bootstrap)從樣本集中選取n個(gè)樣本作為一個(gè)訓(xùn)練集
2.用抽樣得到的樣本集生成一棵決策樹。在生成的每一個(gè)結(jié)點(diǎn):
- 隨機(jī)不重復(fù)地選擇d個(gè)特征
- 利用這d個(gè)特征分別對樣本集進(jìn)行劃分,找到最佳的劃分特征(可用基尼系數(shù)、增益率或者信息增益判別)
3.重復(fù)步驟1到步驟2共k次,k即為隨機(jī)森林中決策樹的個(gè)數(shù)。
4.用訓(xùn)練得到的隨機(jī)森林對測試樣本進(jìn)行預(yù)測,并用票選法決定預(yù)測的結(jié)果。
下圖比較直觀地展示了隨機(jī)森林算法(圖片出自文獻(xiàn)2):

圖1:隨機(jī)森林算法示意圖
沒錯(cuò),就是這個(gè)到處都是隨機(jī)取值的算法,在分類和回歸上有著極佳的效果,是不是覺得強(qiáng)的沒法解釋~
然而本文的重點(diǎn)不是這個(gè),而是接下來的特征重要性評估。
3 特征重要性評估
現(xiàn)實(shí)情況下,一個(gè)數(shù)據(jù)集中往往有成百上前個(gè)特征,如何在其中選擇比結(jié)果影響最大的那幾個(gè)特征,以此來縮減建立模型時(shí)的特征數(shù)是我們比較關(guān)心的問題。這樣的方法其實(shí)很多,比如主成分分析,lasso等等。不過,這里我們要介紹的是用隨機(jī)森林來對進(jìn)行特征篩選。
用隨機(jī)森林進(jìn)行特征重要性評估的思想其實(shí)很簡單,說白了就是看看每個(gè)特征在隨機(jī)森林中的每顆樹上做了多大的貢獻(xiàn),然后取個(gè)平均值,最后比一比特征之間的貢獻(xiàn)大小。
好了,那么這個(gè)貢獻(xiàn)是怎么一個(gè)說法呢?通??梢杂没嶂笖?shù)(Gini index)或者袋外數(shù)據(jù)(OOB)錯(cuò)誤率作為評價(jià)指標(biāo)來衡量。
我們這里只介紹用基尼指數(shù)來評價(jià)的方法,想了解另一種方法的可以參考文獻(xiàn)2。


4 舉個(gè)例子
值得慶幸的是, sklearn已經(jīng)幫我們封裝好了一切,我們只需要調(diào)用其中的函數(shù)即可。
我們以UCI上葡萄酒的例子為例,首先導(dǎo)入數(shù)據(jù)集。
import pandas as pd
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
df = pd.read_csv(url, header = None)
df.columns = ['Class label', 'Alcohol', 'Malic acid', 'Ash',
'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins',
'Color intensity', 'Hue', 'OD280/OD315 of diluted wines', 'Proline']
然后,我們來大致看下這時(shí)一個(gè)怎么樣的數(shù)據(jù)集
import numpy as np np.unique(df['Class label'])
輸出為
array([1, 2, 3], dtype=int64)
可見共有3個(gè)類別。然后再來看下數(shù)據(jù)的信息:
df.info()
輸出為
<class 'pandas.core.frame.DataFrame'> 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個(gè)特征,數(shù)據(jù)集的大小為178。
按照常規(guī)做法,將數(shù)據(jù)集分為訓(xùn)練集和測試集。
from sklearn.cross_validation import train_test_split from sklearn.ensemble import RandomForestClassifier 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)
好了,這樣一來隨機(jī)森林就訓(xùn)練好了,其中已經(jīng)把特征的重要性評估也做好了,我們拿出來看下。
importances = forest.feature_importances_
indices = np.argsort(importances)[::-1]
for f in range(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個(gè)重要性大于0.15的特征了嗎~
5 參考文獻(xiàn)
[1] Raschka S. Python Machine Learning[M]. Packt Publishing, 2015.
[2] 楊凱, 侯艷, 李康. 隨機(jī)森林變量重要性評分及其研究進(jìn)展[J]. 2015.
以上就是Python機(jī)器學(xué)習(xí)利用隨機(jī)森林對特征重要性計(jì)算評估的詳細(xì)內(nèi)容,更多關(guān)于Python隨機(jī)森林重要性計(jì)算的資料請關(guān)注腳本之家其它相關(guān)文章!
- Python分析特征數(shù)據(jù)類別與預(yù)處理方法速學(xué)
- python?OpenCV實(shí)現(xiàn)圖像特征匹配示例詳解
- python深度學(xué)習(xí)tensorflow1.0參數(shù)和特征提取
- caffe的python接口caffemodel參數(shù)及特征抽取示例
- Python計(jì)算機(jī)視覺SIFT尺度不變的圖像特征變換
- python神經(jīng)網(wǎng)絡(luò)特征金字塔FPN原理
- python機(jī)器學(xué)習(xí)基礎(chǔ)特征工程算法詳解
- Python機(jī)器學(xué)習(xí)特征重要性分析的8個(gè)常用方法實(shí)例探究
相關(guān)文章
Python進(jìn)階之如何快速將變量插入有序數(shù)組
在我們學(xué)習(xí)python的過程中,學(xué)習(xí)序列是一門必修課。本文我們就來一起看一看Python是如何快速將變量插入有序數(shù)組的,感興趣的可以了解一下2023-04-04
PyCharm安裝庫numpy失敗問題的詳細(xì)解決方法
今天使用pycharm編譯python程序時(shí),由于要調(diào)用numpy包,但又未曾安裝numpy,于是就根據(jù)pycharm的提示進(jìn)行安裝,最后竟然提示出錯(cuò),下面這篇文章主要給大家介紹了關(guān)于PyCharm安裝庫numpy失敗問題的詳細(xì)解決方法,需要的朋友可以參考下2022-06-06
Python標(biāo)準(zhǔn)庫學(xué)習(xí)之operator.itemgetter函數(shù)的使用
operator.itemgetter是Python標(biāo)準(zhǔn)庫operator模塊中的一個(gè)函數(shù),本文主要介紹了Python標(biāo)準(zhǔn)庫學(xué)習(xí)之operator.itemgetter函數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
Python基于PycURL實(shí)現(xiàn)POST的方法
這篇文章主要介紹了Python基于PycURL實(shí)現(xiàn)POST的方法,涉及Python實(shí)現(xiàn)curl傳遞post數(shù)據(jù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
利用Python的pandas數(shù)據(jù)處理包將寬表變成窄表
這篇文章主要介紹了利用Python的pandas數(shù)據(jù)處理包將寬表變成窄表,文章通過圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
python基礎(chǔ)之類型轉(zhuǎn)換函數(shù)
這篇文章主要介紹了python類型轉(zhuǎn)換函數(shù),實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下2021-10-10
Python爬蟲入門案例之回車桌面壁紙網(wǎng)美女圖片采集
讀萬卷書不如行萬里路,學(xué)的扎不扎實(shí)要通過實(shí)戰(zhàn)才能看出來,今天小編給大家?guī)硪粋€(gè)python爬蟲案例,采集回車桌面網(wǎng)站的美女圖片,大家可以在過程中查缺補(bǔ)漏,看看自己掌握程度怎么樣2021-10-10
Python全景系列之?dāng)?shù)據(jù)類型大盤點(diǎn)
這篇文章主要為大家介紹了Python全景系列之?dāng)?shù)據(jù)類型的盤點(diǎn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
對Python中一維向量和一維向量轉(zhuǎn)置相乘的方法詳解
今天小編就為大家分享一篇對Python中一維向量和一維向量轉(zhuǎn)置相乘的方法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08

