Skip to content

Latest commit

 

History

History
340 lines (212 loc) · 12.2 KB

機器學習基礎.md

File metadata and controls

340 lines (212 loc) · 12.2 KB

機器學習基礎

Agenda

Note

概述

1

  • Problem: 現實中機器學習所要解決的問題。
  • Tools: 機器學習的算法(線性迴歸,邏輯回歸,svm,神經網路..等等)。
  • Mesurement Tools: 來評估用哪個tool解決問題最有效率。

本章重點就是學習如何使用 Mesurement Tools。

統計學知識複習

  • 居中趋势测量:均值、中值、众数。
  • 数据的离散性:四分位距法、异常值、标准偏差、贝塞尔修正。

pandas加載數據

numpy數組

在sklearn中訓練模型

from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.svm import SVC

classifier = LogisticRegression() # 逻辑回归
classifier = MLPClassifier() # 神经网络
classifier = GradientBoostingClassifier() # 决策树
classifier = SVC() # 支持向量机

classifier.fit(X,y) # 進行模型訓練

手動調整參數

  • 例子,SVM模型有下列參數
  • kernel: linear (线性), poly(多项式), rbf(高斯核)
  • degree(整型):多项式内核的次数(如果选择了多项式内核)
  • gamma (浮点型):γ 参数
  • C(浮点型):C 参数
from sklearn.svm import SVC

classifier = SVC(kernel = 'poly', degree = 2) # 手動進行參數調整
classifier.fit(X,y) # 進行模型訓練

自動調整參數

  • 如何選擇正確的算法與參數。
  • 如何評估訓練好的模型好壞。

測試模型

2

  • 利用train_test_split將資料分成訓練跟測試兩組。

3

黃金準則:千萬不能把測試資料拿去訓練模型 !!!

混淆矩陣

4

  • True Positive: 有生病,且被診斷出來有生病。
  • True Negative: 沒有生病,且被診斷出來沒有生病。
  • False Postive: 沒有生病,但被診斷出來有生病。
  • False Negative: 有生病,但被診斷出來沒有生病。

準確率

5

  • 在所有就診中,我們正確的分類有多少?
  • 可以利用sklearn中的accurany_score進行計算。

準確率不適用的情況

6

  • 對於這種極度偏斜的數據,準確率就不適用了。

假負例與假正例

  • 在不同情況下,我們會注意不同的假負例與假正例

7

  • 在醫療例子下,會強調False Negative,因為比較不希望沒有診斷出生病的人。

8

  • 在拉圾郵件例子下,會強調False Positive,因為比較不希望把非拉圾郵件給丟掉。

精度

9

  • 精度: 當模型診斷出是病人時,真的是病人有多少?

10

  • 精度: 當模型判斷出是拉圾郵件時,真的是拉圾郵件有多少?

招回率

11

  • 招回率: 在所有病人中,真的被模型診斷出是病人有多少?

12

  • 招回率: 在所有拉圾郵件中,真的被模型判斷出是拉圾郵件有多少?

F-1得分

13

  • 如何用一個數字,就可以代替精度和招回率兩種指標呢?

14

  • F1 Score: 也是一種平均的概念,但一般來說會小於真的平均數。
  • 调和平均数,强调了较小值的重要性;在机器学习中。召回率为R, 准确率为P。使用他们对算法的评估,这两个值通常情况下相互制约。为了更加方便的评价算法的好坏。于是引入了F1值。F1为准确率P和召回率R的调和平均数。为什么F1使用调和平均数,而不是数字平均数。举个例子:当R 接近于1, P 接近于 0 时。采用调和平均数的F1值接近于0;而如果采用算数平均数F1的值为0.5;显然采用调和平均数能更好的评估算法的性能。等效于评价R和P的整体效果

F-B得分

15

  • F-B Score: 可以讓我們更彈性去根據模型的需求給予分數,強調精度或招回率。

16

  • 寄送免费样品是需要成本,所以我們希望在所有被寄出的客人中,真的會喜歡這樣品的客人數越多越好。

17

ROC曲線

Receiver Operating Characteristic

18

19

  • 如果模型是可以把資料進行很好的"Good split",計算橫軸上不同切點上的True positive rate跟False positive rate。

