如何在Julia中擬合隨機森林分類器

2021-01-07 人工智慧遇見磐創

介紹

在過去幾年數據科學技術的飛速發展中,我們看到大量開源工具的急劇升級和採用。其中包括一些熱門工具,如SkLearn和Tensorflow。

然而最近隨著Julia的流行,我們有機會大大改進解決機器學習問題的方法。對Julia語言影響最大的問題就是缺少成熟的各種數據相關操作的包。

https://github.com/emmettgb/Emmetts-DS-NoteBooks/blob/master/Julia/Lathe%200.1.5%20Random%20Forest%20Classifier.ipynb。

這將是一條漫長的道路。我們先看看Julia在目前的狀態下所能提供的功能。最近讓我很驚喜的一個新功能是我們的項目上增加了一個隨機森林分類器。使用Lathe、數據幀和CSV,我們現在可以輕鬆地探索、編碼和預測各種特徵!

數據

為了使用機器學習模型,我們首先需要看一下獲取一些分類數據來訓練它。

在這個例子中,我將使用一些加州大學洛杉磯分校發布的歐洲汽車數據。由於數據是逗號分隔值(CSV)格式,我們將使用 CSV.jl庫。Julia生態系統的一個奇妙的屬性是分割的程度。CSV.jl是專門為讀取CSV.jl而開發的軟體包,它返回一個數據幀。JSON.jl是專門為讀取JSON格式數據而開發的包。我們還想導入DataFrames,這將使電子表格中能顯示實際數據。

using DataFramesusing CSV現在我將讀取CSV文件:

df = CSV.read("car data.csv")

在不久的將來,這種讀取.CSV文件的方法將被棄用,因此最好使用sink參數:

using DataFrames; df = CSV.read("car data.csv", DataFrame)獲取數據幀的最佳視圖的最簡單方法是使用show方法。為了更好地可視化特徵,我們可以使用allcols關鍵字參數,它將採用Bool類型:

show(df, allcols = true)

考慮到這裡的目的是演示,除了對這個應用程式有用的特徵之外,不會對這些特徵進行太多的考慮。為了查看唯一的類別,我們可以使用Set類型:

Set(df[!, :Transmission])

考慮到基於基尼指數的模型,像這樣的分類器,去除雜質特徵通常做得更好,我選擇燃料類型作為目標。

至於這個應用程式中的特徵,我決定使用一個連續的特徵,因為只有一組0和1作為特徵很難預測。

我決定做的第一件事是將我想使用的這兩個特徵提取到一個新的更小的數據幀中,如下所示:

mldf = DataFrame(:Fuel => df[!, :Fuel_Type], :Kms => df[!, :Kms_Driven])預處理

使用任何模型的一個重要步驟是預處理和評估。在這裡,你可能想問一個模型是否真的可以幫助解決這個問題。這可以用一個多分類的基線來完成。多分類基線是一種簡單的度量方法的有效性,它可以為每個場景猜測最常見的類別。

讓我們從評估開始。解決這個問題的第一步可能是將我們的數據放入簡單的一維數組中,這些數組可以放入一些函數中。我喜歡用符號和數據幀調用來實現這一點:

X = :KmsY = :Fuel接下來,我們將把數據分為一個訓練和一個測試集。因此,我們既有數據來訓練模型,也有數據來獲得可靠的評估。為此,我們將使用Lathe.jl:

using Lathe.preprocess: TrainTestSplittrain, test = TrainTestSplit(mldf)現在有兩個數據幀,train和test,我們可以從中提取一維數組。

trainX = train[!, X]trainy = train[!, Y]testX = test[!, X]testy = test[!, Y]接下來,我們將獲得多分類的基線:

using Lathe.models: majClassBaseline因為這是Julia,所以可以使用?()方法:

如文檔所示,該函數接受一個參數y,並將返回一個Lathe模型對象。這個對象將有函數predict,我們可以用它來返回一個預測。通過提供trainy創建該對象,然後使用testX進行預測:

evaluation = majClassBaseline(trainy)yhat = evaluation.predict(testX)

如你所見,這些汽車中最常見的燃料顯然是汽油。我們使用Lathe.lstats的catacc函數:

using Lathe.lstats: catacccatacc(yhat, testy)

