一遍就懂的Scikit-Learn機器學習分類過程

2021-02-20 相約機器人

選自 | levelup.gitconnected

作者 | Hazem Saleh

全文長 | 2700字

本文與移動或Web開發、雲平臺無關,而是我開始進入了機器學習的世界。雖然我仍然還在這個領域探險,但我會不時在博客上發表我的收穫(文末可進入作者博客)。

首先我們來理解本文的目標。本文介紹了常見的機器學習問題。我的主要目的不是再次解決同樣的問題,而是使用Python的Scikit-Learn庫闡述教育目的的機器學習分類過程。

在深入研究要解決的問題之前,我們首先理解可能涉及到的重要術語。

監督學習

具備針對特定問題的輸入及輸出數據(也稱為訓練數據,通常由領域專家提供),目標是讓機器在進行訓練後,能夠發現輸入數據到輸出數據的一般映射規則。經過適當的訓練後,機器可以在特定精度水平下預測任何輸入的輸出。

例如我們將在本文中討論的分類問題(鳶尾花問題)。我們有一些關於花瓣、萼片寬度、高度及其相應種類的數據。有了這個數據後,我們想通過花瓣和萼片的寬度/高度預測花的種類(在分類中,輸出必須是訓練數據中可用的輸出之一)。

監督學習還包括與分類問題相似的回歸問題。基於早期訓練將輸入映射到輸出。但是在回歸的情況下,輸出是估計值而不僅僅是一類輸出(例如,基於股票價格歷史數據預測特定公司的股票價格,結果可以是任何正數)。

無監督學習

在無監督學習中,您輸入的數據沒有標籤,機器學習算法負責確定數據中所需的邏輯關係。這在像聚類之類的問題中很有用。聚類和分類的區別在於聚類時您不知道數據都有哪些種類。

無監督學習和其他類型的學習,如半監督和 re-enforcement 學習,都超出了本文的範圍,在此不做討論。

這是一個非常常見的問題。稱為鳶尾花數據集或Fisher's 鳶尾花數據集,是由英國統計學家和生物學家Ronald Fisher在他1936年的論文中引入的多變量數據集。(論文題目為 「The use of multiple measurements in taxonomic problems as an example of linear discriminant analysis」 )

該數據集由來自三種鳶尾花(setosa,virginica和versicolor)的中每一種花的許多樣本組成。以釐米為單位測量每個樣品的四個特徵:萼片的長度、花瓣的長度、.萼片的寬度、花瓣的寬度。

基於這四個特徵的組合,Fisher開發了一種線性判別模型,以區分花種。以下是每個物種的樣本數據。

 

你可能會問--花瓣和花萼之間有什麼區別?為了回答這個問題,我在Quora中找到了一個很好的答案:花瓣和花萼之間的主要區別在於花瓣形成花的內部輪生,而萼片形成花的外部輪生,如下所示。

 

圖片來源:https://www.quora.com/What-is-the-difference-between-sepals-and-petals

我們希望根據此數據集訓練我們的分類器,以便能夠根據其萼片和花瓣數據預測鳶尾花的類別。

為了對鳶尾花進行分類,我們將執行以下步驟:

加載鳶尾花數據集

將數據拆分為訓練集和測試集

在訓練集上訓練模型

計算模型精度

對外部輸入數據執行預測

為了執行所有這些步驟,我們將使用scikit-learn python庫:https://scikit-learn.org

scikit-learn庫是一個非常強大的Python庫,它通過Python中的一組API提供各種有監督和無監督的學習算法。它基於SciPy和NumPy構建,必須在安裝Sci-kit learn之前安裝這兩個庫。

您可以使用Python pip安裝:

pip3 install -U numpy scipy scikit-learn

現在,讓我們深入了解分類步驟的細節。

1.加載數據集

scikit-learn附帶了鳶尾花數據集,所以我們在第一步中只需要加載現有數據集,提取輸入數據iris.data和輸出目標數據iris.target,如下面的代碼所示。

