農林漁牧網

您現在的位置是:首頁 > 漁業

隨機森林演算法(Random Forest)Python實現

2022-01-16由 Java架構海子 發表于 漁業

四塊科技filecoin靠譜嗎

目錄

一、什麼是Random Forest ?

1。1 什麼是監督式機器學習?

1。2 什麼是迴歸和分類?

二、Random Forest 的構造過程

2。3 待選特徵的隨機選取

三、 Random Forest 優缺點

四、Extra-Trees(極端隨機樹)

五、Random Forest 的Python實現

5。1 Random Forest的Python實現

5。2 Decision Tree、Random Forest和Extra-Trees對比

5。3 基於pandas和scikit-learn實現Random Forest

5。4 Random Forest 與其他機器學習分類演算法對比

六、 Random Forest 應用方向

前言

最近在學習一篇論文《Mining Quality Phrases from Massive Text Corpora》,講的是如何從海量文字語料庫中挖掘優質短語,其中用到了隨機森林(Random Forest)演算法,所以我去學習了一下,我部落格之前專門針對決策樹(Decision Tree)有過講解,Random Forest 就是基於Decision Tree 的最佳化版本,下面我們來一起來討論一下什麼是Random Forest。

一、什麼是Random Forest ?

作為高度靈活的一種機器學習演算法,隨機森林(Random Forest,簡稱RF)擁有廣泛的應用前景,從市場營銷到醫療保健保險,既可以用來做市場營銷模擬的建模,統計客戶來源,保留和流失,也可用來預測疾病的風險和病患者的易感性。最近幾年的國內外大賽,包括2013年百度校園電影推薦系統大賽、2014年阿里巴巴天池大資料競賽以及 Kaggle資料科學競賽 ,參賽者對隨機森林的使用佔有相當高的比例。所以可以看出,Random Forest在準確率方面還是相當有優勢的。

那說了這麼多,那隨機森林到底是怎樣的一種演算法呢?

如果讀者接觸過決策樹(Decision Tree)的話,那麼會很容易理解什麼是隨機森林。隨機森林就是透過整合學習的思想將多棵樹整合的一種演算法,它的基本單元是決策樹,而它的本質屬於機器學習的一大分支——整合學習(Ensemble Learning)方法。隨機森林的名稱中有兩個關鍵詞,一個是“隨機”,一個就是“森林”。“森林”我們很好理解,一棵叫做樹,那麼成百上千棵就可以叫做森林了,這樣的比喻還是很貼切的,其實這也是隨機森林的主要思想——整合思想的體現。“隨機”的含義我們會在下邊部分講到。

其實從直觀角度來解釋,每棵決策樹都是一個分類器(假設現在針對的是分類問題),那麼對於一個輸入樣本,N棵樹會有N個分類結果。而隨機森林集成了所有的分類投票結果,將投票次數最多的類別指定為最終的輸出,這就是一種最簡單的 Bagging 思想。

隨機森林演算法(Random Forest)Python實現

隨機森林是一種功能強大且用途廣泛的

監督機器學習演算法

,它生長並組合多個決策樹以建立“森林”。它可用於R和Python中的分類和迴歸問題。

在我們更詳細地探索隨機森林之前,讓我們分解一下:

什麼是監督學習?

什麼是分類和迴歸?

什麼是決策樹?

瞭解這些概念中的每一個都將幫助您瞭解隨機森林及其工作原理。所以讓我們解釋一下。

1。1 什麼是監督式機器學習?

從給定的訓練資料集中學習出一個函式(模型引數),當新的資料到來時,可以根據這個函式預測結果。監督學習的訓練集要求包括輸入輸出,也可以說是特徵和目標。訓練集中的目標是由人標註的。監督學習就是最常見的分類(注意和聚類區分)問題,透過已有的訓練樣本(即已知資料及其對應的輸出)去訓練得到一個最優模型(這個模型屬於某個函式的集合,最優表示某個評價準則下是最佳的),再利用這個模型將所有的輸入對映為相應的輸出,對輸出進行簡單的判斷從而實現分類的目的。也就具有了對未知資料分類的能力。監督學習的目標往往是讓計算機去學習我們已經建立好的分類系統(模型)。

監督學習是訓練神經網路和決策樹的常見技術。這兩種技術高度依賴事先確定的分類系統給出的資訊,對於神經網路,分類系統利用資訊判斷網路的錯誤,然後不斷調整網路引數。對於決策樹,分類系統用它來判斷哪些屬性提供了最多的資訊。監督學習裡典型的例子就是KNN、SVM。

