2017年9月20日 星期三

機器學習-ml-gridsearchcv-網格搜尋

機器學習_ML_GridSearchCV_網格搜尋

官方連結說明
Exhaustive search over specified parameter values for an estimator.
開宗明義的一句話,就是極盡所能的對所有指定的參數做搜尋,故稱之為暴力搜尋。
透過GridSearchCV我們可以對所設置的所有參數做所有的可能排列組合下去測,然後取得一個最佳參數。相對的,這部份的取得成本是非常可觀的。
個人用了50k筆資料,測了幾個條件去做,印象中是跑了5小時才結束…
Important members are fit, predict.
重點是模型要有fit跟predict這兩個方法!!
也可以搭配著pipeline來執行,就不用另外再做個標準化或pca的動作,讓pipeline來處理就可以。

IMPORT

from sklearn.model_selection import GridSearchCV

CLASS

class sklearn.model_selection.GridSearchCV(
    estimator, param_grid,  scoring=None, 
    fit_params=None, n_jobs=1,    iid=True,  
    refit=True,  cv=None, verbose=0,   
    pre_dispatch='2*n_jobs',  error_score='raise',      
    return_train_score=True  

參數說明

estimator

使用的分類器

param_grid

list 或是 dict 做最佳化的參數

scoring

default None
None的時候即使用estimator的預設score

fit_params

丟給fit的參數,不過0.19版之後已經不用了

n_jobs

defualt 1
使用多少CPU執行緒,如果設置-1就是火力全開!
may raise errors if the dataset is large and not enough memory is available
如果設置-1或>1的話,在數據量過大的情況下就可能會因為記憶體不足error

iid

default True
設置為True時即假設在折疊中樣本概率分佈一致,損失估計為所有樣本總合,而非平均。

refit

default True
設置為true的話,會在最後取得最佳參數之後再以該參數做fit一次全部的資料。

cv

default 3
交叉驗證,將資料分n份
可以是整數、交叉驗證或一個可迭代器
None:默認為3
整數n:n折交叉驗證
另篇文字分詞的演算法是以5來計算,這個部份的用途主要是將資料分群之後交叉取得較佳模型。
For integer/None inputs, if the estimator is a classifier and y is either binary or multiclass, StratifiedKFold is used. In all other cases, KFold is used.
說明也提到,預設情況下是以KFold來處理的。除非你是多分類才會以StratifiedKFold。
那KFold與StratifiedKFold的話,我們另篇再說簡單說明。

verbose

default 0
設置為0即訓練過程不會顯示,為1的話偶爾顯示,大於1的時候必顯示。

pre_dispatch

default
指定總共分發的並行任務,似乎是用來控制CPU使用率。
None-所有作業立即展開,用在較小型的測試作業!
int-要指定確切數量
String-2*n_jobs
. A workaround in this case is to set pre_dispatch. Then, the memory is copied only pre_dispatch many times. A reasonable value for pre_dispatch is 2 * n_jobs.
在api說明下,建議設置是2 * n_jobs

error_score

default raise

return_train_score

default True {‘True’, ‘False’}
如果設置False就不會回傳結果!
即屬性cv_results_ 就不會有分數的值了。

方法

decision_function(X)

Call decision_function on the estimator with the best found params.
只有在refit=True跟分類器可以實作的時候才有效果。
以最佳參數執行!
主要取得X的

fit(X[, y, groups])

適合、訓練模型(開始用設置的參數開始暴力測試)

get_params([deep])

取得模型參數

inverse_transform(Xt)

Call inverse_transform on the estimator with the best found params.
只有在refit=True跟分類器可以實作的時候才有效果。
以最佳參數執行!
各演算法的inverse_transform意義不同,可參閱SKlearn的api說明!

predict(X)

Call predict on the estimator with the best found parameters.
用最佳參數來做預測,特別貼出來說明是取最佳參數來做預測!

predict_log_proba(X)

回傳類別概率對數(機率、或然率)…一樣是以最佳參數來執行

predict_proba(X)

回傳類別概率(機率、或然率)…一樣是以最佳參數來執行

score(X[, y])

看你的上面參數SCROING設置來回傳,上面是NONE就以選擇的分類器的SCORE為預設

set_params(**params)

設置模型參數

transform(X)

Call transform on the estimator with the best found parameters.
以最佳參數來做轉換,但一樣要分類器可以實作!

屬性

cv_results_

這邊記錄著你的所有參數的狀況,是個dict(字典)形態。
可以直接丟給pandas
以下面的範例去看的話,就是下面這樣子!
{
'param_kernel': masked_array(data = ['poly', 'poly', 'rbf', 'rbf'],
                             mask = [False False False False]...)
'param_gamma': masked_array(data = [-- -- 0.1 0.2],
                            mask = [ True  True False False]...),
'param_degree': masked_array(data = [2.0 3.0 -- --],
                             mask = [False False  True  True]...),
'split0_test_score'  : [0.8, 0.7, 0.8, 0.9],
'split1_test_score'  : [0.82, 0.5, 0.7, 0.78],
'mean_test_score'    : [0.81, 0.60, 0.75, 0.82],
'std_test_score'     : [0.02, 0.01, 0.03, 0.03],
'rank_test_score'    : [2, 4, 3, 1],
'split0_train_score' : [0.8, 0.9, 0.7],
'split1_train_score' : [0.82, 0.5, 0.7],
'mean_train_score'   : [0.81, 0.7, 0.7],
'std_train_score'    : [0.03, 0.03, 0.04],
'mean_fit_time'      : [0.73, 0.63, 0.43, 0.49],
'std_fit_time'       : [0.01, 0.02, 0.01, 0.01],
'mean_score_time'    : [0.007, 0.06, 0.04, 0.04],
'std_score_time'     : [0.001, 0.002, 0.003, 0.005],
'params'             : [{'kernel': 'poly', 'degree': 2}, ...],
}

best_estimator_

最佳分類器,如果refit是False就沒有效果!
SVC(C=10, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma=0.001, kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)

best_score_

最佳分類器的平均驗證得分。(記得我們有分折吧!)

best_params_

取得最佳參數

best_index_

在cv_results_中的最佳參數的索引值

scorer_

記錄你的評分指標(記得下面範例的迴圈吧!用了recall(召回率)跟precision)
make_scorer(recall_score, pos_label=None, average=macro)

n_splits_

cv的保存!

結果保存

GridSearchCV計算之後,結果是存放在(.cv_results_)中,可以透過pandas直接to_csv存入csv檔即可。
cv_result = pd.DataFrame.from_dict(clf.cv_results_)
with open('cv_result.csv','w') as f:
  cv_result.to_csv(f)

範例

原文說明上有一個範例不錯,可以看一下。
下面的範例看懂了,大概就懂了,整個複製貼上到你的環境去跑,把每個參數都run出來確認它的狀態!
連結
#  Import需求lib
from __future__ import print_function

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.svm import SVC

print(__doc__)

# 讀入sklearn的範例資料
digits = datasets.load_digits()

#  資料預處理
# To apply an classifier on this data, we need to flatten the image, to
# turn the data in a (samples, feature) matrix:
n_samples = len(digits.images)  #  1797筆
X = digits.images.reshape((n_samples, -1))
y = digits.target

# 資料切割訓練與測試集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.5, random_state=0)

# 要給gv的參數,可以看到正規化的惩法給了四個,gamma也給了兩個 kernel也用了rbf跟liner
tuned_parameters = [{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],
                     'C': [1, 10, 100, 1000]},
                    {'kernel': ['linear'], 'C': [1, 10, 100, 1000]}]