from sklearn.datasets import load_irisiris = load_iris()data = iris.datatarget = iris.targettarget_names = iris.target_names

iris.target_names是我們在介紹中所說的特徵名稱。我們有4個特徵可以解決這個問題,所以如果我們列印iris.target_names,我們將得到以下輸出。

['setosa''versicolor''virginica']

2.分割訓練集和測試集

為了測試我們訓練模型的準確性,我們需要一些準確性的參考,其中一種技術是將實際數據分成訓練集和測試集,以便我們可以使用訓練集進行實際的訓練過程,然後使用測試集驗證模型輸出和準確性。讓我們看看如何使用scikit-learn API完成這項工作。

from sklearn.model_selection import train_test_splitdata_train, data_test, target_train, target_test = train_test_split(self.data, self.target, test_size=0.3, random_state=12)

使用train_test_split(),只需一行代碼就可以進行數據分割,它需要以下參數:

1. 輸入數據(self.data)

2. 目標數據(self.target)

3. 分割比例,這表示我們希望將整個數據集的多少拆分為測試集,此參數應該是介於0.0和1.0之間的float型,表示要包含在測試集中的原始數據集、比例(test_size=0.3) 。

4. 隨機狀態僅僅是一個隨機數種子(random_state=12)。

3.訓練模式

