用scikit-learn開始機(jī)器學(xué)習(xí)

原文: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
image

借助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ù)中的輸入列。按照慣例,這些被分別稱為Xy。在新單元格中輸入以下代碼并運(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ù):

  1. X:我們從Advertisments.csv示例數(shù)據(jù)中讀取的輸入(支出金額)。
  2. y:來自樣本數(shù)據(jù)的輸出(銷售數(shù)量)。
  3. test_size:用于測(cè)試的數(shù)據(jù)百分比,通常設(shè)置為25%到40%之間。
  4. 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è)精彩的教程,了解線性回歸的工作原理和原因。

在包含pandassklearn.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

  1. 在這里,您將創(chuàng)建一個(gè)線性回歸模型對(duì)象(regr)。
  2. 對(duì)于scikit-learn模型,該fit方法始終訓(xùn)練模型,它接收訓(xùn)練輸入列和輸出列。
  3. 分?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ù):

  1. 要轉(zhuǎn)換的scikit-learn模型。
  2. 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.mlmodelnotebooks目錄拖到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í)的部分以及更多算法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容