選自 | 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_namesiris.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
點擊「閱讀原文」圖書配套資源