Core ML框架詳細(xì)解析(十二) —— 用scikit-learn開始機器學(xué)習(xí)(一)

版本記錄

版本號 時間
V1.0 2018.10.16 星期二

前言

目前世界上科技界的所有大佬一致認(rèn)為人工智能是下一代科技革命,蘋果作為科技界的巨頭,當(dāng)然也會緊跟新的科技革命的步伐,其中ios API 就新出了一個框架Core ML。ML是Machine Learning的縮寫,也就是機器學(xué)習(xí),這正是現(xiàn)在很火的一個技術(shù),它也是人工智能最核心的內(nèi)容。感興趣的可以看我寫的下面幾篇。
1. Core ML框架詳細(xì)解析(一) —— Core ML基本概覽
2. Core ML框架詳細(xì)解析(二) —— 獲取模型并集成到APP中
3. Core ML框架詳細(xì)解析(三) —— 利用Vision和Core ML對圖像進(jìn)行分類
4. Core ML框架詳細(xì)解析(四) —— 將訓(xùn)練模型轉(zhuǎn)化為Core ML
5. Core ML框架詳細(xì)解析(五) —— 一個Core ML簡單示例(一)
6. Core ML框架詳細(xì)解析(六) —— 一個Core ML簡單示例(二)
7. Core ML框架詳細(xì)解析(七) —— 減少Core ML應(yīng)用程序的大?。ㄒ唬?/a>
8. Core ML框架詳細(xì)解析(八) —— 在用戶設(shè)備上下載和編譯模型(一)
9. Core ML框架詳細(xì)解析(九) —— 用一系列輸入進(jìn)行預(yù)測(一)
10. Core ML框架詳細(xì)解析(十) —— 集成自定義圖層(一)
11. Core ML框架詳細(xì)解析(十一) —— 創(chuàng)建自定義圖層(一)

開始

首先看一下寫作環(huán)境

Swift 4, iOS 11, Xcode 9

借助iOS 11,Apple發(fā)布了Core ML框架,允許您將經(jīng)過訓(xùn)練的機器學(xué)習(xí)模型集成到您的應(yīng)用程序中。 Apple提供了一種工具,可將許多模型格式轉(zhuǎn)換為.mlmodel格式。 但是,您如何創(chuàng)建和訓(xùn)練機器學(xué)習(xí)模型? 在本教程中,您將通過使用scikit-learn創(chuàng)建自己的機器學(xué)習(xí)模型,并通過Apple的Core ML框架將其集成到iOS應(yīng)用程序中。 在此過程中,您將學(xué)習(xí)如何:

  • 在macOS上安裝流行的Python機器學(xué)習(xí)包。
  • 創(chuàng)建預(yù)測機器學(xué)習(xí)模型。
  • 將這些模型集成到您自己的iOS應(yīng)用程序中。

打開準(zhǔn)備的工程,編譯并運行:

該應(yīng)用程序有3個滑塊,每個廣告預(yù)算一個:電視廣告,廣播廣告和報紙廣告。 在過去幾年中,您已經(jīng)記錄了廣告支出的金額(以數(shù)千美元計算)以及您的銷售額(以數(shù)千個單位顯示)。

現(xiàn)在,您希望構(gòu)建和訓(xùn)練機器學(xué)習(xí)模型,以幫助根據(jù)各種廣告預(yù)算方案預(yù)測您的銷售結(jié)果。 之后,您希望將模型方便地打包到iOS應(yīng)用程序中,以便您和您的團(tuán)隊可以即時檢查結(jié)果。

在本教程中,您將構(gòu)建此模型并使用Core ML將其集成到應(yīng)用程序中,以便在移動任何滑塊時,銷售預(yù)測將更新。

但首先,您需要安裝必要的Python工具。


Installing Anaconda - 安裝Anaconda

Anaconda是一個開源發(fā)行版。 它包含數(shù)千個預(yù)配置的軟件包,使用戶能夠使用Python中最流行的Data Science and Machine Learning工具快速啟動并運行。

在本教程中,您只會涉及Anaconda所提供的內(nèi)容,因此我建議您查看anaconda.org以了解有關(guān)它的更多信息。

要安裝Anaconda,請訪問他們的downloads area,然后下載Python 2.7版本;Apple的coremltools僅適用于Python 2。

下載后,運行安裝程序。 繼續(xù)閱讀Introduction,Read Me and License,直到進(jìn)入Destination Select步驟。 安裝Anaconda最簡單,最干凈的方法是進(jìn)入本地項目。 為此,請選擇在Install on a specific disk…,選擇正確的磁盤,單擊Choose Folder…,導(dǎo)航到您選擇的用戶目錄,然后創(chuàng)建一個名為Beginning-Machine-Learning的新文件夾。

