Python實(shí)現(xiàn)隨機(jī)森林算法的示例代碼
在數(shù)據(jù)挖掘的過程中,我們經(jīng)常會遇到一些問題,比如:如何選擇各種分類器,到底選擇哪個(gè)分類算法,是SVM、決策樹、還是KNN?如何優(yōu)化分類器的參數(shù),以便得到更好的分類準(zhǔn)確率?
隨機(jī)森林分類器
隨機(jī)森林的英文是 Random Forest,英文簡寫是 RF。它是一個(gè)包含多個(gè)決策樹的分類器,每一個(gè)子分類器都是一棵 CART 分類回歸樹。所以隨機(jī)森林既可以做分類,又可以做回歸。
- 當(dāng)它做分類的時(shí)候,輸出結(jié)果是每個(gè)子分類器的分類結(jié)果中最多的那個(gè)??梢岳斫馐敲總€(gè)分類器都做投票,取投票最多的那個(gè)結(jié)果。
- 當(dāng)它做回歸的時(shí)候,輸出結(jié)果是每棵 CART 樹的回歸結(jié)果的平均值。
在 sklearn 中,我們使用 RandomForestClassifier() 構(gòu)造隨機(jī)森林模型,函數(shù)里有一些常用的構(gòu)造參數(shù):
- n_estimators: 隨機(jī)森林里決策樹的個(gè)數(shù),默認(rèn)是10
- criterion:決策樹分裂的標(biāo)準(zhǔn),默認(rèn)是基尼指數(shù)(CART算法),也可以選擇entropy(ID3算法)
- max_depth: 決策樹的最大深度,默認(rèn)是None, 不限制
- n_jobs:擬合和預(yù)測的時(shí)候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í)際上一個(gè)分類算法有很多參數(shù),取值范圍也比較廣,那么該如何調(diào)優(yōu)呢?
Python 給我們提供了一個(gè)很好用的工具 GridSearchCV,它是Python的參數(shù)自動(dòng)搜索模塊,能夠自動(dòng)決策最優(yōu)參數(shù)。
我們使用 GridSearchCV(estimator, param_grid, cv=None, scoring=None) 構(gòu)造參數(shù)的自動(dòng)搜索模塊,這里有一些主要的參數(shù)需要說明:
- estimator:代表采用的分類器,如隨機(jī)森林、決策樹、SVM、KNN等
- param_grid: 代表想要優(yōu)化的參數(shù)及取值
- cv: 交叉驗(yàn)證的折數(shù),默認(rèn)是None, 代表使用三折交叉驗(yàn)證
- scoring:準(zhǔn)確度的評價(jià)標(biāo)準(zhǔn),默認(rèn)是None, 也就是需要使用score函數(shù)
舉例,我們使用sklearn自帶的IRIS數(shù)據(jù)集,采用隨機(jī)森林對IRIS數(shù)據(jù)分類。如果我們想知道n_estimators在1-10的范圍內(nèi)取哪個(gè)值的分類結(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_)
運(yùn)行結(jié)果:
最優(yōu)分?jǐn)?shù): 0.9600
最優(yōu)參數(shù): {'n_estimators': 3}
使用 Pipeline 進(jìn)行流水線作業(yè)
在進(jìn)行數(shù)據(jù)分類的時(shí)候往往都是有多個(gè)步驟的,比如先對數(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_)
運(yùn)行結(jié)果如下:
最優(yōu)分?jǐn)?shù): 0.9600
最優(yōu)參數(shù): {'randomforestclassifier__n_estimators': 9}
到此這篇關(guān)于Python實(shí)現(xiàn)隨機(jī)森林算法的示例代碼的文章就介紹到這了,更多相關(guān)Python隨機(jī)森林算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas實(shí)現(xiàn)datetime64與unix時(shí)間戳互轉(zhuǎn)
這篇文章主要介紹了pandas實(shí)現(xiàn)datetime64與unix時(shí)間戳互轉(zhuǎn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
shelve 用來持久化任意的Python對象實(shí)例代碼
這篇文章主要介紹了shelve 用來持久化任意的Python對象實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10
python?logging模塊詳解及其日志定時(shí)清理方式
這篇文章主要介紹了python?logging模塊詳解及其日志定時(shí)清理方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
使用python?scrapy爬取天氣并導(dǎo)出csv文件
由于工作需要,將爬蟲的文件要保存為csv,以前只是保存為json,下面這篇文章主要給大家介紹了關(guān)于如何使用python?scrapy爬取天氣并導(dǎo)出csv文件的相關(guān)資料,需要的朋友可以參考下2022-08-08
python 使用tkinter與messagebox寫界面和彈窗
這篇文章主要介紹了python 使用tkinter與messagebox寫界面和彈窗,文章內(nèi)容詳細(xì),具有一的的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03
Python定時(shí)庫APScheduler的原理以及用法示例
APScheduler的全稱是Advanced Python Scheduler,它是一個(gè)輕量級的 Python 定時(shí)任務(wù)調(diào)度框架,下面這篇文章主要給大家介紹了關(guān)于Python定時(shí)庫APScheduler的原理以及用法的相關(guān)資料,需要的朋友可以參考下2021-12-12

