科技

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/

譯者:野生大熊貓

Reference:科技日報

看更多!請加入我們的粉絲團

轉載請附文章網址

不可錯過的話題