注意:如果安裝程序跳過Destination Select步驟,請單擊Installation Type步驟上的Change Install Location…以返回該目標(biāo)。

選擇目標(biāo)后,單擊Continue,然后單擊Install,開始安裝過程。 這應(yīng)該需要大約10分鐘。

要驗證您的安裝,請打開終端并將cd(更改目錄)打開到安裝了anacondaBeginning-Machine-Learning文件夾中。 然后,輸入以下命令:

./anaconda2/bin/python --version

您將看到使用Python 2版本的成功響應(yīng),如下所示:

恭喜! Python與其最重要的data science/machine learning包一起安裝。


Installing Core ML Community Tools - 安裝Core ML通用工具

Anaconda不包含的一個工具是coremltools,這是Apple的一個Open Source,您稍后可以將scikit-learn模型轉(zhuǎn)換為可在iOS應(yīng)用中使用的格式。

在終端中,從Beginning-Machine-Learning目錄運行以下命令:

./anaconda2/bin/pip install -U coremltools

Jupyter Notebook

安裝好所有東西后,您就可以開始使用Jupyter Notebook;將Jupyter Notebook視為Swift Playgrounds,而不是Python。

Beginning-Machine-Learning目錄中,在Terminal中輸入以下兩個命令:

mkdir notebooks
./anaconda2/bin/jupyter notebook notebooks

在這里,您首先創(chuàng)建了一個名為notebooks的新文件夾。 然后,您從該新文件夾啟動了Jupyter Notebook Server。

您的默認(rèn)瀏覽器應(yīng)該打開Jupyter Notebook頁面。 如果沒有,您將在終端中看到頁面的URL,以便您可以手動打開它;它應(yīng)該看起來像這樣:http:// localhost:8888 /?token = 7609a66aaffa819340a882f8ff88361db3f72667c07c764d。

現(xiàn)在您需要創(chuàng)建一個新筆記本。 為此,請單擊New,然后單擊Python 2

給新筆記本一個更好的名字。 單擊File,然后Rename…,并將名稱更改為Advertising

單擊floppy disk以保存更改。

注意:如果您在嘗試保存筆記本時遇到問題,請確保您沒有在頁面上運行瀏覽器擴展程序;廣告攔截器之類的東西可能會導(dǎo)致問題。

筆記本很像Swift Playgrounds。 您可以輸入Python表達(dá)式,然后按Control-Enter執(zhí)行它們并查看內(nèi)聯(lián)結(jié)果。

嘗試輸入類似2 + 2的內(nèi)容并點擊Control-Enter以獲得結(jié)果。 此外,嘗試使用Shift + Enter插入新單元格,以及執(zhí)行當(dāng)前單元格。

您還可以像在普通Python文件中一樣創(chuàng)建函數(shù)和類:

如果要進(jìn)一步了解界面,請通過選擇菜單欄中的Help來查看User Interface Tour。

準(zhǔn)備就緒后,按住Shift鍵并單擊每個單元格左側(cè)的空白區(qū)域,然后使用dd快捷方式刪除您在獲取任何內(nèi)容時所創(chuàng)建的任何單元格。

使用干凈的notebook,您已準(zhǔn)備好進(jìn)行下一步:創(chuàng)建線性回歸模型以預(yù)測廣告收入。


Training and Validating a Linear Regression Model - 訓(xùn)練和驗證線性回歸模型

下載此示例廣告數(shù)據(jù)并將csv文件放入您的notebooks文件夾中。

現(xiàn)在,在筆記本的第一個單元格中輸入以下代碼:

import pandas as pd

使用Shift-Enter運行單元格。 然后,將以下行添加到第二個單元格并運行該單元格:

adver = pd.read_csv("Advertising.csv", usecols=[1, 2, 3, 4])
adver.head()

首先,您導(dǎo)入了pandas庫。 pandas是一個數(shù)據(jù)分析庫,包含許多用于導(dǎo)入,清理和轉(zhuǎn)換數(shù)據(jù)的工具。

實際數(shù)據(jù)不像樣本廣告數(shù)據(jù)那樣隨時可用。 您將使用pandas將其變形,以用作機器學(xué)習(xí)模型的輸入。 在上面的代碼中,您使用它來導(dǎo)入csv文件并將其轉(zhuǎn)換為pandas的格式 - 數(shù)據(jù)幀,這是一種標(biāo)準(zhǔn)格式,大多數(shù)Python機器學(xué)習(xí)庫(包括scikit-learn)將接受作為輸入。

您應(yīng)該看到筆記本中數(shù)據(jù)的前幾行。 每行代表一個數(shù)據(jù)點:電視,廣播和報紙廣告花費了多少,以及特定時期的銷售額。