1。2 什麼是迴歸和分類?

在機器學習中,演算法用於將某些觀察結果、事件或輸入分類到組中。例如,垃圾郵件過濾器會將每封電子郵件分類為“垃圾郵件”或“非垃圾郵件”。但是,電子郵件示例只是一個簡單的示例;在業務環境中,這些模型的預測能力可以對如何做出決策以及如何形成戰略產生重大影響,但稍後會詳細介紹。

因此:迴歸和分類都是監督式機器學習問題,用於預測結果或結果的價值或類別。他們的區別是:

分類問題是用於將事物打上一個標籤,通常結果為離散值。例如判斷一幅圖片上的動物是一隻貓還是一隻狗,分類通常是建立在迴歸之上,分類的最後一層通常要使用softmax函式進行判斷其所屬類別。分類並沒有逼近的概念,最終正確結果只有一個,錯誤的就是錯誤的,不會有相近的概念。最常見的分類方法是邏輯迴歸,或者叫邏輯分類。

迴歸問題通常是用來預測一個值,如預測房價、未來的天氣情況等等,例如一個產品的實際價格為500元,透過迴歸分析預測值為499元,我們認為這是一個比較好的迴歸分析。一個比較常見的迴歸演算法是線性迴歸演算法(LR)。另外,迴歸分析用在神經網路上,其最上層是不需要加上softmax函式的,而是直接對前一層累加即可。迴歸是對真實值的一種逼近預測。

區分兩者的簡單方法大概可以表述為,

分類是關於預測標籤

(例如“垃圾郵件”或“不是垃圾郵件”),而

迴歸是關於預測數量

1。3 什麼是決策樹?

在解釋隨機森林前,需要先提一下決策樹。決策樹是一種很簡單的演算法,他的解釋性強,也符合人類的直觀思維。這是一種基於if-then-else規則的有監督學習演算法,上面的圖片可以直觀的表達決策樹的邏輯。

隨機森林演算法(Random Forest)Python實現

決策樹的推導過程在我之前的部落格中有詳細的介紹

機器學習——決策樹(一)_歡迎來到AI小書童的部落格-CSDN部落格

機器學習——決策樹推導_歡迎來到AI小書童的部落格-CSDN部落格

1。4 什麼是隨機森林?

隨機森林是由很多決策樹構成的,不同決策樹之間沒有關聯。

當我們進行分類任務時,新的輸入樣本進入,就讓森林中的每一棵決策樹分別進行判斷和分類,每個決策樹會得到一個自己的分類結果,決策樹的分類結果中哪一個分類最多,那麼隨機森林就會把這個結果當做最終的結果。

隨機森林演算法(Random Forest)Python實現

二、Random Forest 的構造過程

隨機森林演算法(Random Forest)Python實現

2。1 演算法實現

一個樣本容量為N的樣本,有放回的抽取N次,每次抽取1個,最終形成了N個樣本。這選擇好了的N個樣本用來訓練一個決策樹,作為決策樹根節點處的樣本。

當每個樣本有M個屬性時,在決策樹的每個節點需要分裂時,隨機從這M個屬性中選取出m個屬性,滿足條件m << M。然後從這m個屬性中採用某種策略(比如說資訊增益)來選擇1個屬性作為該節點的分裂屬性。

決策樹形成過程中每個節點都要按照步驟2來分裂(很容易理解,如果下一次該節點選出來的那一個屬性是剛剛其父節點分裂時用過的屬性,則該節點已經達到了葉子節點,無須繼續分裂了),一直到不能夠再分裂為止。注意整個決策樹形成過程中沒有進行剪枝。

按照步驟1~3建立大量的決策樹,這樣就構成了隨機森林了。

2。2 資料的隨機選取

首先,從原始的資料集中採取有放回的抽樣,構造子資料集,子資料集的資料量是和原始資料集相同的。不同子資料集的元素可以重複,同一個子資料集中的元素也可以重複。第二,利用子資料集來構建子決策樹,將這個資料放到每個子決策樹中,每個子決策樹輸出一個結果。最後,如果有了新的資料需要透過隨機森林得到分類結果,就可以透過對子決策樹的判斷結果的投票,得到隨機森林的輸出結果了。如圖3,假設隨機森林中有3棵子決策樹,2棵子樹的分類結果是A類,1棵子樹的分類結果是B類,那麼隨機森林的分類結果就是A類。