#  評估模型的計算得分設置了兩個,並用迴圈來執行這個gv
scores = ['precision', 'recall']

for score in scores:
    print("# Tuning hyper-parameters for %s" % score)
    print()
    #  以5折下去做暴力尋參,用svc來做分類器
    clf = GridSearchCV(SVC(), tuned_parameters, cv=5,
                       scoring='%s_macro' % score)
    clf.fit(X_train, y_train)

    print("Best parameters set found on development set:")
    print()
    #  列印最佳參數
    print(clf.best_params_)
    print()
    print("Grid scores on development set:")
    print()
    #  設置陣列的資料,記得參閱api
    means = clf.cv_results_['mean_test_score']
    stds = clf.cv_results_['std_test_score']
    #  這邊依設置的參數列印出所有參數的得分狀況
    for mean, std, params in zip(means, stds, clf.cv_results_['params']):
        print("%0.3f (+/-%0.03f) for %r"
              % (mean, std * 2, params))
    print()

    print("Detailed classification report:")
    print()
    print("The model is trained on the full development set.")
    print("The scores are computed on the full evaluation set.")
    print()
    y_true, y_pred = y_test, clf.predict(X_test)
    print(classification_report(y_true, y_pred))
    print()

# Note the problem is too easy: the hyperparameter plateau is too flat and the
# output model is the same for precision and recall with ties in quality.
模型結果
Automatically created module for IPython interactive environment
# Tuning hyper-parameters for precision