首先,您需要從輸出列中分離出數(shù)據(jù)中的輸入列。 按照慣例,它們分別稱為Xy。 在新單元格中輸入以下代碼并運行它:

X, y = adver.iloc[:, :-1], adver.iloc[:, -1]

要正確訓(xùn)練和驗證模型,您需要將數(shù)據(jù)拆分為兩組:

  • Training set - 訓(xùn)練集:用于訓(xùn)練模型。 這些樣本用作機器學(xué)習(xí)算法的輸入。
  • Testing set - 測試集:模型尚未見到,該集用于測試或驗證模型。 由于測試集的銷售已經(jīng)知道且獨立于訓(xùn)練集,因此測試集可用于獲得使用訓(xùn)練集訓(xùn)練模型的程度的分?jǐn)?shù)。

幸運的是,scikit-learn提供了一個易于使用的功能,可以將數(shù)據(jù)分成訓(xùn)練和測試集。 將以下內(nèi)容添加到筆記本中的第一個單元格中,在pandas import下:

import sklearn.model_selection as ms

確保單元格具有焦點,然后使用Control-Enter運行它。 現(xiàn)在,在筆記本的末尾,將以下內(nèi)容鍵入新單元格并運行該單元格:

X_train, X_test, y_train, y_test = ms.train_test_split(X, y, test_size=0.25, random_state=42)

該函數(shù)返回4個值:用于訓(xùn)練和測試的輸入,以及用于訓(xùn)練和測試的輸出。該函數(shù)采用以下參數(shù):

  • X:我們從Advertisments.csv示例數(shù)據(jù)中讀取的輸入(支出金額)。
  • y:來自樣本數(shù)據(jù)的輸出(銷售數(shù)量)。
  • test_size:用于測試的數(shù)據(jù)百分比,通常設(shè)置為25%到40%之間。
  • random_state:如果沒有輸入,該函數(shù)將隨機選擇用于訓(xùn)練和測試樣本的行。在生產(chǎn)中,這正是您想要的,但對于像這樣的開發(fā)和教程,獲得一致的結(jié)果非常重要,這樣您就可以知道出現(xiàn)問題時的位置。

在此處了解有關(guān)train_test_split功能的更多信息,請點擊這里。

現(xiàn)在,數(shù)據(jù)按照您希望的方式進(jìn)行拆分,現(xiàn)在是時候根據(jù)該數(shù)據(jù)創(chuàng)建和訓(xùn)練線性回歸模型了。

注意:查看this wonderful tutorial精彩的教程,了解線性回歸的工作原理和原因。

在包含pandassklearn.model_selection導(dǎo)入的單元格中,附加以下導(dǎo)入并運行單元格:

import sklearn.linear_model as lm

然后,在筆記本的底部,將以下行輸入新單元格并運行它:

regr = lm.LinearRegression()  # 1
regr.fit(X_train, y_train)    # 2
regr.score(X_test, y_test)    # 3
  • 1) 在這里,您將創(chuàng)建一個線性回歸模型對象(regr)。
  • 2) 對于scikit-learn模型,fit方法總是訓(xùn)練模型,它接受訓(xùn)練輸入列和輸出列。
  • 3) 分?jǐn)?shù)決定了模型的優(yōu)秀程度。 大多數(shù)scikit-learn模型都有一個將測試數(shù)據(jù)作為參數(shù)的分?jǐn)?shù)方法。 在線性回歸的情況下,分?jǐn)?shù)可以讓您了解預(yù)測輸出與測試數(shù)據(jù)的實際輸出的接近程度。

你應(yīng)該看到得分為0.89。

現(xiàn)在,您可以使用線性回歸對象來預(yù)測新輸入值的銷售額。 為此,請將以下內(nèi)容添加到另一個單元格中并運行它:

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])

因此,如果您花費5萬美元,15萬美元和15萬美元用于三個平臺的營銷,您可以預(yù)期銷售34,150臺!

您用于訓(xùn)練線性回歸的三個步驟與絕大多數(shù)scikit-learn模型需要使用的步驟完全相同。

接下來,您將使用相同的三種方法來創(chuàng)建和訓(xùn)練支持向量機(SVM)模型。 SVM是最流行的機器學(xué)習(xí)工具之一。 因為它們是更復(fù)雜的模型,所以需要更長的時間才能正確訓(xùn)練和調(diào)整。


Training and Validating a Support Vector Machine Model - 訓(xùn)練和驗證支持向量機模型

將另一個import添加到第一個單元格并重新運行它:

import sklearn.svm as svm

