code

2017年9月7日 星期四

Applied Machine Learning in Python 7 - Multiclass classification & Cross Validation

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。

沒有留言:

張貼留言