Multiclass classification
scikit learn 對multiclass classification (i.e. categorical variable) 的implementation是實際上製作出多個binary classifiers,分別是Category X vs rest,然後一一分類,最後在冠上每個category:所以以下的function call實際上產出了四組 (sklearn從餵進來的data知道category = 4) LSVM的models:
Cross validation
之前的AI筆記已經有寫過cross validation:https://fu-sheng-wang.blogspot.tw/2017/02/ai19-regularization-validation.html
cross validation的用意是用來evaluate model好壞,不是用來tune model parameters!
把dataset分成split成多組的training/test sets,然後來evaluate model,最後取平均結果,這樣能夠比只split 一組training/test set取得更generalized且stable evaluation。
以下是常見的k-fold cross validation:
這邊有k個model ,原本的dataset split k次,每次都是1份 (fold) test set 配上 k-1份 training set,然後每個model使用某一次split來train and test。
可以看到上面的clf classifier做了3-fold cross validation之後,獲得了三次的score (應該是test set accuracy score),最後可以取三次平均值當作此三次model的evaluation score。
另一個資訊是此classifier為何在三個不同的split得到不同的accuracy? 這暗示了此種classifier對同一個distribution的data可能variation的敏感度,類似得到best-case / worst-case scenarios。
Stratified K-fold cross validation
categorical dataset有可能有順序排列(例如按照class),所以sklearn自動會做stratified sampling,意即sampling完成後,每個class占比仍盡量接近原dataset占比。當然這對classification才有意義,對regression就不必要採取這樣的sampling方式。
Leave-one-out cross validation
一個更耗資源的cross validation方式就是做了k次的validation,但是每次split test set只有一個element,其他全部都是training set,這讓training時獲得盡量大的資訊:利用validation curve來判斷改變某個參數的對model的影響
上面這段程式要測試gamma這個feature在param_range 這個參數區間的score:
測試結果回傳了兩個2D-array,每個array element (也是一個 array)代表param_range區間中的某個值,而此element array的每個element代表了每個fold 的分數。
假設我們有一個cross validation curve結果(非上面的程式),如果我們把這個區間的score結果plot出來:
橘線代表了mean training score (e.g. accuracy),且半透明部分代表以此mean為中的variation,而藍線代表了mean test set score,可以看到此參數gammay在 0.1的時候是有最好的mean cross validation test score。
沒有留言:
張貼留言