隨機森林演算法(Random Forest)Python實現

2。3 待選特徵的隨機選取

與資料集的隨機選取類似,隨機森林中的子樹的每一個分裂過程並未用到所有的待選特徵,而是從所有的待選特徵中隨機選取一定的特徵,之後再在隨機選取的特徵中選取最優的特徵。這樣能夠使得隨機森林中的決策樹都能夠彼此不同,提升系統的多樣性,從而提升分類效能。

下圖中,藍色的方塊代表所有可以被選擇的特徵,也就是待選特徵。黃色的方塊是分裂特徵。左邊是一棵決策樹的特徵選取過程,透過在待選特徵中選取最優的分裂特徵(別忘了前文提到的ID3演算法,C4。5演算法,CART演算法等等),完成分裂。右邊是一個隨機森林中的子樹的特徵選取過程。

隨機森林演算法(Random Forest)Python實現

2。4 相關概念解釋

1。

分裂

:在決策樹的訓練過程中,需要一次次的將訓練資料集分裂成兩個子資料集,這個過程就叫做分裂。

2。

特徵

:在分類問題中,輸入到分類器中的資料叫做特徵。以上面的股票漲跌預測問題為例,特徵就是前一天的交易量和收盤價。

3。

待選特徵

:在決策樹的構建過程中,需要按照一定的次序從全部的特徵中選取特徵。待選特徵就是在步驟之前還沒有被選擇的特徵的集合。例如,全部的特徵是 ABCDE,第一步的時候,待選特徵就是ABCDE,第一步選擇了C,那麼第二步的時候,待選特徵就是ABDE。

4。

分裂特徵

:接待選特徵的定義,每一次選取的特徵就是分裂特徵,例如,在上面的例子中,第一步的分裂特徵就是C。因為選出的這些特徵將資料集分成了一個個不相交的部分,所以叫它們分裂特徵。

三、 Random Forest 優缺點

3。1 優點

它可以出來很高維度(特徵很多)的資料,並且不用降維,無需做特徵選擇

它可以判斷特徵的重要程度

可以判斷出不同特徵之間的相互影響

不容易過擬合

訓練速度比較快,容易做成並行方法

實現起來比較簡單

對於不平衡的資料集來說,它可以平衡誤差。

如果有很大一部分的特徵遺失,仍可以維持準確度。

3。2 缺點

隨機森林已經被證明在某些噪音較大的分類或迴歸問題上會過擬合

對於有不同取值的屬性的資料,取值劃分較多的屬性會對隨機森林產生更大的影響,所以隨機森林在這種資料上產出的屬性權值是不可信的

由於隨機林使用許多決策樹,因此在較大的專案上可能需要大量記憶體。這可以使它比其他一些更有效的演算法慢

四、Extra-Trees(極端隨機樹)

ET或Extra-Trees(Extremely randomized trees,極端隨機樹)演算法與隨機森林演算法十分相似,都是由許多決策樹構成。極限樹與隨機森林的主要區別:

1。 randomForest應用的是Bagging模型,extraTree使用的所有的樣本,只是特徵是隨機選取的,因為分裂是隨機的,所以在某種程度上比隨機森林得到的結果更加好

2。 隨機森林是在一個隨機子集內得到最佳分叉屬性,而ET是完全隨機的得到分叉值,從而實現對決策樹進行分叉的

五、Random Forest 的Python實現

5。1 Random Forest的Python實現