對於這個測試,81%是一個相當高的準確度水平,通常這樣的問題甚至不需要一個模型來解決,而僅僅是一個假設。也就是說,我們來這裡是為了安裝一個隨機森林分類器,這就是我們要做的!另一件很酷的事情是我們可以看基線模型裡面的計數,這可能會讓我們深入了解為什麼準確度如此之高:

evaluation.counts()

擬合與評估

我們要處理的模型是Lathe.models的RandomForestClassifier:

using Lathe.models: RandomForestClassifier像以前一樣,可以用?()方法,以便查看有關此特定對象的代碼內文檔:

如文檔所示,該模型同時接受關鍵字參數和位置參數作為輸入。我們的第一個模型將簡單地提供X和Y作為參數。

model = RandomForestClassifier(trainX, trainy)現在可以繼續進行評估,就像我們對大多數類基線所做的那樣:

yhat = model.predict(testX)並使用catacc進行評估:

正如我之前所說的,這當然不是這個模型的最佳,但是可以做一些簡單而有趣的嘗試來提高這種準確性。

首先,由於類別的數量很少,max_depth值為6可能過擬合。為了驗證這個理論,先給它一個提升,然後再降低。如果這個懷疑是正確的,那麼把它提高很可能會導致準確性的嚴重下降:

model = RandomForestClassifier(trainX, trainy, n_trees = 100, max_depth = 11)yhat = model.predict(testX)

同樣,降低參數會導致相反的結果:

model = RandomForestClassifier(trainX, trainy, n_trees = 100, max_depth = 2)yhat = model.predict(testX)

雖然最基本的反應可能是降低深度,以這種方式處理模型,但我認為如果有一個關於深度稍微加深,樹再更多的話,模型可能會做得更好:

model = RandomForestClassifier(trainX, trainy, n_trees = 1000, max_depth = 5)yhat = model.predict(testX)

好極了!稍加調整,我們的模型已經大大提高了準確性!最後一個技巧是,可以嘗試擴展特徵。為此我們將使用Lathe.preprocess:

scaler = StandardScaler(trainX)trainX = scaler.predict(trainX)接下來,我們將在testX上運行相同的程序:

testX = scaler.predict(testX)這會返回一個複數數組。為了修正它們的虛邊界,可以使用real()方法將數據更改回實數。當然,這需要被綁定到整個數組上,所以可以通過改變數組內的數據類型來實現:

trainX = Array{Real}(trainX)testX = Array{Real}(testX)現在通過與之前相同的代碼,我們可以看到這是否進一步提高了精確度:

model = RandomForestClassifier(trainX, trainy, n_trees = 1500, max_depth = 5)yhat = model.predict(testX)catacc(yhat, testy)

它失去了準確性嗎?

請允許我解釋一下。每當使用對數據進行標準化處理時,就會減少問題的難度,因為我們將觀測值計算為標準差(均值),因為特徵都被標準化到一個某個範圍裡了。也就是說,我們的精度增益可以通過快速調整深度來感覺到:

model = RandomForestClassifier(trainX, trainy, n_trees = 1500, max_depth = 3)yhat = model.predict(testX)經過一些超參數優化,結果如下:

model = RandomForestClassifier(trainX, trainy, n_trees = 10, max_depth = 2, min_node_records = 4)yhat = model.predict(testX)catacc(yhat, testy)

結論

在Julia的生態系統中,分類問題已經有一段時間了。幸運的是,由於許多Julia包的進一步開發,有許多方法可以在Julia中非常有效地獲得相當準確的分類預測。