20

  • ROC的X軸: False positive rate。
  • ROC的Y軸: True positive rate。

21

  • 結論: 當模型的ROC下的面積越接近1,表現越好。

回歸指標

評估回歸模型的指標。

22

  • 平均絕對誤差。
  • 絕對值函數是無法微分,不利於梯度下降的計算。

23

  • 均方誤差。

24

  • R2 score。
  • 將模型與最簡單的可能模型相比得出。
  • 最簡單的可能模型(分母的圖): 計算所有點的平均,畫出這條平均水平線。
  • 理論上,這個最簡單的可能模型均方誤差要大於我們模型的均方誤差。
  • R2 = 0,表示分子跟分母相近,也就是模型表現並不好(基本上,就是算平均而已)。
  • R2 = 1,表示分母遠大於分子,也就是模型表現的越好。

錯誤類型

25

  • underfitting: 拿蒼蠅拍打哥吉拉(太低估哥吉拉)
  • overfitting: 拿衝鋒槍打蒼蠅(太高估蒼蠅)

26

  • underfitting: training set和test set表現都很糟糕。
  • overfitting: trainig set表現很好但test set表現很糟糕。

模型複雜度圖表

Model complexity graph

27

  • Linear Model: 在training set跟test set都分錯3個點。(underfitting)
  • Quadratic Model: 在training set跟test set都分錯1個點。
  • Polynomial Mode: 在trainig set沒分錯,但在test set卻分錯2個點。(overfitting)

30

  • gerneal model complexity graph

28

黃金準則:千萬不能把測試資料拿去訓練模型 !!!

  • 解決方式: 就是交叉驗證。

交叉驗證

29

  • 將資料從2份拆分成3份。

K-Fold Cross Validation

31

  • 將training data和test data個拆分成K堆。
  • 每次訓練都從K堆挑出一組training data和test data,這樣可進行K次訓練。
  • 最後再將K次訓練的結果進行平均。

32

  • 如何利用sklearn進行K-Fold Cross Validation。

學習曲線

Learning curve

33

  • 隨著測試數據的增多,來觀察模型的學習變化進而判斷模型的狀況(overfiiting, underfitting, good)。
  • High bias(underfitting): 隨著測試數據的增多,但CV error跟Training error一直很高,降不下來。
  • High variance(overfitting): 隨著測試數據的增多,Training error一直很低,但CV error還是很高,兩者之間有很大的gap。

網格搜索

34

  • SVM model訓練,有兩組超參數。
  • 兩組超參數利用grid table,生成不同配對後,分別利用training set進行訓練。
  • 將訓練好的model,再利用cross validation set,分別計算F1 score。
  • 最後,將分數最高的model,再利用test test進行測試。

在sklearn中進行網格搜索

from sklearn.metrics import make_scorer
from sklearn.model_selection import GridSearchCV

clf = DecisionTreeClassifier(random_state=42)

# 定义一些参数来执行网格搜索。使用max_depth, min_samples_leaf, 和 min_samples_split
parameters = {'max_depth':[2,4,6,8,10],'min_samples_leaf':[2,4,6,8,10], 'min_samples_split':[2,4,6,8,10]}

# 使用f1_score,为模型制作记分器
scorer = make_scorer(f1_score)

# 使用参数和记分器,在分类器上执行网格搜索。
grid_obj = GridSearchCV(clf, parameters, scoring=scorer)

# 将数据拟合到新的分类器中
grid_fit = grid_obj.fit(X_train, y_train)

# 找到最佳參數組合的分類器
best_clf = grid_fit.best_estimator_

# 将数据拟合到最佳的分类器中.
best_clf.fit(X_train, y_train)

# 將這最佳的分类器,再利用test test進行測試.
best_train_predictions = best_clf.predict(X_train)
best_test_predictions = best_clf.predict(X_test)

# 計算最佳的分类器在trainig跟testing的f1_score.
print('The training F1 Score is', f1_score(best_train_predictions, y_train))
print('The testing F1 Score is', f1_score(best_test_predictions, y_test))

# Plot the new model.
plot_model(X, y, best_clf)

# Let's also explore what parameters ended up being used in the new model.
best_clf