Python机器学习笔记 GridSearchCV
Python機(jī)器學(xué)習(xí)筆記 Grid SearchCV(網(wǎng)格搜索)
? 在機(jī)器學(xué)習(xí)模型中,需要人工選擇的參數(shù)稱為超參數(shù)。比如隨機(jī)森林中決策樹的個(gè)數(shù),人工神經(jīng)網(wǎng)絡(luò)模型中隱藏層層數(shù)和每層的節(jié)點(diǎn)個(gè)數(shù),正則項(xiàng)中常數(shù)大小等等,他們都需要事先指定。超參數(shù)選擇不恰當(dāng),就會(huì)出現(xiàn)欠擬合或者過擬合的問題。而在選擇超參數(shù)的時(shí)候,有兩個(gè)途徑,一個(gè)是憑經(jīng)驗(yàn)微調(diào),另一個(gè)就是選擇不同大小的參數(shù),帶入模型中,挑選表現(xiàn)最好的參數(shù)。
微調(diào)的一種方法是手工調(diào)制超參數(shù),直到找到一個(gè)好的超參數(shù)組合,這么做的話會(huì)非常冗長(zhǎng),你也可能沒有時(shí)間探索多種組合,所以可以使用Scikit-Learn的GridSearchCV來做這項(xiàng)搜索工作。下面讓我們一一探索。
一、Grid SearchCV原理分析
1,為什么叫網(wǎng)格搜索(GridSearchCV)?
GridSearchCV的名字其實(shí)可以拆分為兩部分,GridSearch和CV,即網(wǎng)格搜索和交叉驗(yàn)證。這兩個(gè)名字都非常好理解。網(wǎng)格搜索,搜索的是參數(shù),即在指定的參數(shù)范圍內(nèi),按步長(zhǎng)依次調(diào)整參數(shù),利用調(diào)整的參數(shù)訓(xùn)練學(xué)習(xí)器,從所有的參數(shù)中找到在驗(yàn)證集上精度最高的參數(shù),這其實(shí)是一個(gè)訓(xùn)練和比較的過程。
GridSearchCV可以保證在指定的參數(shù)范圍內(nèi)找到精度最高的參數(shù),但是這也是網(wǎng)格搜索的缺陷所在,他要求遍歷所有可能參數(shù)的組合,在面對(duì)大數(shù)據(jù)集和多參數(shù)的情況下,非常耗時(shí)。
2,什么是Grid Search網(wǎng)格搜索?
Grid Search:一種調(diào)參手段;窮舉搜索:在所有候選的參數(shù)選擇中,通過循環(huán)遍歷,嘗試每一種可能性,表現(xiàn)最好的參數(shù)就是最終的結(jié)果。其原理就像是在數(shù)組里找到最大值。這種方法的主要缺點(diǎn)是比較耗時(shí)!
所以網(wǎng)格搜索適用于三四個(gè)(或者更少)的超參數(shù)(當(dāng)超參數(shù)的數(shù)量增長(zhǎng)時(shí),網(wǎng)格搜索的計(jì)算復(fù)雜度會(huì)呈現(xiàn)指數(shù)增長(zhǎng),這時(shí)候則使用隨機(jī)搜索),用戶列出一個(gè)較小的超參數(shù)值域,這些超參數(shù)至于的笛卡爾積(排列組合)為一組組超參數(shù)。網(wǎng)格搜索算法使用每組超參數(shù)訓(xùn)練模型并挑選驗(yàn)證集誤差最小的超參數(shù)組合。
2.1,以隨機(jī)森林為例說明GridSearch網(wǎng)格搜索
? 下面代碼,我們要搜索兩種網(wǎng)格,一種是n_estimators,一種是max_features。GridSearch會(huì)挑選出最適合的超參數(shù)值。
from sklearn.model_selection import GridSearchCV param_grid = [ {'n_estimators': [3, 10, 30], 'max_features': [2, 4, 6, 8]}, {'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3, 4]}, ]forest_reg = RandomForestRegressor() grid_search = GridSearchCV(forest_reg, param_grid, cv=5,scoring='neg_mean_squared_error')grid_search.fit(housing_prepared, housing_labels)? sklearn 根據(jù)param_grid的值,首先會(huì)評(píng)估3×4=12種n_estimators和max_features的組合方式,接下來在會(huì)在bootstrap=False的情況下(默認(rèn)該值為True),評(píng)估2×3=6種12種n_estimators和max_features的組合方式,所以最終會(huì)有12+6=18種不同的超參數(shù)組合方式,而每一種組合方式要在訓(xùn)練集上訓(xùn)練5次, 所以一共要訓(xùn)練18×5=90 次,當(dāng)訓(xùn)練結(jié)束后,你可以通過best_params_獲得最好的組合方式。
>>>>grid_search.best_params_ >>>>{‘max_features’: 8, ‘n_estimators’: 30} >>>>grid_search.best_estimator_ >>>>RandomForestRegressor(bootstrap=True, criterion=‘mse’, max_depth=None,max_features=8, max_leaf_nodes=None, min_impurity_decrease=0.0,min_impurity_split=None, min_samples_leaf=1,min_samples_split=2, min_weight_fraction_leaf=0.0,n_estimators=30, n_jobs=1, oob_score=False, random_state=None,verbose=0, warm_start=False)? 如果GridSearchCV初始化時(shí),refit=True(默認(rèn)的初始化值),在交叉驗(yàn)證時(shí),一旦發(fā)現(xiàn)最好的模型(estimator),將會(huì)在整個(gè)訓(xùn)練集上重新訓(xùn)練,這通常是一個(gè)好主意,因?yàn)槭褂酶嗟臄?shù)據(jù)集會(huì)提升模型的性能。
以上面有兩個(gè)參數(shù)的模型為例,參數(shù)a有3中可能,參數(shù)b有4種可能,把所有可能性列出來,可以表示成一個(gè)3*4的表格,其中每個(gè)cell就是一個(gè)網(wǎng)格,循環(huán)過程就像是在每個(gè)網(wǎng)格里遍歷,搜索,所以叫g(shù)rid search。
2.2,以Xgboost為例說明GridSearch網(wǎng)格搜索
下面以阿里IJCAI廣告推薦數(shù)據(jù)集與XgboostClassifier分類器為例,用代碼形式說明sklearn中GridSearchCV的使用方法。(此小例的代碼是參考這里:請(qǐng)點(diǎn)擊我)
import numpy as np import pandas as pd import xgboost as xgb from sklearn.grid_search import GridSearchCV#導(dǎo)入訓(xùn)練數(shù)據(jù) traindata = pd.read_csv("/traindata_4_3.txt",sep = ',') traindata = traindata.set_index('instance_id') trainlabel = traindata['is_trade'] del traindata['is_trade'] print(traindata.shape,trainlabel.shape)#分類器使用 xgboost clf1 = xgb.XGBClassifier()#設(shè)定網(wǎng)格搜索的xgboost參數(shù)搜索范圍,值搜索XGBoost的主要6個(gè)參數(shù) param_dist = {'n_estimators':range(80,200,4),'max_depth':range(2,15,1),'learning_rate':np.linspace(0.01,2,20),'subsample':np.linspace(0.7,0.9,20),'colsample_bytree':np.linspace(0.5,0.98,10),'min_child_weight':range(1,9,1)}#GridSearchCV參數(shù)說明,clf1設(shè)置訓(xùn)練的學(xué)習(xí)器 #param_dist字典類型,放入?yún)?shù)搜索范圍 #scoring = 'neg_log_loss',精度評(píng)價(jià)方式設(shè)定為“neg_log_loss“ #n_iter=300,訓(xùn)練300次,數(shù)值越大,獲得的參數(shù)精度越大,但是搜索時(shí)間越長(zhǎng) #n_jobs = -1,使用所有的CPU進(jìn)行訓(xùn)練,默認(rèn)為1,使用1個(gè)CPU grid = GridSearchCV(clf1,param_dist,cv = 3,scoring = 'neg_log_loss',n_iter=300,n_jobs = -1)#在訓(xùn)練集上訓(xùn)練 grid.fit(traindata.values,np.ravel(trainlabel.values)) #返回最優(yōu)的訓(xùn)練器 best_estimator = grid.best_estimator_ print(best_estimator) #輸出最優(yōu)訓(xùn)練器的精度這里關(guān)于網(wǎng)格搜索的幾個(gè)參數(shù)在說明一下,評(píng)分參數(shù)“scoring”,需要根據(jù)實(shí)際的評(píng)價(jià)標(biāo)準(zhǔn)設(shè)定,阿里的IJCAI的標(biāo)準(zhǔn)時(shí)“neg_log_loss”,所以這里設(shè)定為“neg_log_loss”,sklearn中備選的評(píng)價(jià)標(biāo)準(zhǔn)如下:在一些情況下,sklearn中沒有現(xiàn)成的評(píng)價(jià)函數(shù),sklearn是允許我們自定義的,但是需要注意格式。
接下來看一下我們定義的評(píng)價(jià)函數(shù):
import numpy as np from sklearn.metrics import make_scorerdef logloss(act, pred):epsilon = 1e-15pred = sp.maximum(epsilon, pred)pred = sp.minimum(1-epsilon, pred)ll = sum(act*sp.log(pred) + sp.subtract(1, act)*sp.log(sp.subtract(1, pred)))ll = ll * -1.0/len(act)return ll#這里的greater_is_better參數(shù)決定了自定義的評(píng)價(jià)指標(biāo)是越大越好還是越小越好 loss = make_scorer(logloss, greater_is_better=False) score = make_scorer(logloss, greater_is_better=True)定義好以后,再將其帶入GridSearchCV函數(shù)就好。
這里再貼一下常用的集成學(xué)習(xí)算法比較重要的需要調(diào)參的參數(shù):
2.3,以SVR為例說明GridSearch網(wǎng)格搜索
以兩個(gè)參數(shù)的調(diào)優(yōu)過程為例:
from sklearn.datasets import load_iris from sklearn.svm import SVC from sklearn.model_selection import train_test_splitiris_data = load_iris()#鳶尾花(Iris)數(shù)據(jù)集 X_trainval,X_test,y_trainval,y_test = train_test_split(iris_data.data,iris_data.target,random_state=0) X_train ,X_val,y_train,y_val = train_test_split(X_trainval,y_trainval,random_state=1)# grid search start best_score = 0 for gamma in [0.001,0.01,1,10,100]:for c in [0.001,0.01,1,10,100]:# 對(duì)于每種參數(shù)可能的組合,進(jìn)行一次訓(xùn)練svm = SVC(gamma=gamma,C=c)svm.fit(X_train,y_train)score = svm.score(X_test,y_test)# 找到表現(xiàn)最好的參數(shù)if score > best_score:best_score = scorebest_parameters = {'gamma':gamma,"C":c}# 使用最佳參數(shù),構(gòu)建新的模型 svm = SVC(**best_parameters)# 使用訓(xùn)練集和驗(yàn)證集進(jìn)行訓(xùn)練 more data always resultd in good performance svm.fit(X_trainval,y_trainval)# evalyation 模型評(píng)估 test_score = svm.score(X_test,y_test)print('Best socre:{:.2f}'.format(best_score)) print('Best parameters:{}'.format(best_parameters)) print('Best score on test set:{:.2f}'.format(test_score))'''輸出結(jié)果 Best socre:0.97 Best parameters:{'gamma': 0.001, 'C': 100} Best score on test set:0.97'''2.4 上面調(diào)參存在的問題是什么呢?
? 原始數(shù)據(jù)集劃分成訓(xùn)練集和測(cè)試集以后,其中測(cè)試集除了用作調(diào)整參數(shù),也用來測(cè)量模型的好壞;這樣做導(dǎo)致最終的評(píng)分結(jié)果比實(shí)際效果好。(因?yàn)闇y(cè)試集在調(diào)參過程中,送到了模型里,而我們的目的是將訓(xùn)練模型應(yīng)用到unseen data上)。
2.5 解決方法是什么呢?
? 對(duì)訓(xùn)練集再進(jìn)行一次劃分,分為訓(xùn)練集和驗(yàn)證集,這樣劃分的結(jié)果就是:原始數(shù)據(jù)劃分為3份,分別為:訓(xùn)練集,驗(yàn)證集和測(cè)試集;其中訓(xùn)練集用來模型訓(xùn)練,驗(yàn)證集用來調(diào)整參數(shù),而測(cè)試集用來衡量模型表現(xiàn)好壞。
from sklearn.datasets import load_iris from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.model_selection import GridSearchCV import mglearn import numpy as np import pandas as pdiris_data = load_iris()#鳶尾花(Iris)數(shù)據(jù)集 X_trainval,X_test,y_trainval,y_test = train_test_split(iris_data.data,iris_data.target,random_state=0) X_train ,X_val,y_train,y_val = train_test_split(X_trainval,y_trainval,random_state=1) # print(len(X_trainval),len(X_test),len(y_trainval),len(y_test)) # print(len(X_train),len(X_val),len(y_train),len(y_val)) # print(iris_data.data) # print(len(iris_data.data)) # print(iris_data.target) # print(len(iris_data.target)) # print(X_val) # print(len(X_val)) # print(y_val) # print(len(y_val))## grid search start best_score = 0 for gamma in [0.001,0.01,1,10,100]:for c in [0.001,0.01,1,10,100]:# 對(duì)于每種參數(shù)可能的組合,進(jìn)行一次訓(xùn)練svm = SVC(gamma=gamma,C=c)svm.fit(X_train,y_train)score = svm.score(X_val,y_val)# 找到表現(xiàn)最好的參數(shù)if score > best_score:best_score = scorebest_parameters = {'gamma':gamma,"C":c}# 使用最佳參數(shù),構(gòu)建新的模型 svm = SVC(**best_parameters)# 使用訓(xùn)練集和驗(yàn)證集進(jìn)行訓(xùn)練 more data always resultd in good performance svm.fit(X_trainval,y_trainval)# evalyation 模型評(píng)估 test_score = svm.score(X_test,y_test)print('Best socre:{:.2f}'.format(best_score)) print('Best parameters:{}'.format(best_parameters)) print('Best score on test set:{:.2f}'.format(test_score))#對(duì)測(cè)試結(jié)果進(jìn)行預(yù)測(cè) X_test_lab = svm.predict(X_test) print(len(y_test)) print(y_test) print(X_test_lab)''' 一般情況下,網(wǎng)格搜索嘗試所有參數(shù)的所有可能組合,但有時(shí)候會(huì)遇到“條件”參數(shù), 例如SVC有一個(gè)kernel參數(shù),如果kernel='linear',則模型只會(huì)用到C參數(shù),如果kernel='rbf', 則模型需要使用C和gamma兩個(gè)參數(shù)。如果kernel='linear',那么gamma參數(shù)是用不到的, 嘗試gamma的不同取值將會(huì)浪費(fèi)時(shí)間。因此,GridSearchCV的parm_grid可以是字典組成的列表, 列表中的每個(gè)字典可擴(kuò)展為一個(gè)獨(dú)立的網(wǎng)格 ''' # # #網(wǎng)格的空間中搜索 # param_grid = {'C':[0.001,0.01,0.1,1,10,100],'gamma':[0.001,0.01,0.1,1,10,100]} # grid_search = GridSearchCV(SVC(),param_grid,cv=5) # X_train,X_test,y_train,y_test = train_test_split(iris_data.data,iris_data.target,random_state=0) # grid_search.fit(X_train,y_train) # print("Best parameters:{}".format(grid_search.best_params_)) # print("Best cross-validation score:{:.2f}".format(grid_search.best_score_)) # print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test)))# # #在非網(wǎng)格的空間中搜索 # param_grid = [{'kernel':['rbf'],'C':[0.001,0.01,0.1,1,10,100],'gamma':[0.001,0.01,0.1,1,10,100]},{'kernel':['linear'],'C':[0.001,0.01,0.1,1,10,100]}] # grid_search = GridSearchCV(SVC(),param_grid,cv=5) # X_train,X_test,y_train,y_test = train_test_split(iris_data.data,iris_data.target,random_state=0) # grid_search.fit(X_train,y_train) # print("Best parameters:{}".format(grid_search.best_params_)) # print("Best cross-validation score:{:.2f}".format(grid_search.best_score_)) # print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test)))'''1以SVR為例說明GridSearch網(wǎng)格搜索 Best socre:0.96 Best parameters:{'gamma': 0.001, 'C': 10} Best score on test set:0.92 ''''''2GridSearch網(wǎng)格搜索-線性向量機(jī) Best parameters:{'C': 100, 'gamma': 0.01} Best cross-validation score:0.97 Test set score:0.97 ''''''2GridSearch網(wǎng)格搜索-非線性向量機(jī) Best parameters:{'C': 100, 'gamma': 0.01, 'kernel': 'rbf'} Best cross-validation score:0.97 Test set score:0.97 '''? 然而,這種簡(jiǎn)潔的grid search方法,其最終的表現(xiàn)好壞與初始數(shù)據(jù)的劃分結(jié)果有很大的關(guān)系,為了處理這種情況,我們采用交叉驗(yàn)證的方式來減少偶然性。
2.6,交叉驗(yàn)證改進(jìn)SVM代碼(Grid Search with Cross Validation)
#!/usr/bin/env python # -*- coding:utf-8 -*- #time: 2017/08/15 20:53:19 #version 1.0 #__author__:lanlongfrom sklearn.datasets import load_iris from sklearn.svm import SVC from sklearn.model_selection import train_test_split,cross_val_score from sklearn.model_selection import GridSearchCV iris_data = load_iris()#鳶尾花(Iris)數(shù)據(jù)集 # X_train,X_test,y_train,y_test = train_test_split(iris_data.data,iris_data.target,random_state=0) X_trainval,X_test,y_trainval,y_test = train_test_split(iris_data.data,iris_data.target,random_state=0) X_train ,X_val,y_train,y_val = train_test_split(X_trainval,y_trainval,random_state=1)# grid search start best_score = 0 for gamma in [0.001,0.01,1,10,100]:for c in [0.001,0.01,1,10,100]:# 對(duì)于每種參數(shù)可能的組合,進(jìn)行一次訓(xùn)練svm = SVC(gamma=gamma,C=c)# 5 折交叉驗(yàn)證scores = cross_val_score(svm,X_trainval,y_trainval,cv=5)score = scores.mean()# 找到表現(xiàn)最好的參數(shù)if score > best_score:best_score = scorebest_parameters = {'gamma':gamma,"C":c}# 使用最佳參數(shù),構(gòu)建新的模型 svm = SVC(**best_parameters)# 使用訓(xùn)練集和驗(yàn)證集進(jìn)行訓(xùn)練 more data always resultd in good performance svm.fit(X_trainval,y_trainval)# evalyation 模型評(píng)估 test_score = svm.score(X_test,y_test)print('Best socre:{:.2f}'.format(best_score)) print('Best parameters:{}'.format(best_parameters)) print('Best score on test set:{:.2f}'.format(test_score))# param_grid = {'C':[0.001,0.01,0.1,1,10,100],'gamma':[0.001,0.01,0.1,1,10,100]} # grid_search = GridSearchCV(SVC(),param_grid,cv=5) # score = cross_val_score(grid_search,iris_data.data,iris_data.target,cv=5) # print(len(score),score) # for i in range(len(score)): # print(score)''' 一般情況下,網(wǎng)格搜索嘗試所有參數(shù)的所有可能組合,但有時(shí)候會(huì)遇到“條件”參數(shù), 例如SVC有一個(gè)kernel參數(shù),如果kernel='linear',則模型只會(huì)用到C參數(shù),如果kernel='rbf', 則模型需要使用C和gamma兩個(gè)參數(shù)。如果kernel='linear',那么gamma參數(shù)是用不到的, 嘗試gamma的不同取值將會(huì)浪費(fèi)時(shí)間。因此,GridSearchCV的parm_grid可以是字典組成的列表, 列表中的每個(gè)字典可擴(kuò)展為一個(gè)獨(dú)立的網(wǎng)格 ''' # param_grid = {'C':[0.001,0.01,0.1,1,10,100],'gamma':[0.001,0.01,0.1,1,10,100]} # grid_search = GridSearchCV(SVC(),param_grid,cv=5) # X_trainval,X_test,y_trainval,y_test = train_test_split(iris_data.data,iris_data.target,random_state=0) # X_train ,X_val,y_train,y_val = train_test_split(X_trainval,y_trainval,random_state=1) # grid_search.fit(X_train,y_train) # scores_train = cross_val_score(grid_search,X_train,y_train,cv=5) # print("train set score:{:.2f}".format(scores_train.mean())) # print("Best parameters:{}".format(grid_search.best_params_)) # print("Best cross-validation score:{:.2f}".format(grid_search.best_score_)) # print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test))) # grid_search.fit(X_val,y_val) # scores_test = cross_val_score(grid_search,X_val,y_val,cv=5) # print("check set score:{:.2f}".format(scores_test.mean())) # print("Best parameters:{}".format(grid_search.best_params_)) # print("Best cross-validation score:{:.2f}".format(grid_search.best_score_)) # print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test)))# # #在非網(wǎng)格的空間中搜索 # param_grid = [{'kernel':['rbf'],'C':[0.001,0.01,0.1,1,10,100],'gamma':[0.001,0.01,0.1,1,10,100]},{'kernel':['linear'],'C':[0.001,0.01,0.1,1,10,100]}] # grid_search = GridSearchCV(SVC(),param_grid,cv=5) # X_trainval,X_test,y_trainval,y_test = train_test_split(iris_data.data,iris_data.target,random_state=0) # X_train ,X_val,y_train,y_val = train_test_split(X_trainval,y_trainval,random_state=1) # grid_search.fit(X_train,y_train) # scores_train = cross_val_score(grid_search,X_train,y_train,cv=5) # print("train set score:{:.2f}".format(scores_train.mean())) # print("Best parameters:{}".format(grid_search.best_params_)) # print("Best cross-validation score:{:.2f}".format(grid_search.best_score_)) # print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test))) # grid_search.fit(X_val,y_val) # scores_test = cross_val_score(grid_search,X_val,y_val,cv=5) # print("check set score:{:.2f}".format(scores_test.mean())) # print("Best parameters:{}".format(grid_search.best_params_)) # print("Best cross-validation score:{:.2f}".format(grid_search.best_score_)) # print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test)))'''交叉驗(yàn)證改進(jìn)SVM代碼Grid Search Best socre:0.97 Best parameters:{'gamma': 0.01, 'C': 100} Best score on test set:0.97 ''''''交叉驗(yàn)證改進(jìn)SVM代碼Grid Search Best socre:0.97 Best parameters:{'gamma': 0.01, 'C': 100} Best score on test set:0.97 ''''''2GridSearch網(wǎng)格搜索-線性向量機(jī)交叉驗(yàn)證 train set score:0.98 Best parameters:{'C': 10, 'gamma': 0.1} Best cross-validation score:0.99 Test set score:0.97check set score:0.94 Best parameters:{'C': 1, 'gamma': 0.1} Best cross-validation score:0.93 Test set score:0.92 ''''''2GridSearch網(wǎng)格搜索-非線性向量機(jī)交叉驗(yàn)證 train set score:0.98 Best parameters:{'C': 10, 'gamma': 0.1, 'kernel': 'rbf'} Best cross-validation score:0.99 Test set score:0.97 check set score:0.94 Best parameters:{'C': 1, 'gamma': 0.1, 'kernel': 'rbf'} Best cross-validation score:0.93 Test set score:0.92 '''? 交叉驗(yàn)證經(jīng)常與網(wǎng)絡(luò)搜索進(jìn)行結(jié)合,作為參數(shù)評(píng)價(jià)的一種方法,這種方法叫做grid search with cross validation。
sklearn因此設(shè)計(jì)了一個(gè)這樣的類GridSearchCV,這個(gè)類實(shí)現(xiàn)fit,predict,score等方法。被當(dāng)做一個(gè)estimator,使用fit方法,該過程中:
- (1) 搜索到最佳參數(shù)
- (2)實(shí)例化了一個(gè)最佳參數(shù)的estimator
3,隨機(jī)搜索—(RandomizedSearchCV)
? 所謂的模型配置,一般統(tǒng)稱為模型的超參數(shù)(Hyperparameters),比如KNN算法中的K值,SVM中不同的核函數(shù)(Kernal)等。多數(shù)情況下,超參數(shù)等選擇是無限的。在有限的時(shí)間內(nèi),除了可以驗(yàn)證人工預(yù)設(shè)幾種超參數(shù)組合以外,也可以通過啟發(fā)式的搜索方法對(duì)超參數(shù)組合進(jìn)行調(diào)優(yōu)。稱這種啟發(fā)式的超參數(shù)搜索方法為網(wǎng)格搜索。
我們?cè)谒阉鞒瑓?shù)的時(shí)候,如果超參數(shù)個(gè)數(shù)較少(三四個(gè)或者更少),那么我們可以采用網(wǎng)格搜索,一種窮盡式的搜索方法。但是當(dāng)超參數(shù)個(gè)數(shù)比較多的時(shí)候,我們?nèi)匀徊捎镁W(wǎng)格搜索,那么搜索所需時(shí)間將會(huì)指數(shù)級(jí)上升。
所以有人就提出了隨機(jī)搜索的方法,隨機(jī)在超參數(shù)空間中搜索幾十幾百個(gè)點(diǎn),其中就有可能有比較小的值。這種做法比上面稀疏化網(wǎng)格的做法快,而且實(shí)驗(yàn)證明,隨機(jī)搜索法結(jié)果比稀疏網(wǎng)格法稍好。
RandomizedSearchCV使用方法和類GridSearchCV 很相似,但他不是嘗試所有可能的組合,而是通過選擇每一個(gè)超參數(shù)的一個(gè)隨機(jī)值的特定數(shù)量的隨機(jī)組合,這個(gè)方法有兩個(gè)優(yōu)點(diǎn):
- 如果你讓隨機(jī)搜索運(yùn)行, 比如1000次,它會(huì)探索每個(gè)超參數(shù)的1000個(gè)不同的值(而不是像網(wǎng)格搜索那樣,只搜索每個(gè)超參數(shù)的幾個(gè)值)
- 你可以方便的通過設(shè)定搜索次數(shù),控制超參數(shù)搜索的計(jì)算量。
RandomizedSearchCV的使用方法其實(shí)是和GridSearchCV一致的,但它以隨機(jī)在參數(shù)空間中采樣的方式代替了GridSearchCV對(duì)于參數(shù)的網(wǎng)格搜索,在對(duì)于有連續(xù)變量的參數(shù)時(shí),RandomizedSearchCV會(huì)將其當(dāng)做一個(gè)分布進(jìn)行采樣進(jìn)行這是網(wǎng)格搜索做不到的,它的搜索能力取決于設(shè)定的n_iter參數(shù),同樣的給出代碼。
import numpy as np import pandas as pd import xgboost as xgb from sklearn.grid_search import RandomizedSearchCV#導(dǎo)入訓(xùn)練數(shù)據(jù) traindata = pd.read_csv("/traindata.txt",sep = ',') traindata = traindata.set_index('instance_id') trainlabel = traindata['is_trade'] del traindata['is_trade'] print(traindata.shape,trainlabel.shape)#分類器使用 xgboost clf1 = xgb.XGBClassifier()#設(shè)定搜索的xgboost參數(shù)搜索范圍,值搜索XGBoost的主要6個(gè)參數(shù) param_dist = {'n_estimators':range(80,200,4),'max_depth':range(2,15,1),'learning_rate':np.linspace(0.01,2,20),'subsample':np.linspace(0.7,0.9,20),'colsample_bytree':np.linspace(0.5,0.98,10),'min_child_weight':range(1,9,1)}#RandomizedSearchCV參數(shù)說明,clf1設(shè)置訓(xùn)練的學(xué)習(xí)器 #param_dist字典類型,放入?yún)?shù)搜索范圍 #scoring = 'neg_log_loss',精度評(píng)價(jià)方式設(shè)定為“neg_log_loss“ #n_iter=300,訓(xùn)練300次,數(shù)值越大,獲得的參數(shù)精度越大,但是搜索時(shí)間越長(zhǎng) #n_jobs = -1,使用所有的CPU進(jìn)行訓(xùn)練,默認(rèn)為1,使用1個(gè)CPU grid = RandomizedSearchCV(clf1,param_dist,cv = 3,scoring = 'neg_log_loss',n_iter=300,n_jobs = -1)#在訓(xùn)練集上訓(xùn)練 grid.fit(traindata.values,np.ravel(trainlabel.values)) #返回最優(yōu)的訓(xùn)練器 best_estimator = grid.best_estimator_ print(best_estimator) #輸出最優(yōu)訓(xùn)練器的精度 print(grid.best_score_)4,超參數(shù)搜索——網(wǎng)格搜索&并行搜索代碼
#-*- coding:utf-8 -*-#1.使用單線程對(duì)文本分類的樸素貝葉斯模型的超參數(shù)組合執(zhí)行網(wǎng)格搜索from sklearn.datasets import fetch_20newsgroups import numpy as np news = fetch_20newsgroups(subset='all') from sklearn.cross_validation import train_test_split #取前3000條新聞文本進(jìn)行數(shù)據(jù)分割 X_train,X_test,y_train,y_test=train_test_split(news.data[:3000],news.target[:3000],test_size=0.25,random_state=33)from sklearn.svm import SVC from sklearn.feature_extraction.text import TfidfVectorizer #*************導(dǎo)入pipeline************* from sklearn.pipeline import Pipeline #使用Pipeline簡(jiǎn)化系統(tǒng)搭建流程,sklean提供的pipeline來將多個(gè)學(xué)習(xí)器組成流水線,通常流水線的形式為: #將數(shù)據(jù)標(biāo)準(zhǔn)化的學(xué)習(xí)器---特征提取的學(xué)習(xí)器---執(zhí)行預(yù)測(cè)的學(xué)習(xí)器 #將文本特征與分類器模型串聯(lián)起來,[(),()]里有兩個(gè)參數(shù) #參數(shù)1:執(zhí)行 vect = TfidfVectorizer(stop_words='english',analyzer='word')操作 #參數(shù)2:執(zhí)行 svc = SVC()操作 clf = Pipeline([('vect',TfidfVectorizer(stop_words='english',analyzer='word')),('svc',SVC())])#這里需要試驗(yàn)的2個(gè)超參數(shù)svc_gamma和svc_C的元素個(gè)數(shù)分別為4、3,這樣我們一共有12種超參數(shù)對(duì)集合 #numpy.linspace用于創(chuàng)建等差數(shù)列,numpy.logspace用于創(chuàng)建等比數(shù)列 #logspace中,開始點(diǎn)和結(jié)束點(diǎn)是10的冪 #例如logspace(-2,1,4)表示起始數(shù)字為10^-2,結(jié)尾數(shù)字為10^1即10,元素個(gè)數(shù)為4的等比數(shù)列 #parameters變量里面的key都有一個(gè)前綴,這個(gè)前綴其實(shí)就是在Pipeline中定義的操作名。二者相結(jié)合,使我們的代碼變得十分簡(jiǎn)潔。 #還有注意的是,這里對(duì)參數(shù)名是<兩條>下劃線 __ parameters = {'svc__gamma':np.logspace(-2,1,4),'svc__C':np.logspace(-1,1,3)}#從sklearn.grid_search中導(dǎo)入網(wǎng)格搜索模塊GridSearchCV from sklearn.grid_search import GridSearchCV #GridSearchCV參數(shù)解釋: #1.estimator : estimator(評(píng)估) object. #2.param_grid : dict or list of dictionaries #3.verbose:Controls the verbosity(冗余度): the higher, the more messages. #4.refit:default=True, Refit(再次擬合)the best estimator with the entire dataset #5.cv : int, cross-validation generator 此處表示3折交叉驗(yàn)證 gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3)#執(zhí)行單線程網(wǎng)格搜索 gs.fit(X_train,y_train)print gs.best_params_,gs.best_score_#最后輸出最佳模型在測(cè)試集上的準(zhǔn)確性 print 'the accuracy of best model in test set is',gs.score(X_test,y_test)#2.使用多線程對(duì)文本分類的樸素貝葉斯模型的超參數(shù)組合執(zhí)行網(wǎng)格搜索 #n_jobs=-1,表示使用該計(jì)算機(jī)的全部cpu gs = GridSearchCV(clf,parameters,verbose=2,refit=True,cv=3,n_jobs=-1) gs.fit(X_train,y_train) print gs.best_params_,gs.best_score_ #輸出最佳模型在測(cè)試集上的準(zhǔn)確性 print 'the accuracy of best model in test set is',gs.score(X_test,y_test)#小結(jié): #1.由輸出結(jié)果可知,使用單線程的網(wǎng)格搜索技術(shù) 對(duì)樸素貝葉斯模型在文本分類任務(wù)中的超參數(shù)組合進(jìn)行調(diào)優(yōu), # 共有12組超參數(shù)組合*3折交叉驗(yàn)證 =36項(xiàng)獨(dú)立運(yùn)行的計(jì)算任務(wù) #2.在本機(jī)上,該過程一共運(yùn)行了2.9min,尋找到最佳的超參數(shù)組合在測(cè)試集上達(dá)到的分類準(zhǔn)確性為82.27%#小結(jié): #總?cè)蝿?wù)相同的情況下,使用并行搜索技術(shù)進(jìn)行計(jì)算的話,執(zhí)行時(shí)間只花費(fèi)了1.1min; #而且最終所得的的best_params_和score沒有發(fā)生變化,說明并行搜索可以在不影響準(zhǔn)確性的前提下, #有效的利用計(jì)算機(jī)的CPU資源,大大節(jié)省了最佳超參數(shù)的搜索時(shí)間。5, 超參數(shù)估計(jì)的隨機(jī)搜索和網(wǎng)格搜索的比較
使用的數(shù)據(jù)集是小數(shù)據(jù)集 手寫數(shù)字?jǐn)?shù)據(jù)集 load_digits() 分類 數(shù)據(jù)規(guī)模 5620*64(sklearn中的小數(shù)據(jù)可以直接使用,大數(shù)據(jù)集在第一次使用的時(shí)候會(huì)自動(dòng)下載)
比較隨機(jī)森林超參數(shù)優(yōu)化的隨機(jī)搜索和網(wǎng)格搜索。所有影響學(xué)習(xí)的參數(shù)都是同時(shí)搜索的(除了估計(jì)值的數(shù)量,它會(huì)造成時(shí)間/質(zhì)量的權(quán)衡)。
隨機(jī)搜索和網(wǎng)格搜索探索的是完全相同的參數(shù)空間。參數(shù)設(shè)置的結(jié)果非常相似,而隨機(jī)搜索的運(yùn)行時(shí)間要低的多。
隨機(jī)搜索的性能稍差,不過這很可能是噪聲效應(yīng),不會(huì)延續(xù)到外置測(cè)試集
注意:在實(shí)踐中,人們不會(huì)使用網(wǎng)格搜索同時(shí)搜索這么多不同的參數(shù),而是只選擇那些被認(rèn)為最重要的參數(shù)。
#_*_coding:utf-8_*_ # 輸出文件開頭注釋的內(nèi)容 __doc__的作用 ''' Python有個(gè)特性叫做文檔字符串,即DocString ,這個(gè)特性可以讓你的程序文檔更加清晰易懂 ''' print(__doc__) import numpy as np from time import time from scipy.stats import randint as sp_randintfrom sklearn.model_selection import GridSearchCV from sklearn.model_selection import RandomizedSearchCV from sklearn.datasets import load_digits from sklearn.ensemble import RandomForestClassifier# get some data digits = load_digits() X, y = digits.data , digits.target# build a classifier clf = RandomForestClassifier(n_estimators=20)# utility function to report best scores def report(results, n_top= 3):for i in range(1, n_top + 1):candidates = np.flatnonzero(results['rank_test_score'] == i)for candidate in candidates:print("Model with rank:{0}".format(i))print("Mean validation score : {0:.3f} (std: {1:.3f})".format(results['mean_test_score'][candidate],results['std_test_score'][candidate]))print("Parameters: {0}".format(results['params'][candidate]))print("")# 指定取樣的參數(shù)和分布 specify parameters and distributions to sample from param_dist = {"max_depth":[3,None],"max_features":sp_randint(1,11),"min_samples_split":sp_randint(2,11),"bootstrap":[True, False],"criterion":["gini","entropy"]}# run randomized search n_iter_search = 20 random_search = RandomizedSearchCV(clf,param_distributions=param_dist,n_iter=n_iter_search,cv =5) start = time() random_search.fit(X, y) print("RandomizedSearchCV took %.2f seconds for %d candidates"" parameter settings." % ((time() - start), n_iter_search)) report(random_search.cv_results_)# use a full grid over all parameters param_grid = {"max_depth":[3,None],"max_features":[1, 3, 10],"min_samples_split":[2, 3, 10],"bootstrap":[True, False],"criterion":["gini","entropy"]} # run grid search grid_search = GridSearchCV(clf, param_grid=param_grid, cv =5) start = time() grid_search.fit(X , y) print("GridSearchCV took %.2f seconds for %d candidate parameter settings."% (time() - start, len(grid_search.cv_results_['params']))) report(grid_search.cv_results_)''' RandomizedSearchCV took 6.20 seconds for 20 candidates parameter settings. Model with rank:1 Mean validation score : 0.930 (std: 0.031) Parameters: {'bootstrap': False, 'criterion': 'entropy', 'max_depth': None, 'max_features': 6, 'min_samples_split': 5}Model with rank:2 Mean validation score : 0.929 (std: 0.024) Parameters: {'bootstrap': False, 'criterion': 'entropy', 'max_depth': None, 'max_features': 6, 'min_samples_split': 9}Model with rank:3 Mean validation score : 0.924 (std: 0.020) Parameters: {'bootstrap': False, 'criterion': 'gini', 'max_depth': None, 'max_features': 3, 'min_samples_split': 6}Model with rank:1 Mean validation score : 0.932 (std: 0.023) Parameters: {'bootstrap': False, 'criterion': 'gini', 'max_depth': None, 'max_features': 10, 'min_samples_split': 3}Model with rank:2 Mean validation score : 0.931 (std: 0.014) Parameters: {'bootstrap': False, 'criterion': 'gini', 'max_depth': None, 'max_features': 3, 'min_samples_split': 3}Model with rank:3 Mean validation score : 0.929 (std: 0.021) Parameters: {'bootstrap': False, 'criterion': 'entropy', 'max_depth': None, 'max_features': 3, 'min_samples_split': 2} '''二、scikit-learn GridSearch庫(kù)概述
sklearn的Grid Search官網(wǎng)地址:請(qǐng)點(diǎn)擊我
1,GridSearchCV簡(jiǎn)介
? GridSearchCV,它存在的意義就是自動(dòng)調(diào)參,只要把參數(shù)輸進(jìn)去,就能給出最優(yōu)化結(jié)果和參數(shù)。但是這個(gè)方法適合于小數(shù)據(jù)集,一旦數(shù)據(jù)的量級(jí)上去了,很難得到結(jié)果。這個(gè)時(shí)候就需要?jiǎng)幽X筋了。數(shù)據(jù)量比較大的時(shí)候可以使用一個(gè)快速調(diào)優(yōu)的方法——坐標(biāo)下降。它其實(shí)是一種貪心算法:拿當(dāng)前對(duì)模型影響最大的參數(shù)調(diào)參,直到最優(yōu)化;再拿下一個(gè)影響最大的參數(shù)調(diào)優(yōu),如此下去,直到所有的參數(shù)調(diào)整完畢。這個(gè)方法的缺點(diǎn)就是可能會(huì)跳到局部最優(yōu)而不是全局最優(yōu),但是省時(shí)間省力,巨大的優(yōu)勢(shì)面前,還是試一試,后續(xù)可以再拿bagging再優(yōu)化。
通常算法不夠好,需要調(diào)試參數(shù)時(shí)必不可少。比如SVM的懲罰因子C,核函數(shù)kernel,gamma參數(shù)等,對(duì)于不同的數(shù)據(jù)使用不同的參數(shù),結(jié)果效果可能差1~5個(gè)點(diǎn),sklearn為我們專門調(diào)試參數(shù)的函數(shù)grid_search。
2,GridSearchCV參數(shù)說明
class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=None, iid=’warn’, refit=True, cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’, return_train_score=’warn’)3,進(jìn)行預(yù)測(cè)的常用方法和屬性
- grid.fit() :運(yùn)行網(wǎng)格搜索
- grid_scores_ :給出不同參數(shù)情況下的評(píng)價(jià)結(jié)果
- best_params_ :描述了已取得最佳結(jié)果的參數(shù)的組合
- best_score_ :提供優(yōu)化過程期間觀察到的最好的評(píng)分
- cv_results_ :具體用法模型不同參數(shù)下交叉驗(yàn)證的結(jié)果
4,GridSearchCV屬性說明
具有鍵作為列標(biāo)題和值作為列的dict,可以導(dǎo)入到DataFrame中。注意,“params”鍵用于存儲(chǔ)所有參數(shù)候選項(xiàng)的參數(shù)設(shè)置列表。
best_estimator_ : estimator
通過搜索選擇的估計(jì)器,即在左側(cè)數(shù)據(jù)上給出最高分?jǐn)?shù)(或指定的最小損失)的估計(jì)器。如果refit = False,則不可用。
best_score_ :float best_estimator的分?jǐn)?shù)
best_parmas_ : dict 在保存數(shù)據(jù)上給出最佳結(jié)果的參數(shù)設(shè)置
best_index_ : int 對(duì)應(yīng)于最佳候選參數(shù)設(shè)置的索引(cv_results_數(shù)組)_
search.cv_results _ [‘params’][search.best_index][‘params’][search.best\_index][‘params’][search.best_index]中的dict給出了最佳模型的參數(shù)設(shè)置,給出了最高的平均分?jǐn)?shù)(search.best_score)。
scorer_ : function
Scorer function used on the held out data to choose the best parameters for the model.
n_splits_ : int
The number of cross-validation splits (folds/iterations).
5,利用決策樹預(yù)測(cè)乳腺癌的例子(網(wǎng)格搜索算法優(yōu)化)
5.1 網(wǎng)格搜索算法與K折交叉驗(yàn)證理論知識(shí)
? 網(wǎng)格搜索算法是一種通過遍歷給定的參數(shù)組合來優(yōu)化模型表現(xiàn)的方法。
以決策樹為例,當(dāng)我們確定了要使用決策樹算法的時(shí)候,為了能夠更好地?cái)M合和預(yù)測(cè),我們需要調(diào)整它的參數(shù)。在決策樹算法中,我們通常選擇的參數(shù)是決策樹的最大深度。
于是下面我們會(huì)給出一系列的最大深度的值,比如{‘max_depth’:[1,2,3,4,5] },我們就會(huì)盡可能包含最優(yōu)最大深度。
不過我們?nèi)绾沃滥膫€(gè)最大深度的模型是最好的呢?我們需要一種可靠的評(píng)分方法,對(duì)每個(gè)最大深度的決策樹模型都進(jìn)行評(píng)價(jià),這其中非常經(jīng)典的一種方法就是交叉驗(yàn)證,下面我們就以K折交叉驗(yàn)證為例,詳細(xì)介紹一下其算法過程。
首先我們先看一下數(shù)據(jù)集時(shí)如何分割的,我們拿到的原始數(shù)據(jù)集首先會(huì)按照一定的比例劃分出訓(xùn)練集和測(cè)試集。比如下圖,以8:2分割的數(shù)據(jù)集:
? 訓(xùn)練集是用來訓(xùn)練我們的模型,它的作用就像我們平時(shí)做的練習(xí)題;測(cè)試集用來評(píng)估我們訓(xùn)練好的模型表現(xiàn)如何,它不能被提前被模型看到。
因此,在K折交叉驗(yàn)證中,我們用到的數(shù)據(jù)是訓(xùn)練集中的所有數(shù)據(jù),我們將訓(xùn)練集的所有數(shù)據(jù)平均劃分出K份(通常選擇K=10),取第K份作為驗(yàn)證集,它的作用就像我們用來估計(jì)高考分?jǐn)?shù)的模擬題,余下的K-1份作為交叉驗(yàn)證的訓(xùn)練集。
對(duì)于我們最開始選擇的決策樹的5個(gè)最大深度,以max_depth=1為例,我們先用第2-10份數(shù)據(jù)作為訓(xùn)練集訓(xùn)練模型,用第一份數(shù)據(jù)作為驗(yàn)證集對(duì)這次訓(xùn)練的模型進(jìn)行評(píng)分,得到第一個(gè)分?jǐn)?shù);然后重新構(gòu)建一個(gè)max_depth = 1的決策樹,用第1和3-10份數(shù)據(jù)作為訓(xùn)練集訓(xùn)練模型,用第2份數(shù)據(jù)作為驗(yàn)證集對(duì)這次訓(xùn)練的模型進(jìn)行評(píng)分,得到第二個(gè)分?jǐn)?shù)…以此類推,最后構(gòu)建一個(gè)max_depth = 1的決策樹用第1-9份數(shù)據(jù)作為訓(xùn)練集訓(xùn)練模型,用第10份數(shù)據(jù)作為驗(yàn)證集對(duì)這次訓(xùn)練的模型進(jìn)行評(píng)分,得到10個(gè)驗(yàn)證分?jǐn)?shù),然后計(jì)算著10個(gè)驗(yàn)證分?jǐn)?shù)的平均分?jǐn)?shù),就是max_depth = 1的決策樹模型的最終驗(yàn)證分?jǐn)?shù)。
? 對(duì)于max_depth = 2,3,4,5時(shí),分別進(jìn)行和max_depth =1 相同的交叉驗(yàn)證過程,得到他們的最終驗(yàn)證分?jǐn)?shù),然后我們就可以對(duì)這5個(gè)最大深度的決策樹的最終驗(yàn)證分?jǐn)?shù)進(jìn)行比較,分?jǐn)?shù)最高的那個(gè)就是最優(yōu)最大深度,我們利用最優(yōu)參數(shù)在全部訓(xùn)練集上訓(xùn)練一個(gè)新的模型,整個(gè)模型就是最優(yōu)模型。
5.2 簡(jiǎn)單的利用決策樹預(yù)測(cè)乳腺癌的例子
from sklearn.model_selection import GridSearchCV,KFold,train_test_split from sklearn.metrics import make_scorer , accuracy_score from sklearn.tree import DecisionTreeClassifier from sklearn.datasets import load_breast_cancer import warnings from sklearn.neighbors import KNeighborsClassifier as KNNwarnings.filterwarnings('ignore')# load data data = load_breast_cancer() print(data.data.shape) print(data.target.shape) # (569, 30) # (569,) X,y = data['data'] , data['target']X_train,X_test,y_train,y_test = train_test_split(X,y,train_size=0.8 , random_state=0 )regressor = DecisionTreeClassifier(random_state=0) parameters = {'max_depth':range(1,6)} scorin_fnc = make_scorer(accuracy_score) kflod = KFold(n_splits=10)grid = GridSearchCV(regressor,parameters,scorin_fnc,cv=kflod) grid = grid.fit(X_train,y_train) reg = grid.best_estimator_print('best score:%f'%grid.best_score_) print('best parameters:') for key in parameters.keys():print('%s:%d'%(key,reg.get_params()[key]))print('test score : %f'%reg.score(X_test,y_test))# import pandas as pd # pd.DataFrame(grid.cv_results_).T# 引入KNN訓(xùn)練方法 knn = KNN() # 進(jìn)行填充測(cè)試數(shù)據(jù)進(jìn)行訓(xùn)練 knn.fit(X_train,y_train) params = knn.get_params() score = knn.score(X_test,y_test) print("KNN 預(yù)測(cè)得分為:%s"%score)'''輸出結(jié)果 (569, 30) (569,) best score:0.938462 best parameters: max_depth:4 test score : 0.956140 KNN 預(yù)測(cè)得分為:0.9385964912280702 '''6,存在問題
問題一:AttributeError: ‘GridSearchCV’ object has no attribute 'grid_scores_'
#Python運(yùn)行代碼的時(shí)候,到gsearch1.grid_scores_ 時(shí)報(bào)錯(cuò): AttributeError: 'GridSearchCV' object has no attribute 'grid_scores_' #原因: #之所以出現(xiàn)以上問題,原因在于grid_scores_在sklearn0.20版本中已被刪除,取而代之的是cv_results_。#解決方法: #將下面代碼: a,b,c = gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_ #改為 a,b,c = gsearch1.cv_results_, gsearch1.best_params_, gsearch1.best_score_問題二:ModuleNotFoundError: No module named ‘sklearn.grid_search’
#問題描述: # Python運(yùn)行代碼時(shí)候,到from sklearn.grid_search import GridSearchCV時(shí)報(bào)錯(cuò):ModuleNotFoundError: No module named 'sklearn.grid_search' #原因: # sklearn.grid_search模塊在0.18版本中被棄用,它所支持的類轉(zhuǎn)移到model_selection 模#板中。還要注意,新的CV迭代器的接口與這個(gè)模塊的接口不同,sklearn.grid_search在0.20中#被刪除。 #解決方法: #將下面代碼 from sklearn.grid_search import GridSearchCV #修改成: from sklearn.model_selection import GridSearchCV參考文獻(xiàn):https://blog.51cto.com/emily18/2088128
https://blog.csdn.net/jh1137921986/article/details/79827945
https://blog.csdn.net/juezhanangle/article/details/80051256
https://www.cnblogs.com/wj-1314/p/10422159.html
總結(jié)
以上是生活随笔為你收集整理的Python机器学习笔记 GridSearchCV的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java communal_平台用英语怎
- 下一篇: Rstudio调用plot()函数时,出