相關焦點

  • R包randomForest的隨機森林分類模型以及對重要變量的選擇
    R包randomForest的隨機森林分類模型以及對重要變量的選擇隨機森林(random forest)是一種組成式的有監督學習方法,可視為決策樹的擴展。隨機森林通過對對象和變量進行抽樣構建預測模型,即生成多個決策樹,並依次對對象進行分類。最後將各決策樹的分類結果匯總,所有預測類別中的眾數類別即為隨機森林所預測的該對象的類別,分類準確率提升。
  • 隨機森林算法入門(Python)
    隨機森林能夠用於分類和回歸問題,可以處理大量特徵,並能夠幫助估計用於建模數據變量的重要性。這篇文章是關於如何使用Python構建隨機森林模型。隨機森林可以用於幾乎任何一種預測問題(包括非線性問題)。它是一個相對較新的機器學習策略(90年代誕生于貝爾實驗室)可以用在任何方面。它屬於機器學習中的集成學習這一大類。
  • 大盤點:隨機森林的優缺點以及如何用Python解釋
    隨機森林隨機森林是一種靈活的、便於使用的機器學習算法,即使沒有超參數調整,大多數情況下也會帶來好的結果。它可以用來進行分類和回歸任務。通過本文,你將會學習到隨機森林算法是如何解決分類和回歸問題的。為了理解什麼是隨機森林算法,首先要熟悉決策樹。
  • 一文讀懂「隨機森林」在微生態中的應用
    隨機森林 是一種基於決策樹的高效的機器學習算法,可以用於對樣本進行分類,也可以用於回歸分析。它屬於非線性分類器,因此可以挖掘變量之間複雜的非線性的相互依賴關係。通過隨機森林分析,可以找出能夠區分兩組樣本間差異的關鍵成分(OTU或物種)。1.
  • 如何用sklearn創建機器學習分類器?這裡有一份上手指南
    一般來說,很多數據都是在Pandas中的DataFrame中編碼的,但DataFrames並不適用於sklearn,所以我們需要提取特徵和標籤並將它們轉換成numpy數組。分割這些標籤很簡單,可以在一行中使用np.asarray()。第四步:選擇分類器我建議在一開始大家都選擇隨機森林分類器。
  • 機器學習:R語言實現隨機森林
    R包randomForest的隨機森林分類模型以及對重要變量的選擇隨機森林(random forest)是一種組成式的有監督學習方法,可視為決策樹的擴展。隨機森林通過對對象和變量進行抽樣構建預測模型,即生成多個決策樹,並依次對對象進行分類。
  • 機器學習之分類算法:隨機森林
    我們這裡介紹一個基於決策樹的一個組合模型隨機森林(Random Forest)。隨機森林應用範圍廣,既可以用來做市場營銷模擬的建模,統計客戶來源,保留和流失,也可以用於計算機人體識別等等。隨機森林算法自動創建隨機決策樹群,構成一個森林每棵樹都是獨立且權重一樣。
  • 隨機森林的原理及Python代碼實現
    在PAC(概率近似正確)學習框架下,則一定可以將弱分類器組裝成一個強分類器。關於Boosting的兩個核心問題:1)在每一輪如何改變訓練數據的權值或概率分布?通過提高那些在前一輪被弱分類器分錯樣例的權值,減小前一輪分對樣例的權值,來使得分類器對誤分的數據有較好的效果。2)通過什麼方式來組合弱分類器?
  • 隨機森林(Random Forest)算法原理
    :  在機器學習中,隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。基於樹分類器的集成算法(Ensemble Learning),其包含了2種十分有效地機器學習技術:Bagging和隨機變量選擇,隨機森林它屬於Bagging類型,通過組合多個弱分類器,最終結果通過投票或取均值,使得整體模型的結果具有較高的精確度和泛化性能。
  • 實戰:用Python實現隨機森林
    過度擬合:為什麼森林比一棵樹更好你可能會想問為什麼不只使用一個決策樹?它似乎是完美的分類器,因為它沒有犯任何錯誤!記住這其中的關鍵點是樹在訓練數據上沒有犯錯。因為我們給樹提供了答案。機器學習模型的要點是很好地概括測試數據。不幸的是,當我們不限制決策樹的深度時,它往往會過度擬合。
  • Bagging與隨機森林算法原理小結
    另一種是bagging流派,它的特點是各個弱學習器之間沒有依賴關係,可以並行擬合。本文就對集成學習中Bagging與隨機森林算法做一個總結。隨機森林是集成學習中可以和梯度提升樹GBDT分庭抗禮的算法,尤其是它可以很方便的並行訓練,在如今大數據大樣本的的時代很有誘惑力。
  • 隨機森林(Random Forest)原理小結
    隨機森林(RF)2.1 RF 分類2.2 特徵重要性2.3 RF 回歸3. 模型評價4.bagging希望集成中的個體學習器儘可能相互獨立,而這在現實任務中幾乎無法做到,更簡單方便的實現是 使基學習器具有較大差異 ,或者說使得基學習器更具有 「多樣性」 。
  • 說說隨機森林
    隨機森林對多元公線性不敏感,結果對缺失數據和非平衡的數據比較穩健,可以很好地預測多達幾千個解釋變量的作用(Breiman 2001b),被譽為當前最好的算法之一(Iverson et al. 2008)。隨機森林顧名思義,是用隨機的方式建立一個森林,森林裡面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。
  • 監督學習——決策樹和隨機森林
    決策樹(Decision Tree) 決策樹DT是一種非參數監督學習算法,可以用來構造回歸器和分類器,之所以在分類算法這裡介紹它是因為它一般用作分類。決策樹用於鳶尾花數據的分類結果算法介紹因為樹是一種二分類模型的多層疊加,因此,每一層決策樹的優化是通過對「左」「右」兩個分組內標籤的「雜質程度」進行優化的結果,雜質程度越低說明分類的效果越好。
  • 【翻譯】Sklearn 與 TensorFlow 機器學習實用指南 —— 第7章 集成學習和隨機森林 (下)
    機器學習實用指南 —— 第7章 集成學習和隨機森林 (中)梯度提升另一個非常著名的提升算法是梯度提升。與 Adaboost 一樣,梯度提升也是通過向集成中逐步增加分類器運行的,每一個分類器都修正之前的分類結果。然而,它並不像 Adaboost 那樣每一次迭代都更改實例的權重,這個方法是去使用新的分類器去擬合前面分類器預測的殘差 。 讓我們通過一個使用決策樹當做基分類器的簡單的回歸例子(回歸當然也可以使用梯度提升)。
  • 從決策樹到隨機森林:樹型算法的原理與實現
    注意,目前 sklearn.tree 決策樹分類器(和回歸器)不支持剪枝。袋裝(Bootstrap Aggregating——Bagging)在統計學中,Bootstrap 是依靠替換隨機採樣的任意試驗或度量。我們從上文可以看見,決策樹會受到高方差的困擾。
  • 機器學習之隨機森林算法(Random Forest)及python代碼實現
    從直觀上來看隨機森林算法,每顆決策樹都是相互獨立的分類器,很多顆獨立的決策樹就構成了隨機森林,當有一個樣本進來後,讓森林中的每顆決策樹分別各自獨立判斷進行投票,看看這個樣本在自己這裡屬於哪一類,最終看森林中決策樹選擇哪一類的最多,簡單的以少數服從多數的方式,決定最終作為隨機森林的預測結果對外輸出。
  • 理解隨機森林:基於Python的實現和解釋
    過擬合:森林比樹更優的原因你可能會問為什麼不直接使用一個決策樹?這種分類器堪稱完美,因為根本不會犯任何錯誤!但要記住一個重點:決策樹只是不會在訓練數據上犯錯。使用許多個體正是隨機森林方法背後的本質思路:不是使用單個決策樹,而是使用數百或數千個決策樹來組成一個強大的模型。則該模型的最終預測結果即為集體中所有樹的預測的平均。(過擬合問題也被稱為「偏差-方差權衡」問題,是機器學習領域內一大基本研究主題。)
  • python實現隨機森林
    下面是將決策樹與這些算法框架進行結合所得到的新的算法:1)Bagging + 決策樹 = 隨機森林2)AdaBoost + 決策樹 = 提升樹3)Gradient Boosting + 決策樹 = GBDT創建流程及舉例舉例:考慮一個簡單例子:在二分類任務中,假定三個分類器在三個測試樣本上的表現如下圖,其中√表示分類正確
  • 具有貝葉斯優化的XGBoost和隨機森林
    XGBoost(XGB)和隨機森林(RF)都是集成學習方法,並通過組合各個決策樹的輸出(我們假設基於樹的XGB或RF)來預測(分類或回歸)。隨機森林隨機森林(RF)使用隨機數據樣本獨立訓練每棵樹。這種隨機性有助於使模型比單個決策樹更健壯。由於RF不太可能過度擬合訓練數據。隨機森林應用示例隨機森林差異性已被用於各種應用,例如,基於組織標記數據找到患者群。