# -*- coding: utf-8 -*-import csvfrom random import seedfrom random import randrangefrom math import sqrtdef loadCSV(filename):#載入資料,一行行的存入列表 dataSet = [] with open(filename, ‘r’) as file: csvReader = csv。reader(file) for line in csvReader: dataSet。append(line) return dataSet# 除了標籤列,其他列都轉換為float型別def column_to_float(dataSet): featLen = len(dataSet[0]) - 1 for data in dataSet: for column in range(featLen): data[column] = float(data[column]。strip())# 將資料集隨機分成N塊,方便交叉驗證,其中一塊是測試集,其他四塊是訓練集def spiltDataSet(dataSet, n_folds): fold_size = int(len(dataSet) / n_folds) dataSet_copy = list(dataSet) dataSet_spilt = [] for i in range(n_folds): fold = [] while len(fold) < fold_size: # 這裡不能用if,if只是在第一次判斷時起作用,while執行迴圈,直到條件不成立 index = randrange(len(dataSet_copy)) fold。append(dataSet_copy。pop(index)) # pop() 函式用於移除列表中的一個元素(預設最後一個元素),並且返回該元素的值。 dataSet_spilt。append(fold) return dataSet_spilt# 構造資料子集def get_subsample(dataSet, ratio): subdataSet = [] lenSubdata = round(len(dataSet) * ratio)#返回浮點數 while len(subdataSet) < lenSubdata: index = randrange(len(dataSet) - 1) subdataSet。append(dataSet[index]) # print len(subdataSet) return subdataSet# 分割資料集def data_spilt(dataSet, index, value): left = [] right = [] for row in dataSet: if row[index] < value: left。append(row) else: right。append(row) return left, right# 計算分割代價def spilt_loss(left, right, class_values): loss = 0。0 for class_value in class_values: left_size = len(left) if left_size != 0: # 防止除數為零 prop = [row[-1] for row in left]。count(class_value) / float(left_size) loss += (prop * (1。0 - prop)) right_size = len(right) if right_size != 0: prop = [row[-1] for row in right]。count(class_value) / float(right_size) loss += (prop * (1。0 - prop)) return loss# 選取任意的n個特徵,在這n個特徵中,選取分割時的最優特徵def get_best_spilt(dataSet, n_features): features = [] class_values = list(set(row[-1] for row in dataSet)) b_index, b_value, b_loss, b_left, b_right = 999, 999, 999, None, None while len(features) < n_features: index = randrange(len(dataSet[0]) - 1) if index not in features: features。append(index) # print ‘features:’,features for index in features:#找到列的最適合做節點的索引,(損失最小) for row in dataSet: left, right = data_spilt(dataSet, index, row[index])#以它為節點的,左右分支 loss = spilt_loss(left, right, class_values) if loss < b_loss:#尋找最小分割代價 b_index, b_value, b_loss, b_left, b_right = index, row[index], loss, left, right # print b_loss # print type(b_index) return {‘index’: b_index, ‘value’: b_value, ‘left’: b_left, ‘right’: b_right}# 決定輸出標籤def decide_label(data): output = [row[-1] for row in data] return max(set(output), key=output。count)# 子分割,不斷地構建葉節點的過程def sub_spilt(root, n_features, max_depth, min_size, depth): left = root[‘left’] # print left right = root[‘right’] del (root[‘left’]) del (root[‘right’]) # print depth if not left or not right: root[‘left’] = root[‘right’] = decide_label(left + right) # print ‘testing’ return if depth > max_depth: root[‘left’] = decide_label(left) root[‘right’] = decide_label(right) return if len(left) < min_size: root[‘left’] = decide_label(left) else: root[‘left’] = get_best_spilt(left, n_features) # print ‘testing_left’ sub_spilt(root[‘left’], n_features, max_depth, min_size, depth + 1) if len(right) < min_size: root[‘right’] = decide_label(right) else: root[‘right’] = get_best_spilt(right, n_features) # print ‘testing_right’ sub_spilt(root[‘right’], n_features, max_depth, min_size, depth + 1) # 構造決策樹def build_tree(dataSet, n_features, max_depth, min_size): root = get_best_spilt(dataSet, n_features) sub_spilt(root, n_features, max_depth, min_size, 1) return root# 預測測試集結果def predict(tree, row): predictions = [] if row[tree[‘index’]] < tree[‘value’]: if isinstance(tree[‘left’], dict): return predict(tree[‘left’], row) else: return tree[‘left’] else: if isinstance(tree[‘right’], dict): return predict(tree[‘right’], row) else: return tree[‘right’] # predictions=set(predictions)def bagging_predict(trees, row): predictions = [predict(tree, row) for tree in trees] return max(set(predictions), key=predictions。count)# 建立隨機森林def random_forest(train, test, ratio, n_feature, max_depth, min_size, n_trees): trees = [] for i in range(n_trees): train = get_subsample(train, ratio)#從切割的資料集中選取子集 tree = build_tree(train, n_features, max_depth, min_size) # print ‘tree %d: ’%i,tree trees。append(tree) # predict_values = [predict(trees,row) for row in test] predict_values = [bagging_predict(trees, row) for row in test] return predict_values# 計算準確率def accuracy(predict_values, actual): correct = 0 for i in range(len(actual)): if actual[i] == predict_values[i]: correct += 1 return correct / float(len(actual))if __name__ == ‘__main__’: seed(1) dataSet = loadCSV(‘D:/深度之眼/sonar-all-data。csv’) column_to_float(dataSet)#dataSet n_folds = 5 max_depth = 15 min_size = 1 ratio = 1。0 # n_features=sqrt(len(dataSet)-1) n_features = 15 n_trees = 10 folds = spiltDataSet(dataSet, n_folds)#先是切割資料集 scores = [] for fold in folds: train_set = folds[ :] # 此處不能簡單地用train_set=folds,這樣用屬於引用,那麼當train_set的值改變的時候,folds的值也會改變,所以要用複製的形式。(L[:])能夠複製序列,D。copy() 能夠複製字典,list能夠生成複製 list(L) train_set。remove(fold)#選好訓練集 # print len(folds) train_set = sum(train_set, []) # 將多個fold列表組合成一個train_set列表 # print len(train_set) test_set = [] for row in fold: row_copy = list(row) row_copy[-1] = None test_set。append(row_copy) # for row in test_set: # print row[-1] actual = [row[-1] for row in fold] predict_values = random_forest(train_set, test_set, ratio, n_features, max_depth, min_size, n_trees) accur = accuracy(predict_values, actual) scores。append(accur) print (‘Trees is %d’ % n_trees) print (‘scores:%s’ % scores) print (‘mean score:%s’ % (sum(scores) / float(len(scores))))

