Core ML框架詳細解析(十五) —— 機器學(xué)習(xí):分類(一)

版本記錄

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

前言

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

開始

在機器學(xué)習(xí)中,分類是在給定一些輸入標記數(shù)據(jù)集的情況下從有限數(shù)量的類中預(yù)測對象類的任務(wù)。 在本教程中,您將學(xué)習(xí)如何預(yù)處理訓(xùn)練數(shù)據(jù),評估分類器并對其進行優(yōu)化。

在機器學(xué)習(xí)中,分類是在給定一些輸入標記數(shù)據(jù)集的情況下從有限數(shù)量的類中預(yù)測對象類的任務(wù)。 例如,您可能有一個包含10,000封電子郵件的列表,并且需要確定它們是否是垃圾郵件。 您可以在此輸入數(shù)據(jù)上訓(xùn)練分類器,并且能夠預(yù)測新電子郵件是否是垃圾郵件。 另一個經(jīng)典的例子是一個分類器,它可以從已知類的列表中預(yù)測圖像中描繪的對象,例如房屋,汽車,貓等。

在本教程中,您將學(xué)習(xí)如何:

  • 預(yù)處理和準備數(shù)據(jù)以提供給機器學(xué)習(xí)分類算法。
  • 根據(jù)最常用的分類指標評估分類器。
  • 優(yōu)化機器學(xué)習(xí)分類器的參數(shù)。

注意:本教程要求使用Jupyter Notebook和幾個用于機器學(xué)習(xí)訓(xùn)練的Python科學(xué)庫。具體如何配置不多說了,前面幾篇都有所涉及。

打開已有工程,將兩個ipynb文件復(fù)制到Jupyter Notebooks文件夾。 然后,用Jupyter打開Starter.ipynb

Jupyter的頂部菜單中,選擇Kernel,然后選擇Restart&Run All

如果提示Restart kernel and re-run the whole notebook,請選擇Restart and Run All Cells。

底部單元格包含用于下載名為credit的數(shù)據(jù)集的代碼。 此數(shù)據(jù)集包含400行,其中每行包含一些與人相關(guān)的信用相關(guān)信息以及一些個人詳細信息,如年齡和學(xué)生狀態(tài)。 您可以在筆記本中看到前5行。

您在此項目中的目標是使用此數(shù)據(jù)集創(chuàng)建分類器,以使用盡可能少的個人信息來預(yù)測用戶是否具有信譽。 您將信譽良好的人定義為信用評分(評分)超過600的人。


Preprocessing and Selecting Features - 預(yù)處理和選擇功能

任何機器學(xué)習(xí)項目的第一步是清理數(shù)據(jù)或?qū)?shù)據(jù)轉(zhuǎn)換為機器學(xué)習(xí)算法可以使用的格式。 在大多數(shù)情況下,您需要數(shù)字數(shù)據(jù)而沒有任何缺失值或異常值,否則可能會使訓(xùn)練模型更加困難。

對于信用數(shù)據(jù)集,值已經(jīng)非常清理,但您仍需要將數(shù)據(jù)轉(zhuǎn)換為數(shù)值。

1. Encoding Labels - 編碼標簽

最簡單的預(yù)處理步驟之一稱為標簽編碼(label encoding)。 它允許您將非數(shù)字值轉(zhuǎn)換為數(shù)值。 您將使用它來轉(zhuǎn)換StudentMarriedGender列。

將以下代碼添加到下面的新單元格中,您的代碼在此處:

# 1
credit_ = credit.copy()

# 2
credit_["Student"] = credit["Student"].map(lambda student: 1 if student == "Yes" else 0)

credit_["Married"] = credit["Married"].map(lambda married: 1 if married == "Yes" else 0)

# 3
credit_["Female"] = credit["Gender"].map(lambda gender: 1 if gender == "Female" else 0)
credit_.drop("Gender", axis=1, inplace=True)

# 4
credit_.head()

下面進行細分:

  • 1) 您可以復(fù)制信用數(shù)據(jù)集,以便能夠干凈地轉(zhuǎn)換數(shù)據(jù)集。 credit_將在處理完成后保留即用數(shù)據(jù)。
  • 2) 對于StudentMarried,您標記編碼YES是1,NO為0。
  • 3) 在這里,您還可以對Gender字段執(zhí)行相同操作,同時將列重命名為Female。 您也可以在之后刪除Gender列。
  • 4) 在單元格的末尾,顯示數(shù)據(jù)的頂行以驗證處理步驟是否成功。

Control + Enter運行您的代碼。 它應(yīng)該類似于以下內(nèi)容:

到現(xiàn)在為止還挺好! 您可能正在考慮對Eye Color列執(zhí)行相同操作。 此列包含三個值:綠色,藍色和淡褐色。 您可以分別用0,1和2替換這些值。

大多數(shù)機器學(xué)習(xí)算法會誤解這些信息。 像邏輯回歸這樣的算法會得知值為2的Eye Color將具有比1更強的效果。更好的方法是使用單熱編碼。

2. One-Hot Encoding - 單熱編碼

使用單熱編碼(one-hot encoding)(也稱為Dummy Variables)時,可以創(chuàng)建與不同值一樣多的列。 然后每列變?yōu)?或1,具體取決于該行的原始值是否等于新列。 例如,如果行的值為藍色,則在單熱編碼數(shù)據(jù)中,藍色列將為1,則綠色和黑色列都將為0。

為了更好地顯示此內(nèi)容,請通過從頂部菜單中選擇Insert ? Insert Cell Below來創(chuàng)建新單元格,并將以下代碼添加到新單元格:

pd.get_dummies(credit_["Eye Color"])

get_dummies將根據(jù)Eye Color中觀察到的值創(chuàng)建虛擬變量。 運行單元格檢查出來:

因為數(shù)據(jù)集中的第一個條目有淡褐色(hazel)眼睛,所以此處的第一個結(jié)果在Hazel中包含1,在藍色和綠色中包含0。 其余399個條目的工作方式相同!

轉(zhuǎn)到Edit ? Delete Cells以刪除最后一個單元格。 接下來,在最新單元格中的credit_.head()之前添加以下行:

eye_color = pd.get_dummies(credit["Eye Color"], drop_first=True)
credit_ = pd.concat([credit_.drop("Eye Color", axis=1), eye_color], axis=1)

在第一行中,您使用drop_first = True來丟棄第一個虛擬列,為Eye Color創(chuàng)建虛擬列。 這樣做是為了節(jié)省空間,因為可以從其他兩個值推斷出最后一個值。

然后,使用concat將虛擬列連接到最后的數(shù)據(jù)。 再次運行單元格并查看結(jié)果!

3. Target Label - 目標標簽

對于預(yù)處理的最后一步,您將創(chuàng)建目標標簽。 這將是您的分類器將預(yù)測的列 - 在這種情況下,該人是否具有信譽。

對于大于600的Rating,標簽將為1(信譽良好)。 否則,將其設(shè)置為0。將以下代碼再次添加到credit_.head()之前的當(dāng)前單元格中:

credit_["Creditworthy"] = credit["Rating"].map(lambda val: 0 if val < 600 else 1)
credit_.drop("Rating", axis=1, inplace=True)

最后一列將是您的分類器將使用其他列的組合預(yù)測的列。

最后一次運行此單元格。 預(yù)處理現(xiàn)已完成,您的數(shù)據(jù)幀已準備好進行訓(xùn)練!


Training and Cross Validation - 訓(xùn)練和交叉驗證

現(xiàn)在數(shù)據(jù)準備就緒,您可以創(chuàng)建分類器并對其進行訓(xùn)練。 將以下代碼添加到新單元格:

X = credit_[["Age", "Education", "Student", "Married"]]
y = credit_["Creditworthy"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=RANDOM_STATE)

您正在選擇要訓(xùn)練模型的四個要素,并將它們存儲在X中,Credworthy列是您的目標,名為y。

在最后一行中,您將數(shù)據(jù)集拆分為兩個隨機的一半,一個用于訓(xùn)練分類器的訓(xùn)練集,以及一個用于驗證分類器以查看其執(zhí)行情況的測試集。

接下來,將以下代碼添加到新單元格:

estimator = LogisticRegression(random_state=RANDOM_STATE)  # 1
estimator.fit(X_train, y_train)  # 2

y_true = y_test  # 3
y_pred = estimator.predict(X_test)  # 4
y_score = estimator.predict_proba(X_test)[:, 0]  # 5

這里有很多事情要做:

  • 1) 您使用邏輯回歸作為分類器。其背后的細節(jié)超出了本教程的范圍。您可以在this wonderful picture guide中了解更多相關(guān)信息。
  • 2) 您訓(xùn)練 - 或“fit” - 數(shù)據(jù)集訓(xùn)練部分的分類器。
  • 3) y_true將保存y列的真實值,即信譽值。在這種情況下,它只是測試值本身。
  • 4) y_pred保持預(yù)測的信譽新值。您將使用此值以及真值來評估分類器的性能。請注意,此評估是使用測試集完成的,因為分類器還沒有“看到”這些,并且目標是預(yù)測未知值。否則,你可能只是記住了訓(xùn)練值并且每次都正確地預(yù)測了一切。
  • 5) 邏輯回歸是一種實際預(yù)測概率的分類算法。該模型的輸出類似于:“具有給定值的人具有信譽的概率為75%?!蹦梢允褂眠@些概率分數(shù)來評估分類器的更高級度量。

