原文:https://www.raywenderlich.com/174-beginning-machine-learning-with-scikit-learn
作者: Mikael Konutgan 2018年2月12日·中級(jí)·文章·15分鐘
在這個(gè)使用scikit-learn教程的Beginning Machine Learning中,您將學(xué)習(xí)如何創(chuàng)建自己的CoreML模型并將其集成到iOS應(yīng)用程序中。
- Swift 4,iOS 11,Xcode 9

借助iOS 11,Apple發(fā)布了Core ML框架,允許您將經(jīng)過培訓(xùn)的機(jī)器學(xué)習(xí)模型集成到您的應(yīng)用程序中。Apple提供了一種工具,可將許多模型格式轉(zhuǎn)換為其.mlmodel格式。但是,您如何創(chuàng)建和培訓(xùn)機(jī)器學(xué)習(xí)模型?在本教程中,您將通過使用scikit-learn創(chuàng)建自己的機(jī)器學(xué)習(xí)模型,并通過Apple的Core ML框架將其集成到iOS應(yīng)用程序中。在此過程中,您將學(xué)習(xí)如何:
- 在macOS上安裝流行的Python機(jī)器學(xué)習(xí)包。
- 創(chuàng)建預(yù)測(cè)機(jī)器學(xué)習(xí)模型。
- 將這些模型集成到您自己的iOS應(yīng)用程序中。
入門
下載入門項(xiàng)目,然后構(gòu)建并運(yùn)行它。
該應(yīng)用程序有3個(gè)滑塊,每個(gè)廣告預(yù)算一個(gè):電視廣告,廣播廣告和報(bào)紙廣告。在過去幾年中,您已經(jīng)記錄了廣告支出的金額(以數(shù)千美元計(jì)算)以及您的銷售額(以數(shù)千個(gè)單位顯示)。
現(xiàn)在,您希望構(gòu)建和培訓(xùn)機(jī)器學(xué)習(xí)模型,以幫助根據(jù)各種廣告預(yù)算方案預(yù)測(cè)您的銷售結(jié)果。之后,您希望將模型方便地打包到iOS應(yīng)用程序中,以便您和您的團(tuán)隊(duì)可以即時(shí)檢查結(jié)果。
在本教程中,您將構(gòu)建此模型并使用Core ML將其集成到應(yīng)用程序中,以便在移動(dòng)任何滑塊時(shí),銷售預(yù)測(cè)將更新。
但首先,您需要安裝必要的Python工具。
安裝Anaconda
Anaconda是一個(gè)開源發(fā)行版。它包含數(shù)千個(gè)預(yù)配置的軟件包,使用戶能夠使用Python中最流行的數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)工具快速啟動(dòng)并運(yùn)行。
在本教程中,您只會(huì)涉及Anaconda所提供的內(nèi)容,因此我建議您查看anaconda.org以了解有關(guān)它的更多信息。
要安裝Anaconda,請(qǐng)?jiān)L問他們的下載鏈接,然后下載 Python 2.7版本; Apple coremltools只使用Python 2。
下載后,運(yùn)行安裝程序。繼續(xù)閱讀“簡(jiǎn)介”,“自述文件”和“許可證”,直到進(jìn)入“ 目標(biāo)選擇”步驟。安裝Anaconda最簡(jiǎn)單,最干凈的方法是進(jìn)入本地項(xiàng)目。為此,請(qǐng)選擇在特定磁盤上安裝...,選擇正確的磁盤,單擊選擇文件夾...,導(dǎo)航到您選擇的用戶目錄,然后創(chuàng)建一個(gè)名為Beginning-Machine-Learning的新文件夾。
注意:如果安裝程序跳過“ 目標(biāo)選擇”步驟,請(qǐng)單擊“ 安裝類型”步驟上的“ 更改安裝位置...” 以返回該目標(biāo)。
選擇目標(biāo)后,單擊繼續(xù),然后單擊安裝,開始安裝過程。這應(yīng)該需要大約10分鐘。
要驗(yàn)證安裝,請(qǐng)打開終端和cd(更改目錄)到安裝anaconda 的Beginning-Machine-Learning文件夾中。然后,輸入以下命令:
./anaconda2/bin/python --version
您將看到使用Python 2版本的成功響應(yīng),如下所示:
恭喜!Python與其最重要的數(shù)據(jù)科學(xué)/機(jī)器學(xué)習(xí)包一起安裝。
安裝Core ML社區(qū)工具
coremltools一個(gè)開源的蘋果項(xiàng)目日后會(huì)使用到scikit學(xué)習(xí)模型轉(zhuǎn)化成可以在iOS應(yīng)用使用格式的一個(gè)工具。
python 沒有安裝 coremltools。
在終端中,從Beginning-Machine-Learning目錄運(yùn)行以下命令:
./anaconda2/bin/pip install -U coremltools
Jupyter Notebook
安裝好所有東西后,您就可以開始使用Jupyter Notebook; 將Jupyter Notebook當(dāng)作為類似 Swift Playgrounds 的 Python 版本。
在Beginning-Machine-Learning目錄中,在Terminal中輸入以下兩個(gè)命令:
mkdir notebooks
./anaconda2/bin/jupyter notebook notebooks
在這里,您首先創(chuàng)建了一個(gè)名為notebooks的新文件夾。然后,您從該新文件夾啟動(dòng)了Jupyter Notebook Server。
您的默認(rèn)瀏覽器應(yīng)該打開Jupyter Notebook頁面。如果沒有,您將在終端中看到頁面的URL,以便您可以手動(dòng)打開它; 看起來應(yīng)該是這樣的:http://localhost:8888/?token=7609a66aaffa819340a882f8ff88361db3f72667c07c764d。
現(xiàn)在您需要?jiǎng)?chuàng)建一個(gè)新Notebook。為此,請(qǐng)單擊 “New”,然后單擊 “Python 2”:
給新Notebook一個(gè)更好的名字。單擊 File,然后 Rename...,并將名稱更改為 Advertising:
單擊軟盤以保存更改。
注意:如果您在嘗試保存Notebook時(shí)遇到問題,請(qǐng)確保您沒有在頁面上運(yùn)行瀏覽器擴(kuò)展程序; 廣告攔截器之類的東西可能會(huì)導(dǎo)致問題。
Notebook很像Swift Playgrounds。您可以輸入Python表達(dá)式,然后按Control-Enter執(zhí)行它們并查看內(nèi)聯(lián)結(jié)果。
嘗試鍵入類似的內(nèi)容2 + 2并點(diǎn)擊Control-Enter以獲得結(jié)果。此外,嘗試使用Shift + Enter插入新單元格,以及執(zhí)行當(dāng)前單元格。
您還可以像在普通Python文件中一樣創(chuàng)建函數(shù)和類:
如果要進(jìn)一步了解界面,請(qǐng)通過選擇菜單欄中的“ 幫助”來查看“ 用戶界面 ”。
準(zhǔn)備就緒后,按住Shift鍵并單擊每個(gè)單元格左側(cè)的空白區(qū)域,然后使用dd快捷方式刪除您在獲取任何內(nèi)容時(shí)所創(chuàng)建的任何單元格。
使用干凈的Notebook,您已準(zhǔn)備好進(jìn)行下一步:創(chuàng)建線性回歸模型以預(yù)測(cè)廣告收入。
訓(xùn)練和驗(yàn)證線性回歸模型
下載此示例廣告數(shù)據(jù)并將csv文件放入您的notebooks文件夾中。
現(xiàn)在,在Notebook的第一個(gè)單元格中輸入以下代碼:
import pandas as pd
使用Shift-Enter運(yùn)行單元格。然后,將以下行添加到第二個(gè)單元格并運(yùn)行該單元格:
adver = pd.read_csv("Advertising.csv", usecols=[1, 2, 3, 4])
adver.head()
首先,您導(dǎo)入了[pandas](https://pandas.pydata.org/)庫(kù)。pandas是一個(gè)數(shù)據(jù)分析庫(kù),有許多工具可以導(dǎo)入,清理和轉(zhuǎn)換數(shù)據(jù)。
實(shí)際數(shù)據(jù)不像樣本廣告數(shù)據(jù)那樣隨時(shí)可用。您將使用pandas它來形成用作機(jī)器學(xué)習(xí)模型的輸入。在上面的代碼中,您使用它來導(dǎo)入csv文件并將其轉(zhuǎn)換為pandas 的格式 - 數(shù)據(jù)框,這是一種標(biāo)準(zhǔn)格式,大多數(shù)Python機(jī)器學(xué)習(xí)庫(kù)(包括scikit-learn)將接受作為輸入。
您應(yīng)該看到Notebook中數(shù)據(jù)的前幾行。每行代表一個(gè)數(shù)據(jù)點(diǎn):電視,廣播和報(bào)紙廣告花費(fèi)了多少,以及特定時(shí)期的銷售額。
首先,您需要從輸出列中分離出數(shù)據(jù)中的輸入列。按照慣例,這些被分別稱為X和y。在新單元格中輸入以下代碼并運(yùn)行它:
X, y = adver.iloc[:, :-1], adver.iloc[:, -1]
要正確訓(xùn)練和驗(yàn)證模型,您需要將數(shù)據(jù)拆分為兩組:
- 訓(xùn)練集:用于訓(xùn)練模型。這些樣本用作機(jī)器學(xué)習(xí)算法的輸入。
- 測(cè)試集:模型尚未見到,該集用于測(cè)試或驗(yàn)證模型。由于測(cè)試集的銷售已經(jīng)知道且獨(dú)立于訓(xùn)練集,因此測(cè)試集可用于獲得使用訓(xùn)練集訓(xùn)練模型的程度的分?jǐn)?shù)。
幸運(yùn)的是,scikit-learn提供了一個(gè)易于使用的功能,可以將數(shù)據(jù)分成訓(xùn)練和測(cè)試集。將以下內(nèi)容添加到Notebook中的第一個(gè)單元格中,在pandas導(dǎo)入下:
import sklearn.model_selection as ms
確保單元格具有焦點(diǎn),然后使用Control-Enter運(yùn)行它?,F(xiàn)在,在Notebook的末尾,將以下內(nèi)容鍵入新單元格并運(yùn)行該單元格:
X_train, X_test, y_train, y_test = ms.train_test_split(X, y, test_size=0.25, random_state=42)
該函數(shù)返回4個(gè)值:用于訓(xùn)練和測(cè)試的輸入,以及用于訓(xùn)練和測(cè)試的輸出。該函數(shù)采用以下參數(shù):
- X:我們從Advertisments.csv示例數(shù)據(jù)中讀取的輸入(支出金額)。
- y:來自樣本數(shù)據(jù)的輸出(銷售數(shù)量)。
- test_size:用于測(cè)試的數(shù)據(jù)百分比,通常設(shè)置為25%到40%之間。
- random_state:如果沒有輸入,該函數(shù)將隨機(jī)選擇用于列車和測(cè)試樣本的行。在生產(chǎn)中,這正是您想要的,但對(duì)于像這樣的開發(fā)和教程,獲得一致的結(jié)果非常重要,這樣您就可以知道出現(xiàn)問題時(shí)的位置。
在此處詳細(xì)了解該train_test_split功能。
現(xiàn)在,數(shù)據(jù)按照您希望的方式進(jìn)行拆分,現(xiàn)在是時(shí)候根據(jù)該數(shù)據(jù)創(chuàng)建和訓(xùn)練線性回歸模型了。
注意:查看這個(gè)精彩的教程,了解線性回歸的工作原理和原因。
在包含pandas和sklearn.model_selection導(dǎo)入的單元格中,附加以下導(dǎo)入并運(yùn)行單元格:
import sklearn.linear_model as lm
然后,在Notebook的底部,將以下行輸入新單元格并運(yùn)行它:
regr = lm.LinearRegression() # 1
regr.fit(X_train, y_train) # 2
regr.score(X_test, y_test) # 3
- 在這里,您將創(chuàng)建一個(gè)線性回歸模型對(duì)象(
regr)。 - 對(duì)于scikit-learn模型,該
fit方法始終訓(xùn)練模型,它接收訓(xùn)練輸入列和輸出列。 - 分?jǐn)?shù)決定了模型的優(yōu)秀程度。大多數(shù)scikit-learn模型都有一個(gè)將測(cè)試數(shù)據(jù)作為參數(shù)的分?jǐn)?shù)方法。在線性回歸的情況下,分?jǐn)?shù)可以讓您了解預(yù)測(cè)輸出與測(cè)試數(shù)據(jù)的實(shí)際輸出的接近程度。
你應(yīng)該看到得分為0.89。
現(xiàn)在,您可以使用線性回歸對(duì)象來預(yù)測(cè)新輸入值的銷售額。為此,請(qǐng)將以下內(nèi)容添加到另一個(gè)單元格中并運(yùn)行它:
X_new = [[ 50.0, 150.0, 150.0],
[250.0, 50.0, 50.0],
[100.0, 125.0, 125.0]]
regr.predict(X_new)
您應(yīng)該看到以下輸出:
array([ 34.15367536, 23.83792444, 31.57473763])
因此,如果您花費(fèi)5萬美元,15萬美元和15萬美元用于三個(gè)平臺(tái)的營(yíng)銷,您可以預(yù)期銷售34,150臺(tái)!
您用于訓(xùn)練線性回歸的三個(gè)步驟與絕大多數(shù)scikit-learn模型需要使用的步驟完全相同。
接下來,您將使用相同的三種方法來創(chuàng)建和訓(xùn)練支持向量機(jī)(SVM)模型。SVM是最流行的機(jī)器學(xué)習(xí)工具之一。因?yàn)樗鼈兪歉鼜?fù)雜的模型,所以需要更長(zhǎng)的時(shí)間才能正確訓(xùn)練和調(diào)整。
訓(xùn)練和驗(yàn)證支持向量機(jī)模型
將另一個(gè)導(dǎo)入添加到第一個(gè)單元格并重新運(yùn)行它:
import sklearn.svm as svm
然后,將以下每個(gè)代碼塊添加到單元格中并運(yùn)行它們:
svr = svm.LinearSVR(random_state=42)
svr.fit(X_train, y_train)
svr.score(X_test, y_test)
svr.predict(X_new)
您應(yīng)該看到0.867的分?jǐn)?shù)和一組新的預(yù)測(cè)。您將看到SVM預(yù)測(cè)相似,但完全不同。支持向量機(jī)以不同的方式工作,可能適合您的數(shù)據(jù),也可能不適合您的數(shù)據(jù)。機(jī)器學(xué)習(xí)中最難的部分之一是為該模型找到合適的模型和正確的參數(shù),以獲得最佳結(jié)果。
如果您想了解有關(guān)SVM的更多信息,請(qǐng)查看scikit-learn.org上的文檔。
將模型轉(zhuǎn)換為Apple的Core ML格式
建立模型后,就可以將其導(dǎo)出到Core ML了。您已coremltools在本教程的開頭安裝,因此請(qǐng)繼續(xù)將導(dǎo)入添加到第一個(gè)單元格中,并最后一次運(yùn)行:
import coremltools
現(xiàn)在,在Notebook的最后一個(gè)單元格中,輸入以下代碼并運(yùn)行它:
input_features = ["tv", "radio", "newspaper"]
output_feature = "sales"
model = coremltools.converters.sklearn.convert(regr, input_features, output_feature)
model.save("Advertising.mlmodel")
該coremltools.converters.sklearn.convert函數(shù)采用以下參數(shù):
- 要轉(zhuǎn)換的scikit-learn模型。
- Xcode將用于生成Swift類接口的輸入和輸出功能名稱。
最后,save()獲取導(dǎo)出的文件名。保存模型時(shí),應(yīng)確保使用.mlmodel擴(kuò)展名。
完成的Notebook看起來像這樣:
如果查看存儲(chǔ)Notebook的文件夾,您將看到名為Advertising.mlmodel的新文件。這是Core ML模型文件,您可以放入Xcode!你接下來會(huì)這樣做。
將Core ML模型集成到您的應(yīng)用程序中
回到之前構(gòu)建并運(yùn)行的入門項(xiàng)目,將Advertising.mlmodel從notebooks目錄拖到Xcode中的Project導(dǎo)航器中。
出現(xiàn)提示時(shí),選中“ 根據(jù)需要復(fù)制項(xiàng)目”,“ 創(chuàng)建組和廣告”框,然后單擊“ 完成”。將模型導(dǎo)入Xcode項(xiàng)目后,在Project導(dǎo)航器中單擊它,您將看到有關(guān)它的一些信息:
注意:如果您想知道為什么這個(gè)屏幕看起來有點(diǎn)乏味,那是因?yàn)槟趯?nèi)容轉(zhuǎn)換為.mlmodel時(shí)沒有添加任何其他元數(shù)據(jù)。如果要執(zhí)行此操作,請(qǐng)查看Model Interface文檔以查看可以提供的元數(shù)據(jù)。
片刻之后,您應(yīng)該看到自動(dòng)生成的Swift模型類。點(diǎn)擊上面的小箭頭將帶您進(jìn)入Xcode從中生成的界面.mlmodel。
打開ViewController.swift并在下面添加一個(gè)新屬性numberFormatter:
private let advertising = Advertising()
然后,向下滾動(dòng)到sliderValueChanged(_:),并替換以下行:
let sales = 0.0
使用以下代碼:
let input = AdvertisingInput(tv: tv, radio: radio, newspaper: newspaper)
guard let output = try? advertising.prediction(input: input) else {
return
}
let sales = output.sales
類似于scikit-learn的predict()方法,Core ML模型有一個(gè)prediction方法,它接受一個(gè)輸入結(jié)構(gòu)并返回一個(gè)輸出結(jié)構(gòu),這兩個(gè)結(jié)構(gòu)都是Xcode之前生成的。
構(gòu)建并運(yùn)行應(yīng)用程序。請(qǐng)注意每當(dāng)您更改其中一個(gè)輸入?yún)?shù)時(shí),銷售預(yù)測(cè)是如何更新的!
然后去哪兒?
您可以從此處下載完整的iOS應(yīng)用程序和Jupyter Notebook。
請(qǐng)務(wù)必查看scikit-learn文檔,特別是選擇正確估算器的流程圖。scikit-learn中的所有估算器都遵循相同的API,因此您可以嘗試許多不同的機(jī)器學(xué)習(xí)算法來找到最適合您的用例的算法。
如果您想了解有關(guān)其他ML庫(kù)的更多信息,請(qǐng)查看我們的Keras和Core ML入門機(jī)器學(xué)習(xí)教程。
另請(qǐng)參閱此Python數(shù)據(jù)科學(xué)手冊(cè),其中包含有關(guān)機(jī)器學(xué)習(xí)的部分以及更多算法。
