然后,將以下每個代碼塊添加到單元格中并運行它們:

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ù)測。 您將看到SVM預(yù)測相似,但完全不同。 支持向量機以不同的方式工作,可能適合您的數(shù)據(jù),也可能不適合您的數(shù)據(jù)。 機器學(xué)習(xí)中最難的部分之一是為該模型找到合適的模型和正確的參數(shù),以獲得最佳結(jié)果。

如果您想了解有關(guān)SVM的更多信息,請查看 scikit-learn.org上的文檔。


Converting the Model to Apple’s Core ML Format - 將模型轉(zhuǎn)換為Apple的Core ML格式

建立模型后,就可以將其導(dǎo)出到Core ML了。 您在本教程的開頭安裝了coremltools,因此請繼續(xù)將導(dǎo)入添加到第一個單元格中,并最后一次運行:

import coremltools

現(xià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)出的文件名。 保存模型時,應(yīng)確保使用.mlmodel擴展名。

完成的筆記本看起來像這樣:

如果查看存儲筆記本的文件夾,您將看到名為Advertising.mlmodel的新文件。 這是Core ML模型文件,您可以放入Xcode! 你接下來會這樣做。


Integrating the Core ML Model into Your App - 將Core ML模型集成到您的應(yīng)用程序中

回到之前構(gòu)建并運行的入門項目,將Advertising.mlmodelnotebooks目錄拖到Xcode中的Project導(dǎo)航器中。

出現(xiàn)提示時,選中Copy items if needed,Create groupsAdvertising,然后單擊Finish。 將模型導(dǎo)入Xcode項目后,在Project導(dǎo)航器中單擊它,您將看到有關(guān)它的一些信息:

注意:如果您想知道為什么這個屏幕看起來有點乏味,那是因為在將內(nèi)容轉(zhuǎn)換為.mlmodel時沒有添加任何額外的元數(shù)據(jù)。 如果要執(zhí)行此操作,請查看Model Interface文檔以查看可以提供的元數(shù)據(jù)。

片刻之后,您應(yīng)該看到Automatically generated Swift model class。 點擊上面的小箭頭將帶您進(jìn)入Xcode從.mlmodel生成的界面。

打開ViewController.swift并在numberFormatter下添加一個新屬性:

private let advertising = Advertising()

然后,向下滾動到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-learnpredict()方法,Core ML模型有一個prediction方法,它接受一個輸入結(jié)構(gòu)并返回一個輸出結(jié)構(gòu),這兩個結(jié)構(gòu)都是Xcode之前生成的。

構(gòu)建并運行應(yīng)用程序。 請注意每當(dāng)您更改其中一個輸入?yún)?shù)時,銷售預(yù)測是如何更新的!

請務(wù)必查看the scikit-learn documentation,特別是 the flowchart to choose the right estimatorscikit-learn中的所有估算器都遵循相同的API,因此您可以嘗試許多不同的機器學(xué)習(xí)算法來找到最適合您的用例的算法。

另請參閱此Python Data Science Handbook,其中包含有關(guān)機器學(xué)習(xí)的部分以及更多算法。


源碼

1. Swift

首先看一下文檔結(jié)構(gòu)

看一下sb中的內(nèi)容

1. ViewController.swift
import UIKit

final class ViewController: UIViewController {
  @IBOutlet private var tvSlider: UISlider!
  @IBOutlet private var radioSlider: UISlider!
  @IBOutlet private var newspaperSlider: UISlider!
  @IBOutlet private var tvLabel: UILabel!
  @IBOutlet private var radioLabel: UILabel!
  @IBOutlet private var newspaperLabel: UILabel!
  @IBOutlet private var salesLabel: UILabel!
  private let numberFormatter = NumberFormatter()
  private let advertising = Advertising()
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    numberFormatter.numberStyle = .decimal
    numberFormatter.maximumFractionDigits = 1
    
    sliderValueChanged()
  }
  
  @IBAction func sliderValueChanged(_ sender: UISlider? = nil) {
    let tv = Double(tvSlider.value)
    let radio = Double(radioSlider.value)
    let newspaper = Double(newspaperSlider.value)
    
    let input = AdvertisingInput(tv: tv, radio: radio, newspaper: newspaper)

    guard let output = try? advertising.prediction(input: input) else {
      return
    }

    let sales = output.sales
    
    tvLabel.text = numberFormatter.string(from: tv as NSNumber)
    radioLabel.text = numberFormatter.string(from: radio as NSNumber)
    newspaperLabel.text = numberFormatter.string(from: newspaper as NSNumber)
    salesLabel.text = numberFormatter.string(from: sales as NSNumber)
  }
}

后記

本篇主要講述了用scikit-learn開始機器學(xué)習(xí),感興趣的給個贊或者關(guān)注~~~

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

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

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