列印結果

Trees is 10scores:[0。6341463414634146, 0。6829268292682927, 0。6341463414634146, 0。5853658536585366, 0。5853658536585366]mean score:0。624390243902439

5。2 Decision Tree、Random Forest和Extra-Trees對比

# -*- coding: utf-8 -*-from sklearn。model_selection import cross_val_scorefrom sklearn。datasets import make_blobsfrom sklearn。ensemble import RandomForestClassifierfrom sklearn。ensemble import ExtraTreesClassifierfrom sklearn。tree import DecisionTreeClassifier##建立100個類共10000個樣本,每個樣本10個特徵X, y = make_blobs(n_samples=10000, n_features=10, centers=100,random_state=0)## 決策樹clf1 = DecisionTreeClassifier(max_depth=None, min_samples_split=2,random_state=0)scores1 = cross_val_score(clf1, X, y)print(scores1。mean())## 隨機森林clf2 = RandomForestClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)scores2 = cross_val_score(clf2, X, y)print(scores2。mean())## ExtraTree分類器集合clf3 = ExtraTreesClassifier(n_estimators=10, max_depth=None,min_samples_split=2, random_state=0)scores3 = cross_val_score(clf3, X, y)print(scores3。mean())

輸出結果列印

0。98230000000000010。99971。0

5。3 基於pandas和scikit-learn實現Random Forest

iris資料集結構

sepal length (cm)

sepal width (cm)

petal length (cm)

petal width (cm)

is_train

species

0

5。1

3。5

1。4

0。2

True

setosa

1

4。9

3。0

1。4

0。2

True

setosa

2

4。7

3。2

1。3

0。2

True

setosa

3

4。6

3。1

1。5

0。2

True

setosa

4

5。0

3。6

1。4

0。2

True

setosa

from sklearn。datasets import load_irisfrom sklearn。ensemble import RandomForestClassifierimport pandas as pdimport numpy as npiris = load_iris()df = pd。DataFrame(iris。data, columns=iris。feature_names)df[‘is_train’] = np。random。uniform(0, 1, len(df)) <= 。75df[‘species’] = pd。Categorical。from_codes(iris。target, iris。target_names)df。head()train, test = df[df[‘is_train’]==True], df[df[‘is_train’]==False]features = df。columns[:4]clf = RandomForestClassifier(n_jobs=2)y, _ = pd。factorize(train[‘species’])clf。fit(train[features], y)preds = iris。target_names[clf。predict(test[features])]pd。crosstab(test[‘species’], preds, rownames=[‘actual’], colnames=[‘preds’])

分類結果列印:

preds

setosa

versicolor

virginica

actual

setosa

14

0

0

versicolor

0

15

1

virginica

0

0

9

5。4 Random Forest 與其他機器學習分類演算法對比