您已經(jīng)成功訓(xùn)練了分類器并用它來預(yù)測概率!接下來,你會發(fā)現(xiàn)你的表現(xiàn)如何。

1. Accuracy - 準確性

檢查模型準確性的最簡單指標之一是模型的準確性。分類器可以正確預(yù)測的值的百分比是多少?

將此行添加到新單元格:

accuracy_score(y_true=y_true, y_pred=y_pred)

accuracy_score將您的y列設(shè)為true和預(yù)測值,并返回準確度。 運行單元格并檢查結(jié)果:

差不多95%! 你是否真的只用一個人的年齡,教育,學(xué)生和婚姻狀況來做得那么好?

事實證明,在測試數(shù)據(jù)集中的200行中,只有11行是有信譽的。 這意味著始終預(yù)測該行不具有信譽的分類器也具有約95%的準確度!

因此,你的分類器預(yù)測的95%不是那么好 - 或?qū)嶋H上有任何好處。 準確性雖然在不同類別平衡時通常很有用,但如果沒有上下文可能會非常誤導(dǎo)。 一個更好的度量標準或一系列度量標準,以及您應(yīng)該始終關(guān)注的標準,是混淆矩陣(confusion matrix)

2. Understanding Confusion Matrix, Precision and Recall - 了解混淆矩陣,精度和回調(diào)

混淆矩陣將真實值與預(yù)測值進行對比。 精確度和回調(diào)是從混淆矩陣派生的兩個非常有用的度量。 在數(shù)據(jù)集的上下文中,指標回答以下問題:

  • Precision - 精確度:在所有信譽良好的人中,有多少百分比被正確預(yù)測為信譽良好?
  • Recall - 回調(diào):在預(yù)計信譽良好的所有人中,有多少人實際上是有信譽的?

當(dāng)您看到數(shù)據(jù)時,這將變得更加清晰,因此是時候添加一些代碼了。 為以下每個代碼塊創(chuàng)建新單元格并運行它們(不要擔(dān)心警告):

confusion_matrix(y_true=y_true, y_pred=y_pred)
precision_score(y_true=y_true, y_pred=y_pred)
recall_score(y_true=y_true, y_pred=y_pred)
plot_confusion_matrix(cm=confusion_matrix(y_true=y_true, y_pred=y_pred),
                      class_names=["not creditworthy", "creditworthy"])

在第一個單元格中,confusion_matrix將真實值與預(yù)測值進行對比。輸出多維數(shù)組中的每個象限表示true valuepredicted value的組合。例如,右上角是不具有信譽且行分類器正確預(yù)測不具有信譽的行數(shù)。

最后一個單元包括對此的可視化,其中每個象限也除以總行數(shù)。您可以看到您當(dāng)前的分類器實際上正在執(zhí)行您所擔(dān)心的操作:它只是預(yù)測所有行都不值得信任。

在中間,您將看到precision_scorerecall_score的計算結(jié)果。這兩個指標的范圍從0(0%)1(100%)。你離1越近越好。這兩個指標之間總是存在權(quán)衡。

例如,如果您對信用檢查沒有那么嚴格,并且讓一些有問題的人通過,您會提高您的精確度,但您的recall會受到影響。另一方面,如果你非常嚴格,你的recall可能是無可挑剔的,但你不會向許多有信譽的人發(fā)放信用,你的精確度會受到影響。您需要準確權(quán)衡取決于您的使用情況。

您的精度和recall都是0,表明分類器目前非常糟糕。返回到設(shè)置Xy的單元格,并將X更改為以下內(nèi)容:

X = credit_[["Income", "Education", "Student", "Married"]]

您現(xiàn)在使用Income值作為訓(xùn)練的一部分。 轉(zhuǎn)至Kernel ? Restart & Run All運行以重新運行所有單元格。

精度提高到0.64,recall到0.81! 這表明您的分類器實際上具有一定的預(yù)測能力。 現(xiàn)在你到了某個地方。

3. Parameter tuning and pipelines - 參數(shù)調(diào)整和管道

