-
訓練與測試模型
-
評估指標
-
模型選擇
- Problem: 現實中機器學習所要解決的問題。
- Tools: 機器學習的算法(線性迴歸,邏輯回歸,svm,神經網路..等等)。
- Mesurement Tools: 來評估用哪個tool解決問題最有效率。
本章重點就是學習如何使用 Mesurement Tools。
- 居中趋势测量:均值、中值、众数。
- 数据的离散性:四分位距法、异常值、标准偏差、贝塞尔修正。
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) # 進行模型訓練
- 如何選擇正確的算法與參數。
- 如何評估訓練好的模型好壞。
- 利用train_test_split將資料分成訓練跟測試兩組。
黃金準則:千萬不能把測試資料拿去訓練模型 !!!
- True Positive: 有生病,且被診斷出來有生病。
- True Negative: 沒有生病,且被診斷出來沒有生病。
- False Postive: 沒有生病,但被診斷出來有生病。
- False Negative: 有生病,但被診斷出來沒有生病。
- 在所有就診中,我們正確的分類有多少?
- 可以利用sklearn中的accurany_score進行計算。
- 對於這種極度偏斜的數據,準確率就不適用了。
- 在不同情況下,我們會注意不同的假負例與假正例
- 在醫療例子下,會強調False Negative,因為比較不希望沒有診斷出生病的人。
- 在拉圾郵件例子下,會強調False Positive,因為比較不希望把非拉圾郵件給丟掉。
- 精度: 當模型診斷出是病人時,真的是病人有多少?
- 精度: 當模型判斷出是拉圾郵件時,真的是拉圾郵件有多少?
- 招回率: 在所有病人中,真的被模型診斷出是病人有多少?
- 招回率: 在所有拉圾郵件中,真的被模型判斷出是拉圾郵件有多少?
- 如何用一個數字,就可以代替精度和招回率兩種指標呢?
- F1 Score: 也是一種平均的概念,但一般來說會小於真的平均數。
- 调和平均数,强调了较小值的重要性;在机器学习中。召回率为R, 准确率为P。使用他们对算法的评估,这两个值通常情况下相互制约。为了更加方便的评价算法的好坏。于是引入了F1值。F1为准确率P和召回率R的调和平均数。为什么F1使用调和平均数,而不是数字平均数。举个例子:当R 接近于1, P 接近于 0 时。采用调和平均数的F1值接近于0;而如果采用算数平均数F1的值为0.5;显然采用调和平均数能更好的评估算法的性能。等效于评价R和P的整体效果
- F-B Score: 可以讓我們更彈性去根據模型的需求給予分數,強調精度或招回率。
- 寄送免费样品是需要成本,所以我們希望在所有被寄出的客人中,真的會喜歡這樣品的客人數越多越好。
Receiver Operating Characteristic
- 如果模型是可以把資料進行很好的"Good split",計算橫軸上不同切點上的True positive rate跟False positive rate。
- ROC的X軸: False positive rate。
- ROC的Y軸: True positive rate。
- 結論: 當模型的ROC下的面積越接近1,表現越好。
評估回歸模型的指標。
- 平均絕對誤差。
- 絕對值函數是無法微分,不利於梯度下降的計算。
- 均方誤差。
- R2 score。
- 將模型與最簡單的可能模型相比得出。
- 最簡單的可能模型(分母的圖): 計算所有點的平均,畫出這條平均水平線。
- 理論上,這個最簡單的可能模型均方誤差要大於我們模型的均方誤差。
- R2 = 0,表示分子跟分母相近,也就是模型表現並不好(基本上,就是算平均而已)。
- R2 = 1,表示分母遠大於分子,也就是模型表現的越好。
- underfitting: 拿蒼蠅拍打哥吉拉(太低估哥吉拉)
- overfitting: 拿衝鋒槍打蒼蠅(太高估蒼蠅)
- underfitting: training set和test set表現都很糟糕。
- overfitting: trainig set表現很好但test set表現很糟糕。
Model complexity graph
- Linear Model: 在training set跟test set都分錯3個點。(underfitting)
- Quadratic Model: 在training set跟test set都分錯1個點。
- Polynomial Mode: 在trainig set沒分錯,但在test set卻分錯2個點。(overfitting)
- gerneal model complexity graph
黃金準則:千萬不能把測試資料拿去訓練模型 !!!
- 解決方式: 就是交叉驗證。
- 將資料從2份拆分成3份。
K-Fold Cross Validation
- 將training data和test data個拆分成K堆。
- 每次訓練都從K堆挑出一組training data和test data,這樣可進行K次訓練。
- 最後再將K次訓練的結果進行平均。
- 如何利用sklearn進行K-Fold Cross Validation。
Learning curve
- 隨著測試數據的增多,來觀察模型的學習變化進而判斷模型的狀況(overfiiting, underfitting, good)。
- High bias(underfitting): 隨著測試數據的增多,但CV error跟Training error一直很高,降不下來。
- High variance(overfitting): 隨著測試數據的增多,Training error一直很低,但CV error還是很高,兩者之間有很大的gap。
- SVM model訓練,有兩組超參數。
- 兩組超參數利用grid table,生成不同配對後,分別利用training set進行訓練。
- 將訓練好的model,再利用cross validation set,分別計算F1 score。
- 最後,將分數最高的model,再利用test test進行測試。
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