Python中Scikit-Learn庫的分類方法總覽
簡介
你是一個正在進入機器學習領域的Python程序員嗎? 掌握Scikit-Learn就是一個開啟你的旅程的很好的方式。
使用Scikit-Learn進行一些分類是應用你所學到的知識的一種直接而簡單的方法,通過使用一個用戶友好的、文檔良好且健壯的庫來實現這些分類可以讓機器學習概念更具體化。
什麼Scikit-Learn?
Scikit-Learn是一個Python庫,由David Cournapeau在2007年首次開發。它包含一系列容易實現和調整的有用演算法,可以用來實現分類和其他機器學習任務的目的。
Scikit-Learn使用SciPy作為基礎,因此在使用Scikit-Learn之前必須安裝這個庫的基礎堆棧。
定義術語
在我們進一步探索Scikit-Learn之前,讓我們花一分鐘來定義我們的術語。理解描述Scikit-Learn功能時使用的辭彙是很重要的。
首先,機器學習系統或網路接受輸入和輸出。機器學習框架的輸入通常被稱為「特徵」。
特徵本質上與科學實驗中的變數相同,它們是被觀察現象的特點,可以用某種方式量化或測量。
當這些特性被輸入到機器學習框架中時,該網路就會嘗試識別這些特徵之間的相關模式。然後使用這些模式生成框架/網路的輸出。
框架的輸出通常被稱為「分類」,因為輸出特徵會具有一些網路給予它們的標籤,它是一些關於輸出屬於哪個類別的假設。
在機器學習上下文中,分類是一種監督學習。監督學習是指輸入網路的數據已經被標記,重要的特徵/屬性已經預先被劃分為不同的類別。
這意味著網路知道輸入的哪些部分是重要的,並且還有一個目標或標準答案,網路可以根據它來檢查自己。分類的一個例子是把一堆不同的植物分類成不同的種類,比如蕨類植物或被子植物。這個任務可以通過一個決策樹(Scikit-Learn中的一種分類器)來完成。
相反,無監督學習是指輸入網路的數據沒有被標記,而網路必須自己學習哪些特性是最重要的。如前所述,分類是一種類型的監督學習,因此我們在本文中將不討論非監督學習方法。
模型的訓練過程是將數據輸入神經網路,讓神經網路學習數據的模式的過程。訓練過程接收數據並提取數據集的特徵。在一個監督分類任務的訓練過程中,網路既要傳遞訓練數據的特徵,又要傳遞訓練數據的分類。但是,在測試過程中,只給網路傳入特徵。
測試過程是對網路學習到的模式進行測試的地方。特徵被提供給網路,並且網路必須預測其分類。提供給網路的數據被分為訓練集和測試集,這是兩個不同的輸入集。你不能使用訓練分類器的同一個數據集來測試該分類器,因為這個模型已經學習了這組數據的模式,所以結果可能會偏差很大。
相反,如果數據集被分割成訓練集和測試集,那麼這樣一來,一個是用來訓練分類器的數據集,而另一個則是分類器從未見過的數據集。
不同類型的分類器
Scikit-Learn提供了對多種不同分類演算法的簡單訪問。這些分類器包括:
- K最近鄰演算法
- 支持向量機
- 決策樹分類器/隨機森林
- 樸素貝葉斯
- 線性判別分析
- 邏輯回歸
有很多關於這些分類器如何運行的文獻,你也可以在Scikit-Learn的網站上找到它們的簡要解釋。
由於這個原因,我們不打算在這裡深入研究它們是如何工作的,但是會對分類器的工作方式進行簡要的說明。
K最近鄰分類演算法
K最近鄰分類演算法通過檢查某個測試示例到某個訓練示例的已知值之間的距離來進行計算。能給出訓練點與測試點之間最小距離的一組數據點/類就是該演算法所選擇的類。
決策樹
決策樹分類器通過根據不同的標準將數據集分解為越來越小的子集來進行計算。它會使用不同的排序標準來劃分數據集,每劃分一次,示例的數量就會減少。
一旦網路將數據劃分為一個示例,這個示例將被放入一個對應於一個鍵的類中。當多個隨機的森林分類器鏈接在一起時,它們就被稱為隨機森林分類器。
樸素貝葉斯
一個樸素貝葉斯分類器會確定一個例子屬於某個類的概率,它會計算在某個輸入事件已經發生的情況下,某個事件發生的概率。
當它進行這種計算時,它會假定一個類的所有預測器都對結果具有相同的影響,即預測器是相互獨立的。
線性判別分析
線性判別分析的工作原理是通過降低數據集的維度,將所有數據點投影到一條直線上。然後根據這些點與所選點或矩心的距離將它們組合成類。
和你所猜想的一樣,線性判別分析是一種線性分類演算法,最好在數據具有線性關係時使用。
支持向量機
支持向量機的工作原理是在不同的數據點集群之間畫一條線,將它們分組到一些類中。線的一邊的點是一類,另一邊的點屬於另一類。
分類器會嘗試最大化它所繪製的線與它兩邊的點之間的距離,以增加它對哪個點屬於哪類的置信度。當測試點被繪製出來時,它們在直線的哪邊就是它們所屬的類。
邏輯回歸
邏輯回歸以二元範圍 (0或1)輸出關於測試數據點的預測。如果某個東西的值為0.5或以上,則將其劃分為第1類,如果值低於0.5就屬於第0類。
每個特徵也只有0或1的分類。邏輯回歸是一種線性分類器,因此當數據之間存在某種線性關係時就會用到它。
分類任務的例子
分類任務是將樣本放入兩個或多個類中的任何任務。確定一個圖片是貓還是狗就是一項分類任務,就像根據酸度和酒精含量等特徵確定一瓶酒的質量一樣。
根據手頭的分類任務,你可能希望使用不同的分類器。例如,邏輯回歸模型最適合於二元分類任務,即使存在多變數邏輯回歸模型。
隨著你獲得的分類器經驗越多,你就會對何時使用哪個分類器有更好的感覺。但是,通常的做法是實例化多個分類器,並比較它們之間的性能,然後選擇性能最好的分類器。
實現一個分類器
現在我們已經討論了Scikit-Learn為我們提供的各種分類器,我們來看看如何實現一個分類器。
實現分類器的第一步是將所需要的分類器導入到Python中。我們來看看邏輯回歸的import語句:
下面是本文討論的其他分類器的import語句:
Scikit-Learn還有其他分類器,它們各自的文檔頁面會展示如何導入它們。
在導入之後,你就必須實例化分類器。實例化是在Python程序中將分類器轉換成存在的實例的過程,也就是創建分類器/對象的實例。
這通常只需要創建一個變數並調用與分類器關聯的函數來完成:
現在需要對分類器進行訓練。要做到這一點,分類器必須與訓練數據相匹配。
訓練特徵和訓練分類通過fit命令傳入分類器:
分類器模型在訓練數據上進行訓練後,可以對測試數據進行預測了。
這很容易做到,你可以調用分類器上的預測命令,並為其提供預測所需的參數,這些參數是你的測試數據集中的特徵:
實例化、擬合/訓練和預測這些步驟是Scikit-Learn中分類器的基本工作流。
然而,分類器的處理只是使用Scikit-Learn進行分類的一部分。在Scikit-Learn中分類的另一部分是處理數據。
為了理解處理分類器和處理數據是怎樣作為一個整體分類任務結合在一起的,我們花點時間來理解機器學習管道。
機器學習管道
機器學習管道包括以下步驟:準備數據、創建訓練/測試集、實例化分類器、訓練分類器、進行預測、評估性能、調整參數。
在數據集上訓練分類器的第一步是準備數據集——將數據轉換為分類器所需的正確形式,並處理數據中的任何異常。如果數據中有缺失值、異常值或任何其他異常,這些數據點都要被處理,因為它們會對分類器的性能產生負面影響。這一步稱為數據預處理。
數據預處理完成後,必須將數據分解為訓練集和測試集。我們之前已經討論了創建訓練和測試集的基本原理,這可以通過一個非常有用的名為traintestsplit的函數在Scikit-Learn中輕鬆實現。
如前所述,分類器必須進行實例化並在訓練數據上進行訓練。然後就可以利用分類器進行預測。通過將分類器的預測與測試數據中分類的實際已知值進行比較,你就可以測量該分類器的準確度。
將假定的分類與實際分類進行比較並評估分類器的方法有很多。我們稍後將討論這些不同的評估指標。現在,要知道,在測量了分類器的準確的之後,你可能會回過頭來調整你的模型的參數,直到達到你滿意的準確度為止(因為你的分類器不太可能在第一次運行時就達到你的期望)。
讓我們看一個機器學習管道的例子,從處理數據到進行評估。
示例分類器實現
由於iris數據集非常常見,Scikit-Learn實際上已經具有了,我們可以用以下命令進行載入:
不過,我們將在這裡載入一個CSV文件,以便你了解如何載入和預處理數據。你可以在這裡(https://www.kaggle.com/uciml/iris )下載這個csv文件。
只需將數據文件放在與Python文件相同的目錄中。Pandas庫有一個簡單的載入數據的方法,即read_csv():
因為數據集準備得很好,所以我們不需要進行很多預處理。我們可能會想做的一件事是刪除「ID」列,因為它只是對示例所在行的一個表示。
由於這一列並沒有任何幫助,所以我們可以使用drop()函數從數據集中刪除它:
現在我們需要定義特徵和分類。我們可以使用Pandas庫通過對數據表進行切片,並使用iloc()選擇特定的行/列來輕鬆地實現這一點:
上面的切片符號會選擇除最後一列(這是我們的分類,物種)之外的每一行和每一列。
或者,你也可以通過使用括弧符號和傳遞列標頭來選擇你感興趣的某些數據集特性:
現在我們已經有了我們想要的特徵和分類,我們可以使用sklearn的train_test_split()函數將數據分割為訓練集和測試集:
你可能想列印結果,以確保你的數據正在按照你所期望的方式被解析:
現在我們可以實例化這個模型。我們嘗試使用兩個分類器,一個支持向量分類器和一個k最近鄰分類器:
現在我們來適應分類器:
以上調用已經訓練了這個模型,現在我們可以進行預測並將預測結果存儲在一個變數中:
現在我們應該評估一下分類器的運行情況。有多種方法可以用來評估一個分類器的性能,你可以在下面閱讀關於這些不同方法的更多信息。
在Scikit-Learn中,你只需要輸入與你測試標籤中存儲的真實分類相對的預測結果即可:
作為參考,下面是我們得到的關於指標的輸出:
乍一看,KNN的表現似乎更好。這是SVC的混淆矩陣:
這可能有點難以解釋,但是每個類的正確預測數都是從左上角到右下角的對角線上運行的。查看下面的更多信息。
最後,這是KNN分類報告的輸出:
評估分類器
在評估你的分類器時,有幾種不同的方法可以用來測量它的性能。
分類準確度
分類準確度是所有評估準確性的方法中最簡單的,也是最常用的。分類準確度就是正確預測的數量除以所有預測或者正確預測與總預測的比例。
雖然它可以讓你快速了解分類器的執行情況,但是最好在每個類中的觀察值/示例數量大致相當時再使用它。因為這種情況不會經常發生,所以你最好使用另一種指標方法。
對數損失
對數損失,或LogLoss,本質上是評估分類器對其預測結果的自信程度。LogLoss會返回給定類中一個示例中成員的概率,將它們加起來表示分類器的總體信心。
針對預測的值取值為1到0,1表示完全自信,0表示不自信。損失,或者信心的總缺乏度,以負數的形式返回,0表示一個完美的分類器,所以值越小越好。
ROC曲線下與坐標軸圍成的面積(AUC)
這是一個僅用於二元分類問題的指標。曲線下的面積代表了模型正確區分正負樣本的能力,以及區分一個類和另一個類的能力。
落在曲線下的面積總和為1.0,這代表一個完美的分類器。這意味著AUC為0.5基本上和隨機猜測一樣好。ROC曲線根據靈敏度(真陽率/召回率)和特異性(真陰率)計算。你可以在這篇ROC曲線文章中閱讀更多關於這些計算的內容。
混淆矩陣
混淆矩陣是一個表或圖表,表示模型相對於兩個或多個類的準確性。模型的預測用x軸表示,而結果/準確度用y軸表示。
這個單元格中被填入了模型做出的預測數量。正確的預測可以在從左上角到右下角的對角線上找到。你可以在這裡閱讀更多關於解釋混淆矩陣的內容。
分類報告
分類報告是一種Scikit-Learn的內置指標,專門針對分類問題而創建。使用分類報告可以讓你快速直觀地了解模型的執行情況。召回率會將你的模型標記為類A(某些給定的類)的樣本數量與類A的樣本總數進行比較,這在報告中會表示出來。
該報告還返回預測和f1得分。精確度是您的模型被標記為類A的實例的百分比,它實際上屬於類A(真陽性對假陽性),而f1-score是精確度和召回率的平均值。
結論
為了進一步加深你對Scikit-Learn的理解,你最好多了解一些可用的不同分類演算法。一旦你理解了這些演算法,閱讀更多關於如何評估分類器的內容。
分類的許多細微差別只是隨著時間和實踐而來的,但是如果你按照本指南中的步驟,那你將會在成為一個使用Scikit-Learn處理分類任務的專家的道路上走得很好。
英文原文:https://stackabuse.com/overview-of-classification-methods-in-python-with-scikit-learn/
譯者:野生大熊貓
TAG:Python部落 |