現在我們要開始在訓練集上訓練模型了。我們將使用 K-Neighbors Classifier來執行此分類(詳細了解此分類器的工作方式:https://scikit-learn.org/stable/modules/generated/sklearn.neighbors .KNeighborsClassifier.html)

可以使用以下兩行代碼來訓練模型。

from sklearn.neighbors import KNeighborsClassifierclassifier = KNeighborsClassifier()classifier.fit(data_train, target_train)

我們使用 fit() 方法將訓練的輸入數據 data_train 作為第一參數,並將目標輸出數據target_train 作為第二參數來訓練模型。

4.計算模型精度

為了計算模型精度,我們將使用步驟3中模型預測的測試集data_test,然後使用metrics.accurance_score()計算預測輸出目標pred與原始正確輸出目標測試的距離。

from sklearn import metricstarget_pred = classifier.predict(data_test)accuracy = metrics.accuracy_score(target_test, target_pred)

accuracy_score() 將原始的輸出target_test作為第一個參數,在第二個參數中,它採用預測的輸出target_pred。最後,accuracy_score() 返回一個0到1之間的分數,其中1表示最佳性能,0表示最差。

如果我們列印精度變量,我們會發現它等於0.9777777777777777,是非常好的精度。

5.執行實際預測

最後一步,即執行實際預測。為此,我們創建了一些外部測試輸入樣本,並詢問模型是否可以預測此鳶尾花的數據是屬於setosa,還是屬於virginica或versicolor。讓我們看看如何在以下代碼中完成此操作。

external_input_sample = [[5, 2, 4, 1], [6, 3, 5, 2], [5, 4, 1, 0.5]]prediction_raw_values = classifier.predict(external_input_sample)prediction_resolved_values = [target_names[p] for p in prediction_raw_values]

如果我們列印 prediction_resolved_values,我們會發現預測是:

[『versicolor』, 『virginica』, 『setosa』]

我們實際上可以在兩個抽象的步驟中總結所有以前的分類步驟:

1.訓練(從第1步到第4步)

2.預測(步驟5)

我們還可以根據需要添加額外的抽象步驟,如保存/加載模型,以避免每次重新訓練模型。這都是由這個簡單的BasicIrisClassifier類處理的。

from sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import metricsfrom joblib import dump, load
class BasicIrisClassifier: def load(self): iris = load_iris() self.data = iris.data self.target = iris.target self.target_names = iris.target_names
def train(self): data_train, data_test, target_train, target_test = train_test_split(self.data, self.target, test_size=0.3, random_state=12)
self.classifier = KNeighborsClassifier() self.classifier.fit(data_train, target_train)
target_pred = self.classifier.predict(data_test) accuracy = metrics.accuracy_score(target_test, target_pred)
return accuracy
def predict(self, external_input_sample): prediction_raw_values = self.classifier.predict(external_input_sample) prediction_resolved_values = [self.target_names[p] for p in prediction_raw_values] return prediction_resolved_values
def saveModel(self): dump(self.classifier, 'trained_iris_model.pkl') dump(self.target_names, 'trained_iris_model_targetNames.pkl')
def loadModel(self): self.classifier = load('trained_iris_model.pkl') self.target_names = load('trained_iris_model_targetNames.pkl')
external_input_sample = [[5, 2, 4, 1], [6, 3, 5, 2], [5, 4, 1, 0.5]]basic_iris_classifier = BasicIrisClassifier()
basic_iris_classifier.load()
accuracy = basic_iris_classifier.train()print("Model Accuracy:", accuracy)
prediction = basic_iris_classifier.predict(external_input_sample)print("Prediction for {0} => \n{1}".format(external_input_sample, prediction))
basic_iris_classifier.saveModel()

 

代碼地址:https://gist.github.com/hazems/df616493870b6d9555910f82aef55349#file-basicirisclassifier-py

運行此Python類之後,我們將得到以下輸出。

Model Accuracy: 0.9777777777777777Prediction for [[5, 2, 4, 1], [6, 3, 5, 2], [5, 4, 1, 0.5]] =>[『versicolor』, 『virginica』, 『setosa』]

您可能注意到我們調用了 saveModel() ,它使用 joblib 的dump() 保存實際模型。還有一個注釋行調用 loadModel() ,可以使用 joblib 的 load() 加載模型,如果希望避免每次執行此類時都重新訓練模型,這個步驟非常重要。這意味著我們可以簡單地做下面的工作,在您有了 dumbed 模型之後預測任何外部輸出。

basic_iris_classifier.loadModel()prediction = basic_iris_classifier.predict(external_input_sample)print(「Prediction for {0} => \n{1}」.format(external_input_sample, prediction))

我在GitHub中提供了此代碼,您可以隨意查看,提出問題並根據需要使用它:

https://github.com/hazems/basic-knn-classifier-python

祝學習愉快~

作者致謝:感謝mohammed_nabil,Rao,Yogeswara。

作者簡介:Hazem Saleh,開源愛好者,Apache PMC,Viacom紐約的軟體架構師,5本科技書籍的作者(其中一本是暢銷書),以及WW技術演講者。

 

原文連結:https://levelup.gitconnected.com/scikit-learn-machine-learning-classification-101-c431de2dc2b2

封面圖來源:pexels by Pixabay

推薦閱讀

Scikit-Learn:基本機器學習的靈丹妙藥

《深度學習之TensorFlow:入門、原理與進階實戰》、《Python帶我起飛——入門、進階、商業實戰》、《深度學習之TensorFlow工程化項目實戰》三本圖書是代碼醫生團隊精心編著的 AI入門與提高的精品圖書。配套資源豐富:配套視頻、QQ讀者群、實例源碼、 

配套論壇:http://bbs.aianaconda.com 

更多請見:https://www.aianaconda.com

點擊「閱讀原文」圖書配套資源

相關焦點

  • scikit-learn機器學習簡介
    機器學習:問題設置通常,一個機器學習問題會通過學習n個數據樣本,然後去預測未知數據的屬性。如果每個樣本都不止一個屬性,即一個多維屬性(也稱為多元 數據),則稱其具有多個屬性或特徵。監督學習,數據包含有我們要預測的額外屬性(單擊此處 轉到scikit-learn監督學習頁面)。
  • Python + Scikit-learn 完美入門機器學習指南 ​
    但我們都知道,機器學習常用的算法有很多,例如:線性回歸、支持向量機、k 近鄰、決策樹、樸素貝葉斯、邏輯回歸等。其中的一些算法都有著比較複雜的數學過程,如果每一次都需要自己通過代碼實現這些算法,那麼機器學的門檻就變得很高了。這時,scikit-learn 來了。
  • python機器學習之使用scikit-learn庫
    引言數據分析由一連串的步驟組成,對於其中預測模型的創建和驗證這一步,我們使用scikit-learn這個功能強大的庫來完成。scikit-learning庫python庫scikit-learn整合了多種機器學習算法。
  • 使用 scikit-learn 玩轉機器學習——集成學習
    這種情況下,可以為不同水平的分類器賦權重,或者對所有參與分類的分類器對未知樣本屬於某類得出一個概率,然後所有概率相加求平均來確定種類。對於這種情況,Voting Classifier 類只需將超參數 voting='soft' 即可,但上例中的 KNN 算法在分類時並不產生概率,所以就不調參演示了。
  • Scikit-learn估計器分類
    Scikit-learn實現了一系列數據挖掘算法,提供通用編程接口、標準化的測試和調參公局,便於用戶嘗試不同算法對其進行充分測試和查找最優參數值。本次講解數據挖掘通用框架的搭建方法。有了這樣一個框架,後續章節就可以把講解重點放到數據挖掘應用和技術上面。為幫助用戶實現大量分類算法,scikit-learn把相關功能封裝成估計器。估計器用於分類任務,它主要包括兩個函數。
  • 用 Scikit-learn Pipeline 創建機器學習流程
    本文翻譯自:https://medium.com/vickdata/a-simple-guide-to-scikit-learn-pipelines
  • Scikit-Learn機器學習實踐:垃圾簡訊識別
    機器學習與垃圾簡訊識別前不久,我們使用NLTK的貝葉斯分類模型垃圾對簡訊數據進行機器學習的垃圾簡訊識別。其實除了使用NLTK,我們還可以使用Scikit-Learn這個集成了諸多機器學習算法的模塊進行上述的實驗。
  • 直答理工:機器學習——scikit-learn入門
    機器學習可通過已知樣本的一系列特徵數據來預測未知的性質。一般,根據問題類型,可將學習分為以下幾類:監督學習:數據集本身有待預測的目標值,一般包括分類問題和回歸問題。分類樣本屬於兩類或更多的類,我們希望從已知的標籤的數據中去預測未標籤的數據。
  • WePay機器學習反欺詐實踐:Python+scikit-learn+隨機森林
    【編者按】將機器學習算法用於金融領域的一個很好的突破口是反欺詐,在這篇博文中,WePay介紹了支付行業構建機器學習模型應對很難發現的shell selling欺詐的實踐心得。WePay採用了流行的Python、scikit-learn開源學習機器學習工具以及隨機森林算法。以下是文章內容:什麼是shellselling?
  • 極簡Scikit-Learn入門
    100天搞定機器學習寫了三天了機器學習100天|Day1數據預處理100天搞定機器學習|Day2
  • Python中的人工智慧入門:在scikit-learn中的建模
    做好準備:在Seaborn中可視化數據  鳶尾花數據集 (The Iris Flower dataset) 是目前仍在使用的最古老的機器學習數據集之一。它由Ronald Fisher在1936年發表,用於說明線性判別分析。問題是根據萼片和花瓣寬度和長度的測量結果對三種鳶尾花中的一種進行分類。
  • 資料| 連廣場大媽都聽得懂的「機器學習入門」scikit-learn -17頁...
    from=leiphonecolumn_res0604pmScikit-learn 是基於 Python 的開源機器學習庫,它基於 NumPy 和 SciPy 等科學計算庫,並支持支持向量機、隨即森林、梯度提升樹、K 均值聚類等學習算法。Scikit-learn 目前主要由社區成員自發進行維護,且專注於構建機器學習領域內經廣泛驗證的成熟算法。
  • 看完這篇 scikit-learn學習指南,下節AI課不用上了
    歡迎來到scikit-learn機器學習世界。scikit-learn是一款強大的通用機器學習庫。屬於傳統機器學習的領域,其特點是利用特徵工程,人為對數據進行提煉和清洗。本文將討論以下主題: 機器學習簡介 什麼是scikit-learn?
  • 【下載】Scikit-learn作者新書《Python機器學習導論》, 教程+代碼手把手帶你實踐機器學習算法
    Müller同時也是著名機器學習Python包scikit-learn的主要貢獻者 Andreas Muller 和 Reonomy 公司數據科學家 Sarah Guido 的新書《Python機器學習導論》(Introduction to machine learning with Python)從實戰角度出髮帶你用Python快速上手機器學習方法。
  • scikit-learn—樸素貝葉斯
    分類(Categorical)樸素貝葉斯CategoricalNB 實現了用於分類分布數據的分類樸素貝葉斯算法。它假設每個由索引i描述的特徵都有自己的分類分布。對於訓練集X中的每個特徵i,CategoricalNB在類y的條件下,估計X的每個特徵i的分類分布。樣本的索引集定義為={1,…,m},其中m是樣本數。其中
  • 使用scikit-learn進行機器學習
    更高級的scikit-learn介紹      導語為什麼要出這個教程?1.基本用例:訓練和測試分類器練習2.更高級的用例:在訓練和測試分類器之前預處理數據2.1 標準化您的數據2.2 錯誤的預處理模式2.3 保持簡單,愚蠢:使用scikit-learn的管道連接器練習3.當更多優於更少時:交叉驗證而不是單獨拆分練習4.超參數優化:微調管道內部練習5.總結:我的scikit-learn管道只有不到10行代碼(跳過import語句)6.異構數據:當您使用數字以外的數據時練習
  • 使用scikit-learn進行數據預處理
    更高級的scikit-learn介紹      導語為什麼要出這個教程?1.基本用例:訓練和測試分類器練習2.更高級的用例:在訓練和測試分類器之前預處理數據2.1 標準化您的數據2.2 錯誤的預處理模式2.3 保持簡單,愚蠢:使用scikit-learn的管道連接器練習3.當更多優於更少時:交叉驗證而不是單獨拆分練習4.超參數優化:微調管道內部練習5.總結:我的scikit-learn管道只有不到10行代碼(跳過import語句)6.異構數據:當您使用數字以外的數據時練習
  • 開源機器學習框架:Scikit-learn API簡介
    而在這些分支版本中,最有名,也是專門面向機器學習的一個就是Scikit-learn。和其他眾多的開源項目一樣,Scikit-learn目前主要由社區成員自發進行維護。可能是由於維護成本的限制,Scikit-learn相比其他項目要顯得更為保守。
  • 利用Spark 和 scikit-learn 將你的模型訓練加快 100 倍
    當我們使用 Spark 進行數據處理時,我們首選的機器學習框架是 scikit-learn。隨著計算機變得越來越便宜,機器學習解決方案的上市時間變得越來越關鍵,我們探索了加快模型訓練的各種方法。其中一個解決方案是將 Spark 和 scikit-learn 中的元素組合到我們自己的混合解決方案中。
  • 教程 | 如何在Python中用scikit-learn生成測試數據集
    scikit-learn Python 庫提供一套函數,用於從可配置測試問題中生成樣本來進行回歸和分類。在本教程中,你將學習測試問題及如何在 Python 中使用 scikit-learn 進行測試。分類測試問題3. 回歸測試問題測試數據集開發和實現機器學習算法時的一個問題是如何知道你是否已經正確實現了他們——它們似乎在有 bug 時也能工作。測試數據集是小型設計問題,它能讓你測試、調試算法和測試工具。