sklearn evaluation(評估)
sklearn Estimator(model)通常類中有一個score
方法來作為默認評分標準,而呼叫evaluation(例如:cross_val_score)有一個參數scoring
可以另外指定評分標準,輸入為下圖的scoring字符串,傳入evaluation的Estimator還必須實現fit
跟predict
方法(其實就是訓練(參數為x,y)跟預測(參數為x))。
可以自定義建立Estimator跟method搭配tensorflow或pytorch使用。
- Scoring轉scorer
有時候Scoring是loss(損失函數)越高表示模型表現越差,我們將損失轉成得分,越高分表示模型表現越好。
sklearn.metrics.make_scorer
非平衡數據正確性
-
分類器
一個常見的例子,我們預測一個人是否會得腦癌,而我們有個模型正確率為98%,我們的判斷方式是名子叫魯夫的人就會得腦癌。我們可以在精確率(預測為陽性且正確的比例)與召回率(實際為陽性預測正確的比例)之間做取捨。
sklearn指標
sklearn.metrics.recall_score召回
sklearn.metrics.precision_score精確
sklearn.metrics.balanced_accuracy_score平衡準確率
sklearn.metrics.accuracy_score準確率
-
物件偵測計算同上
通常物件偵測會計算IOU大於0.5為TP,小於0.5為FP。
[class1]
precision: 2/3=66% (判對class1 數量/被框為class1的數量),越低過檢越高。
recall: 2/4=50% (判對class1 數量/所有class1樣本數),越低漏檢越高。
[class2]
precision: 1/1=100% (判對class2 數量 / 被框為class2 的數量),越低過檢越高。
recall: 1/1=100% (判對class2 數量 / 所有class2 樣本數),越低漏檢越高。
AP計算:
計算類別曲線下面積(area under curve, AUC)
mAP計算:
計算所有類別AP的平均。
validation(驗證)
通常我們會將Data分成train set
(訓練集)以及test set
(測試集)來檢驗我們訓練的模型一般化能力,然而我們在訓練模型時,時常需要調整許多hyperparameter
(超參數),所以我們會拿一部分資料來做validation
(驗證)稱為validation set
,來檢驗超參數的好壞,但是validation是不能拿test set來使用的,因為這等同於讓訓練模型去適應test set的資料,就失去測試一般化能力(適應訓練資料以外資料的能力)的意義了,最後test set測試的資料我們可以稱它為holdout set
。
這是最簡單的validation方式,將資料直接分成train、holdout 或train、validation、holdout。
Cross validation(交叉驗證)
-
K-fold CV
K-fold是常用的交叉驗證方法,做法是將資料隨機平均分成k個集合,然後輪流使用k-1個不同集合來作validation,共做k-1次訓練,最後再使用沒作訓練的那一個holdout set測試訓練成果。
k越大,每次投入的訓練集的數據越多,模型的bias越小。但是k越大,variance可能越高導致overfitting,同時k越大運算量越大。
sklearn.model_selection.cross_val_score
-
Leave-one-out cross-validation(LOOCV)
LOOCV是指我們一樣保留一部分資料作為holdout,但將剩餘的每一筆數據都作為一個集合,每作一次train就做一次validation。
sklearn.model_selection.LeaveOneOut
sklearn.model_selection.cross_val_score
hyperparameter最佳化
步驟1:給定超參數一個範圍,從設定超參數中隨機取樣。
步驟2:進行訓練,從驗證資料辨識準確度。
步驟3:重複前兩步驟多次,從結果慢慢縮小範圍。
sklearn.model_selection.fit_grid_point
sklearn.model_selection.GridSearchCV
underfitting、overfitting
hypothesis set(假設集)是我們假設的一個function set,例如: ,我們選定參數(w、b)後的那個function稱predict(預測函數),例如: 。
y 是我們真實產生數據的一個function,我們的數據是,noise通常有規律性(例如常態分怖),error為現實生活中數據可能因為人為、機器、測量等等產生誤差。
-
high Bias即所謂的Underfitting,訓練與驗證loss很高(表示數據y與predic差異很大),可能是參數過少導致無法擬合訓練集(模型過於簡單),也可能是數據noise或error太大(數據質量太差),或是gradient descent無法到達最低點等等(超參數及模型需調整)。
-
low Bias high Variance即所謂的Overfitting,訓練loss很低,但驗證loss卻很高。
可能是參數過多導致過度擬合訓練集(模型太過複雜,需要降低複雜度、regularization或Dropout等),也可能是數據過少(沒有足夠的信息來判斷規則)等等。
underfitting與gradient descent關係
-
loss作圖
這邊假設我們的,那麼 ,這邊2個變量(w、b)跟一個應變量(loss),其他x、y為常數(已知),我們可以用loss對y作圖(3維)。z軸是loss,另外兩軸是我們的hypothesis set參數(w、b)。
但我們有多筆數據,例如250筆所以我們Loss改寫成:
,換成n表示樣本數
所以我們求的是250筆資料疊加後的圖形,且一樣是三維圖形,可能是凸函數或非凸函數,當hypothesis越複雜(NN越深、或有許多非線性繳活函數)越會造成非凸函數。
-
函數疊加
這邊再簡化hypothesis = wx來解釋疊加的圖形,假設有2筆數據,第一筆{x=2,y=0},第二筆{x=1,y=0},那麼與他們的圖形如下圖:
*由此可以得知sgd可能會更新不到實際的全局最小值。
-
關係
gradient descent就是從圖型中隨機選擇一個參數點(固定W、B),然後計算梯度,更新參數點作移動,停止條件是gtad=0(梯度、坡度等於零),如下圖:
underfitting,訓練與驗證loss高,1.有可能是圖型的全局最小值本身就很高,參數太少或數據noise或error太大導致,2.也有可能全局最小值很低但我們的權重更新不到全局最小值,可能是卡在鞍點、某個最高點、局部小值。
- 調參小trick
train前先使用一部分非常少的數據,先訓練看看是否能過擬合,如果不行可以檢查看看是不是有什麼地方寫錯了。