機(jī)器學(xué)習(xí)的模型都是參數(shù)化的,以便于其針對(duì)特定的問題進(jìn)行調(diào)整。一個(gè)模型有很多參數(shù),尋找這些參數(shù)的最佳組合其實(shí)是一個(gè)搜索問題。本文中,你會(huì)學(xué)習(xí)到如何使用scikit-learn庫來調(diào)整機(jī)器學(xué)習(xí)算法的參數(shù)。使用scikit-learn API版本為0.18。
調(diào)整參數(shù)是呈現(xiàn)機(jī)器學(xué)習(xí)結(jié)果前的最后一步。有時(shí)這一過程也叫超參最優(yōu)化,其中算法的參數(shù)叫做超參,而具體機(jī)器學(xué)習(xí)模型的系數(shù)叫做參數(shù)。最優(yōu)化的意思暗示這是一個(gè)搜索問題。既然作為一個(gè)搜索問題,你就可以使用不同的搜索策略,為一個(gè)已知問題,找到一個(gè)好而且穩(wěn)定的參數(shù)或者參數(shù)集合。
兩個(gè)簡(jiǎn)單易行的搜索策略是網(wǎng)格搜索和隨機(jī)搜索。scikit-learn提供了這兩種方法做參數(shù)調(diào)整。
1. 網(wǎng)格搜索調(diào)整參數(shù)
網(wǎng)格搜索是一種參數(shù)調(diào)整方法,對(duì)網(wǎng)格中的所有算法參數(shù)的組合建立和評(píng)價(jià)模型。以下代碼使用內(nèi)建的diabetes數(shù)據(jù)集,對(duì)Ridge回歸算法的alpha參數(shù)的不同值進(jìn)行模型評(píng)價(jià)。這是一個(gè)一維的網(wǎng)格搜索問題。
# Grid Search for Algorithm Tuning
import numpy as np
from sklearn import datasets
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
# load the diabetes datasets
dataset = datasets.load_diabetes()
# prepare a range of alpha values to test
alphas = np.array([1,0.1,0.01,0.001,0.0001,0])
# create and fit a ridge regression model, testing each alpha
model = Ridge()
grid = GridSearchCV(estimator=model, param_grid=dict(alpha=alphas))
grid.fit(dataset.data, dataset.target)
print(grid)
# summarize the results of the grid search
print(grid.best_score_)
print(grid.best_estimator_.alpha)
輸出結(jié)果:
GridSearchCV(cv=None, error_score='raise',
estimator=Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,
normalize=False, random_state=None, solver='auto', tol=0.001),
fit_params={}, iid=True, n_jobs=1,
param_grid={'alpha': array([ 1.00000e+00, 1.00000e-01, 1.00000e-02, 1.00000e-03,
1.00000e-04, 0.00000e+00])},
pre_dispatch='2*n_jobs', refit=True, return_train_score=True,
scoring=None, verbose=0)
0.488790204461
0.001
更多信息,請(qǐng)參見API中的GridSearchCV和用戶手冊(cè)中的Exhaustive Grid Search
2. 隨機(jī)搜索調(diào)整參數(shù)
隨機(jī)搜索也是一種調(diào)參方法,在一定迭代次數(shù)下,從一個(gè)隨機(jī)分布中抽樣選取算法參數(shù)。根據(jù)每一個(gè)參數(shù)組合進(jìn)行模型構(gòu)建和評(píng)估。以下代碼評(píng)估0到1間的不同的alpha值,同樣使用的是標(biāo)準(zhǔn)diabetes 數(shù)據(jù)集。
# Randomized Search for Algorithm Tuning
import numpy as np
from scipy.stats import uniform as sp_rand
from sklearn import datasets
from sklearn.linear_model import Ridge
from sklearn.model_selection import RandomizedSearchCV
# load the diabetes datasets
dataset = datasets.load_diabetes()
# prepare a uniform distribution to sample for the alpha parameter
param_grid = {'alpha': sp_rand()}
# create and fit a ridge regression model, testing random alpha values
model = Ridge()
rsearch = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=100)
rsearch.fit(dataset.data, dataset.target)
print(rsearch)
# summarize the results of the random parameter search
print(rsearch.best_score_)
print(rsearch.best_estimator_.alpha)
輸出結(jié)果:
RandomizedSearchCV(cv=None, error_score='raise',
estimator=Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,
normalize=False, random_state=None, solver='auto', tol=0.001),
fit_params={}, iid=True, n_iter=100, n_jobs=1,
param_distributions={'alpha': <scipy.stats._distn_infrastructure.rv_frozen object at 0x105b8da90>},
pre_dispatch='2*n_jobs', random_state=None, refit=True,
return_train_score=True, scoring=None, verbose=0)
0.489160157304
0.0534269728673
更多信息請(qǐng)參見API中RandomizedSearchCV 的和用戶手冊(cè)中的Randomized Parameter Optimization
知識(shí)點(diǎn):
- sklearn.model_selection.GridSearchCV
- grid.fit, best_score_, best_estimator_.alpha
- sklearn.model_selection.RandomizedSearchCV
- rsearch.fit, best_score_, best_estimator_.alpha
喜歡本文的話,就點(diǎn)個(gè)喜歡吧!歡迎轉(zhuǎn)載!