Best parameters set found on development set:

{'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}

Grid scores on development set:

0.986 (+/-0.016) for {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'}
0.959 (+/-0.029) for {'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'}
0.988 (+/-0.017) for {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}
0.982 (+/-0.026) for {'C': 10, 'gamma': 0.0001, 'kernel': 'rbf'}
0.988 (+/-0.017) for {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'}
0.982 (+/-0.025) for {'C': 100, 'gamma': 0.0001, 'kernel': 'rbf'}
0.988 (+/-0.017) for {'C': 1000, 'gamma': 0.001, 'kernel': 'rbf'}
0.982 (+/-0.025) for {'C': 1000, 'gamma': 0.0001, 'kernel': 'rbf'}
0.975 (+/-0.014) for {'C': 1, 'kernel': 'linear'}
0.975 (+/-0.014) for {'C': 10, 'kernel': 'linear'}
0.975 (+/-0.014) for {'C': 100, 'kernel': 'linear'}
0.975 (+/-0.014) for {'C': 1000, 'kernel': 'linear'}

Detailed classification report:

The model is trained on the full development set.
The scores are computed on the full evaluation set.

             precision    recall  f1-score   support

          0       1.00      1.00      1.00        89
          1       0.97      1.00      0.98        90
          2       0.99      0.98      0.98        92
          3       1.00      0.99      0.99        93
          4       1.00      1.00      1.00        76
          5       0.99      0.98      0.99       108
          6       0.99      1.00      0.99        89
          7       0.99      1.00      0.99        78
          8       1.00      0.98      0.99        92
          9       0.99      0.99      0.99        92

avg / total       0.99      0.99      0.99       899


# Tuning hyper-parameters for recall

Best parameters set found on development set:

{'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}

Grid scores on development set:

0.986 (+/-0.019) for {'C': 1, 'gamma': 0.001, 'kernel': 'rbf'}
0.957 (+/-0.029) for {'C': 1, 'gamma': 0.0001, 'kernel': 'rbf'}
0.987 (+/-0.019) for {'C': 10, 'gamma': 0.001, 'kernel': 'rbf'}
0.981 (+/-0.028) for {'C': 10, 'gamma': 0.0001, 'kernel': 'rbf'}
0.987 (+/-0.019) for {'C': 100, 'gamma': 0.001, 'kernel': 'rbf'}
0.981 (+/-0.026) for {'C': 100, 'gamma': 0.0001, 'kernel': 'rbf'}
0.987 (+/-0.019) for {'C': 1000, 'gamma': 0.001, 'kernel': 'rbf'}
0.981 (+/-0.026) for {'C': 1000, 'gamma': 0.0001, 'kernel': 'rbf'}
0.972 (+/-0.012) for {'C': 1, 'kernel': 'linear'}
0.972 (+/-0.012) for {'C': 10, 'kernel': 'linear'}
0.972 (+/-0.012) for {'C': 100, 'kernel': 'linear'}
0.972 (+/-0.012) for {'C': 1000, 'kernel': 'linear'}

Detailed classification report:

The model is trained on the full development set.
The scores are computed on the full evaluation set.

             precision    recall  f1-score   support

          0       1.00      1.00      1.00        89
          1       0.97      1.00      0.98        90
          2       0.99      0.98      0.98        92
          3       1.00      0.99      0.99        93
          4       1.00      1.00      1.00        76
          5       0.99      0.98      0.99       108
          6       0.99      1.00      0.99        89
          7       0.99      1.00      0.99        78
          8       1.00      0.98      0.99        92
          9       0.99      0.99      0.99        92

avg / total       0.99      0.99      0.99       899

沒有留言:

張貼留言