import numpy as npimport matplotlib。pyplot as pltfrom matplotlib。colors import ListedColormapfrom sklearn。model_selection import train_test_splitfrom sklearn。preprocessing import StandardScalerfrom sklearn。datasets import make_moons, make_circles, make_classificationfrom sklearn。neighbors import KNeighborsClassifierfrom sklearn。svm import SVCfrom sklearn。tree import DecisionTreeClassifierfrom sklearn。ensemble import RandomForestClassifier, AdaBoostClassifierfrom sklearn。naive_bayes import GaussianNBfrom sklearn。discriminant_analysis import LinearDiscriminantAnalysis as LDAfrom sklearn。discriminant_analysis import QuadraticDiscriminantAnalysis as QDAh = 。02 # step size in the meshnames = [“Nearest Neighbors”, “Linear SVM”, “RBF SVM”, “Decision Tree”, “Random Forest”, “AdaBoost”, “Naive Bayes”, “LDA”, “QDA”]classifiers = [ KNeighborsClassifier(3), SVC(kernel=“linear”, C=0。025), SVC(gamma=2, C=1), DecisionTreeClassifier(max_depth=5), RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1), AdaBoostClassifier(), GaussianNB(), LDA(), QDA()]X, y = make_classification(n_features=2, n_redundant=0, n_informative=2, random_state=1, n_clusters_per_class=1)rng = np。random。RandomState(2)X += 2 * rng。uniform(size=X。shape)linearly_separable = (X, y)datasets = [make_moons(noise=0。3, random_state=0), make_circles(noise=0。2, factor=0。5, random_state=1), linearly_separable ]figure = plt。figure(figsize=(27, 9))i = 1# iterate over datasetsfor ds in datasets: # preprocess dataset, split into training and test part X, y = ds X = StandardScaler()。fit_transform(X) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=。4) x_min, x_max = X[:, 0]。min() - 。5, X[:, 0]。max() + 。5 y_min, y_max = X[:, 1]。min() - 。5, X[:, 1]。max() + 。5 xx, yy = np。meshgrid(np。arange(x_min, x_max, h), np。arange(y_min, y_max, h)) # just plot the dataset first cm = plt。cm。RdBu cm_bright = ListedColormap([‘#FF0000’, ‘#0000FF’]) ax = plt。subplot(len(datasets), len(classifiers) + 1, i) # Plot the training points ax。scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright) # and testing points ax。scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0。6) ax。set_xlim(xx。min(), xx。max()) ax。set_ylim(yy。min(), yy。max()) ax。set_xticks(()) ax。set_yticks(()) i += 1 # iterate over classifiers for name, clf in zip(names, classifiers): ax = plt。subplot(len(datasets), len(classifiers) + 1, i) clf。fit(X_train, y_train) score = clf。score(X_test, y_test) # Plot the decision boundary。 For that, we will assign a color to each # point in the mesh [x_min, m_max]x[y_min, y_max]。 if hasattr(clf, “decision_function”): Z = clf。decision_function(np。c_[xx。ravel(), yy。ravel()]) else: Z = clf。predict_proba(np。c_[xx。ravel(), yy。ravel()])[:, 1] # Put the result into a color plot Z = Z。reshape(xx。shape) ax。contourf(xx, yy, Z, cmap=cm, alpha=。8) # Plot also the training points ax。scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright) # and testing points ax。scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0。6) ax。set_xlim(xx。min(), xx。max()) ax。set_ylim(yy。min(), yy。max()) ax。set_xticks(()) ax。set_yticks(()) ax。set_title(name) ax。text(xx。max() - 。3, yy。min() + 。3, (‘%。2f’ % score)。lstrip(‘0’), size=15, horizontalalignment=‘right’) i += 1figure。subplots_adjust(left=。02, right=。98)plt。show()

隨機森林演算法(Random Forest)Python實現

這裡隨機生成了三個樣本集,分割面近似為月形、圓形和線形的。我們可以重點對比一下決策樹和隨機森林對樣本空間的分割:

1)從準確率上可以看出,隨機森林在這三個測試集上都要優於單棵決策樹,90%>88%,90%=90%,88%=88%;

2)從特徵空間上直觀地可以看出,隨機森林比決策樹擁有更強的分割能力(非線性擬合能力)。

六、 Random Forest 應用方向

隨機森林演算法(Random Forest)Python實現

隨機森林可以在很多地方使用:

對離散值的分類

對連續值的迴歸

無監督學習聚類

異常點檢測