機器學習_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 NoneNone的時候即使用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 raisereturn_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
沒有留言:
張貼留言