Python實現(xiàn)隨機(jī)森林算法的示例代碼
在數(shù)據(jù)挖掘的過程中,我們經(jīng)常會遇到一些問題,比如:如何選擇各種分類器,到底選擇哪個分類算法,是SVM、決策樹、還是KNN?如何優(yōu)化分類器的參數(shù),以便得到更好的分類準(zhǔn)確率?
隨機(jī)森林分類器
隨機(jī)森林的英文是 Random Forest,英文簡寫是 RF。它是一個包含多個決策樹的分類器,每一個子分類器都是一棵 CART 分類回歸樹。所以隨機(jī)森林既可以做分類,又可以做回歸。
- 當(dāng)它做分類的時候,輸出結(jié)果是每個子分類器的分類結(jié)果中最多的那個??梢岳斫馐敲總€分類器都做投票,取投票最多的那個結(jié)果。
- 當(dāng)它做回歸的時候,輸出結(jié)果是每棵 CART 樹的回歸結(jié)果的平均值。
在 sklearn 中,我們使用 RandomForestClassifier() 構(gòu)造隨機(jī)森林模型,函數(shù)里有一些常用的構(gòu)造參數(shù):
- n_estimators: 隨機(jī)森林里決策樹的個數(shù),默認(rèn)是10
- criterion:決策樹分裂的標(biāo)準(zhǔn),默認(rèn)是基尼指數(shù)(CART算法),也可以選擇entropy(ID3算法)
- max_depth: 決策樹的最大深度,默認(rèn)是None, 不限制
- n_jobs:擬合和預(yù)測的時候CPU的核數(shù),默認(rèn)是1
GridSearchCV 對模型參數(shù)進(jìn)行調(diào)優(yōu)
分類算法,我們經(jīng)常需要調(diào)節(jié)網(wǎng)絡(luò)參數(shù)(對應(yīng)上面的構(gòu)造參數(shù)),目的是得到更好的分類結(jié)果。實際上一個分類算法有很多參數(shù),取值范圍也比較廣,那么該如何調(diào)優(yōu)呢?
Python 給我們提供了一個很好用的工具 GridSearchCV,它是Python的參數(shù)自動搜索模塊,能夠自動決策最優(yōu)參數(shù)。
我們使用 GridSearchCV(estimator, param_grid, cv=None, scoring=None) 構(gòu)造參數(shù)的自動搜索模塊,這里有一些主要的參數(shù)需要說明:
- estimator:代表采用的分類器,如隨機(jī)森林、決策樹、SVM、KNN等
- param_grid: 代表想要優(yōu)化的參數(shù)及取值
- cv: 交叉驗證的折數(shù),默認(rèn)是None, 代表使用三折交叉驗證
- scoring:準(zhǔn)確度的評價標(biāo)準(zhǔn),默認(rèn)是None, 也就是需要使用score函數(shù)
舉例,我們使用sklearn自帶的IRIS數(shù)據(jù)集,采用隨機(jī)森林對IRIS數(shù)據(jù)分類。如果我們想知道n_estimators在1-10的范圍內(nèi)取哪個值的分類結(jié)果最好,可以編寫代碼如下:
# -*- coding: utf-8 -*- # 使用RandomForest對IRIS數(shù)據(jù)集進(jìn)行分類 # 利用GridSearchCV尋找最優(yōu)參數(shù) from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV rf = RandomForestClassifier() parameters = {"n_estimators": range(1, 11)} iris = load_iris() # 使用GridSearchCV進(jìn)行參數(shù)調(diào)優(yōu) clf = GridSearchCV(estimator=rf, param_grid=parameters) # 對iris數(shù)據(jù)集進(jìn)行分類 clf.fit(iris.data, iris.target) print("最優(yōu)分?jǐn)?shù): %.4lf" % clf.best_score_) print("最優(yōu)參數(shù):", clf.best_params_)
運行結(jié)果:
最優(yōu)分?jǐn)?shù): 0.9600
最優(yōu)參數(shù): {'n_estimators': 3}
使用 Pipeline 進(jìn)行流水線作業(yè)
在進(jìn)行數(shù)據(jù)分類的時候往往都是有多個步驟的,比如先對數(shù)據(jù)進(jìn)行規(guī)范化處理,也可以用PCA對數(shù)據(jù)降維,最后再使用分類器進(jìn)行分類。
Python有一種Pipeline管道機(jī)制。管道機(jī)制就是讓我們把每一步都按順序列下來,從而創(chuàng)建Pipeline流水線作業(yè)。每一步都采用(‘名稱’,步驟)的方式來表示。
那么我們現(xiàn)在采用Pipeline管道機(jī)制,用隨機(jī)森林對IRIS數(shù)據(jù)集做一下分類。先用StandardScaler方法對數(shù)據(jù)規(guī)范化,即采用數(shù)據(jù)規(guī)范化為均值為0,方差為1的正態(tài)分布,然后采用PCA方法對數(shù)據(jù)進(jìn)行降維,最后采用隨機(jī)森林進(jìn)行分類,編寫代碼如下:
from sklearn.datasets import load_iris from sklearn.decomposition import PCA from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler rf = RandomForestClassifier() parameters = {"randomforestclassifier__n_estimators": range(1, 11)} iris = load_iris() pipeline = Pipeline([ ('scaler', StandardScaler()), ('pca', PCA()), ('randomforestclassifier', rf) ]) clf = GridSearchCV(estimator=pipeline, param_grid=parameters) clf.fit(iris.data, iris.target) print("最優(yōu)分?jǐn)?shù): %.4lf" % clf.best_score_) print("最優(yōu)參數(shù):", clf.best_params_)
運行結(jié)果如下:
最優(yōu)分?jǐn)?shù): 0.9600
最優(yōu)參數(shù): {'randomforestclassifier__n_estimators': 9}
到此這篇關(guān)于Python實現(xiàn)隨機(jī)森林算法的示例代碼的文章就介紹到這了,更多相關(guān)Python隨機(jī)森林算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
樸素貝葉斯分類算法原理與Python實現(xiàn)與使用方法案例
這篇文章主要介紹了樸素貝葉斯分類算法原理與Python實現(xiàn)與使用方法,結(jié)合具體實例形式分析了樸素貝葉斯分類算法的概念、原理、實現(xiàn)流程與相關(guān)操作技巧,需要的朋友可以參考下2018-06-06Python OpenCV 針對圖像細(xì)節(jié)的不同操作技巧
這篇文章主要介紹了Python OpenCV 針對圖像細(xì)節(jié)的不同操作,包括圖像像素的說明,圖像屬性信息的獲取與修改以及圖像通道的知識(包括拆分通道和合并通道),需要的朋友可以參考下2021-08-08python使用PIL和matplotlib獲取圖片像素點并合并解析
這篇文章主要介紹了python使用PIL和matplotlib獲取圖片像素點并合并解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09