The logistic regression class有一些參數(shù),您可以設(shè)置這些參數(shù)以進一步改進分類器。 兩個有用的是penaltyC。

但是你應(yīng)該設(shè)置哪些值? 實際上,為什么不嘗試所有這些并看看哪些有效?

在估算單元格中,替換:

estimator = LogisticRegression(random_state=RANDOM_STATE)
estimator.fit(X_train, y_train)

使用下面的

param_grid = dict(C=np.logspace(-5, 5, 11), penalty=['l1', 'l2'])
regr = LogisticRegression(random_state=RANDOM_STATE)
cv = GridSearchCV(estimator=regr, param_grid=param_grid, scoring='average_precision')
cv.fit(X_train, y_train)
estimator = cv.best_estimator_

在這里,您可以在0.00001100000之間進行詳盡的搜索,而不是使用C為1.0和penaltyl2的默認邏輯回歸,以查看哪個在分類器中產(chǎn)生更好的精度。

此網(wǎng)格搜索還完成另一項非常重要的任務(wù):它在您的測試集上執(zhí)行交叉驗證。 在這樣做時,它將測試集分成較小的子集,并且連續(xù)地從訓(xùn)練/評估中留下一個子集。 然后它評估分類器的精度,它選擇的最終參數(shù)是在所有這些子集中產(chǎn)生最佳平均精度的參數(shù)。 通過這種方式,您可以更加確信您的分類器非常強大,并且在用于評估沒使用過的新數(shù)據(jù)時會產(chǎn)生類似的結(jié)果。

轉(zhuǎn)到Kernel ? Restart & Run All,再次運行所有單元格。

你會發(fā)現(xiàn)精度實際下降到56%。 它失敗的原因是它并不是真正的apples-to-apples比較,你上次可能會幸運。 您看到的新精度將更接近您在“in the wild”所期望的精度。

4. Scaling - 縮放

你的分類器現(xiàn)在已經(jīng)相當(dāng)不錯了,但你仍然可以提高56%左右的精度。 您總是希望做的一件事是將數(shù)據(jù)集擴展到0到1的范圍內(nèi)。當(dāng)數(shù)據(jù)集具有不同比例值的列時,大多數(shù)分類算法都會表現(xiàn)不佳。 在這種情況下,教育范圍從0到50,收入可以是從0到幾乎無限制的任何地方。

用以下內(nèi)容替換整個估算器單元:

scaler = StandardScaler()  # 1
param_grid = dict(C=np.logspace(-5, 5, 11), penalty=['l1', 'l2'])
regr = LogisticRegression(random_state=RANDOM_STATE)
cv = GridSearchCV(estimator=regr, param_grid=param_grid, scoring='average_precision')
pipeline = make_pipeline(scaler, cv)  # 2

pipeline.fit(X_train, y_train)

# 3
y_true = y_test
y_pred = pipeline.predict(X_test)
y_score = pipeline.predict_proba(X_test)[:, 1]

下面進行細分:

  • 1) 您可以創(chuàng)建標準縮放器。
  • 2) 您創(chuàng)建一個管道對象,首先縮放數(shù)據(jù),然后將其提供給網(wǎng)格搜索。
  • 3) 您可以像使用估算器一樣使用管道。 您可以對其調(diào)用fitpredict,默認情況下它甚至?xí)褂镁W(wǎng)格搜索的最佳估算器。

再次運行所有指標單元格。 精度提高到72%!

5. ROC

在結(jié)束分類器之前,您應(yīng)該總是看一個指標:ROC AUC。它與混淆矩陣密切相關(guān),但也包含預(yù)測的概率 - 或分類器的分數(shù)。它的范圍從01,其中越高越好。

直觀地說,它衡量的是得分預(yù)測比隨機好多少。

它通過在各種閾值處切斷概率分數(shù)并將其向下舍入以進行預(yù)測來實現(xiàn)此目的。然后繪制真實的正面率 - 實際信譽良好的預(yù)測信譽人群的比率,或者僅僅是從上面recall - 與錯誤的比率,即實際上沒有信譽的預(yù)測為有信譽度人的比率。該圖稱為ROC(接收器工作特性),ROC AUC(曲線下面積)就是該曲線下的面積!

將以下代碼塊添加到筆記本的底部,分成兩個新單元格,然后再次運行單元格:

roc_auc_score(y_true=y_true, y_score=y_score)
plot_roc_curve(y_true=y_true, y_score=y_score)

ROC0.98表示您的預(yù)測非常好!

本教程為您提供了一些在處理自己的分類問題時會遇到的最常用的策略。

后記

本篇主要講述了機器學(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)容