当前位置: 首页 > news >正文

律师做网站有用国外网站在国内做节点

律师做网站有用,国外网站在国内做节点,河北百度seo,wordpress做表格插件转载声明介绍在机器学习模型中#xff0c;需要人工选择的参数称为超参数。比如随机森林中决策树的个数#xff0c;人工神经网络模型中隐藏层层数和每层的节点个数#xff0c;正则项中常数大小等等#xff0c;他们都需要事先指定。超参数选择不恰当#xff0c;就会出现欠拟…转载声明介绍在机器学习模型中需要人工选择的参数称为超参数。比如随机森林中决策树的个数人工神经网络模型中隐藏层层数和每层的节点个数正则项中常数大小等等他们都需要事先指定。超参数选择不恰当就会出现欠拟合或者过拟合的问题。而在选择超参数的时候有两个途径一个是凭经验微调另一个就是选择不同大小的参数带入模型中挑选表现最好的参数。微调的一种方法是手工调制超参数直到找到一个好的超参数组合这么做的话会非常冗长你也可能没有时间探索多种组合所以可以使用Scikit-Learn的GridSearchCV来做这项搜索工作。下面让我们一一探索。为什么叫网格搜索(GridSearchCV)GridSearchCV的名字其实可以拆分为两部分GridSearch和CV即网格搜索和交叉验证。这两个名字都非常好理解。网格搜索搜索的是参数即在指定的参数范围内按步长依次调整参数利用调整的参数训练学习器从所有的参数中找到在验证集上精度最高的参数这其实是一个训练和比较的过程。GridSearchCV可以保证在指定的参数范围内找到精度最高的参数但是这也是网格搜索的缺陷所在他要求遍历所有可能参数的组合在面对大数据集和多参数的情况下非常耗时。什么是Grid Search网格搜索Grid Search一种调参手段穷举搜索在所有候选的参数选择中通过循环遍历尝试每一种可能性表现最好的参数就是最终的结果。其原理就像是在数组里找到最大值。这种方法的主要缺点是比较耗时所以网格搜索适用于三四个(或者更少)的超参数(当超参数的数量增长时网格搜索的计算复杂度会呈现指数增长这时候则使用随机搜索)用户列出一个较小的超参数值域这些超参数至于的笛卡尔积(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型并挑选验证集误差最小的超参数组合。以随机森林为例说明GridSearch网格搜索下面代码我们要搜索两种网格一种是n_estimators一种是max_features。GridSearch会挑选出最适合的超参数值。1234567891011from sklearn.model_selection import GridSearchCVparam_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, cv5,scoringneg_mean_squared_error)grid_search.fit(housing_prepared, housing_labels)sklearn 根据param_grid的值首先会评估3×412种n_estimators和max_features的组合方式接下来在会在bootstrapFalse的情况下(默认该值为True)评估2×36种12种n_estimators和max_features的组合方式所以最终会有12618种不同的超参数组合方式,而每一种组合方式要在训练集上训练5次 所以一共要训练18×590 次当训练结束后你可以通过best_params_获得最好的组合方式。1grid_search.best_params_输出结果如下1{‘max_features’: 8, ‘n_estimators’: 30}得到最好的模型1grid_search.best_estimator_输出如下123456RandomForestRegressor(bootstrapTrue, criterion‘mse’, max_depthNone,max_features8, max_leaf_nodesNone, min_impurity_decrease0.0,min_impurity_splitNone, min_samples_leaf1,min_samples_split2, min_weight_fraction_leaf0.0,n_estimators30, n_jobs1, oob_scoreFalse, random_stateNone,verbose0, warm_startFalse)如果GridSearchCV初始化时refitTrue(默认的初始化值),在交叉验证时一旦发现最好的模型(estimator),将会在整个训练集上重新训练这通常是一个好主意因为使用更多的数据集会提升模型的性能。以上面有两个参数的模型为例参数a有3中可能参数b有4种可能把所有可能性列出来可以表示成一个3*4的表格其中每个cell就是一个网格循环过程就像是在每个网格里遍历搜索所以叫grid search。以Xgboost为例说明GridSearch网格搜索下面以阿里IJCAI广告推荐数据集与XgboostClassifier分类器为例用代码形式说明sklearn中GridSearchCV的使用方法。(此小例的代码是参考这里请点击我)1234567891011121314151617181920212223242526272829303132333435363738394041import numpy as npimport pandas as pdimport xgboost as xgbfrom sklearn.grid_search import GridSearchCV#导入训练数据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)#分类器使用 xgboostclf1 xgb.XGBClassifier()#设定网格搜索的xgboost参数搜索范围值搜索XGBoost的主要6个参数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参数说明clf1设置训练的学习器#param_dist字典类型放入参数搜索范围#scoring neg_log_loss精度评价方式设定为“neg_log_loss“#n_iter300训练300次数值越大获得的参数精度越大但是搜索时间越长#n_jobs -1使用所有的CPU进行训练默认为1使用1个CPUgrid GridSearchCV(clf1,param_dist,cv 3,scoring neg_log_loss,n_iter300,n_jobs -1)#在训练集上训练grid.fit(traindata.values,np.ravel(trainlabel.values))#返回最优的训练器best_estimator grid.best_estimator_print(best_estimator)#输出最优训练器的精度这里关于网格搜索的几个参数在说明一下评分参数“scoring”需要根据实际的评价标准设定阿里的IJCAI的标准时“neg_log_loss”所以这里设定为“neg_log_loss”sklearn中备选的评价标准如下在一些情况下sklearn中没有现成的评价函数sklearn是允许我们自定义的但是需要注意格式。接下来看一下我们定义的评价函数1234567891011121314import numpy as npfrom 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参数决定了自定义的评价指标是越大越好还是越小越好loss make_scorer(logloss, greater_is_betterFalse)score make_scorer(logloss, greater_is_betterTrue)定义好以后再将其带入GridSearchCV函数就好。这里再贴一下常用的集成学习算法比较重要的需要调参的参数以SVR为例说明GridSearch网格搜索以两个参数的调优过程为例12345678910111213141516171819202122from sklearn.datasets import load_irisfrom sklearn.svm import SVCfrom sklearn.model_selection import train_test_splitiris_data load_iris()X_train,X_test,y_train,y_test train_test_split(iris_data.data,iris_data.target,random_state0)# grid search startbest_score 0for gamma in [0.001,0.01,1,10,100]:for c in [0.001,0.01,1,10,100]:# 对于每种参数可能的组合进行一次训练svm SVC(gammagamma,Cc)svm.fit(X_train,y_train)score svm.score(X_test,y_test)# 找到表现最好的参数if score best_score:best_score scorebest_parameters {gamma:gamma,C:c}print(Best socre:{:.2f}.format(best_score))print(Best parameters:{}.format(best_parameters))输出结果12Best socre:0.97Best parameters:{gamma: 0.001, C: 100}2.4 上面调参存在的问题是什么呢原始数据集划分成训练集和测试集以后其中测试集除了用作调整参数也用来测量模型的好坏这样做导致最终的评分结果比实际效果好。(因为测试集在调参过程中送到了模型里而我们的目的是将训练模型应用到unseen data上)。2.5 解决方法是什么呢对训练集再进行一次划分分为训练集和验证集这样划分的结果就是原始数据划分为3份分别为训练集验证集和测试集其中训练集用来模型训练验证集用来调整参数而测试集用来衡量模型表现好坏。代码123456789101112131415161718192021222324252627282930313233from sklearn.datasets import load_irisfrom sklearn.svm import SVCfrom sklearn.model_selection import train_test_splitiris_data load_iris()# X_train,X_test,y_train,y_test train_test_split(iris_data.data,iris_data.target,random_state0)X_trainval,X_test,y_trainval,y_test train_test_split(iris_data.data,iris_data.target,random_state0)X_train ,X_val,y_train,y_val train_test_split(X_trainval,y_trainval,random_state1)# grid search startbest_score 0for gamma in [0.001,0.01,1,10,100]:for c in [0.001,0.01,1,10,100]:# 对于每种参数可能的组合进行一次训练svm SVC(gammagamma,Cc)svm.fit(X_train,y_train)score svm.score(X_val,y_val)# 找到表现最好的参数if score best_score:best_score scorebest_parameters {gamma:gamma,C:c}# 使用最佳参数构建新的模型svm SVC(**best_parameters)# 使用训练集和验证集进行训练 more data always resultd in good performancesvm.fit(X_trainval,y_trainval)# evalyation 模型评估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))结果123Best socre:0.96Best parameters:{gamma: 0.001, C: 10}Best score on test set:0.92然而这种简洁的grid search方法其最终的表现好坏与初始数据的划分结果有很大的关系为了处理这种情况我们采用交叉验证的方式来减少偶然性。2.6交叉验证改进SVM代码(Grid Search with Cross Validation)代码12345678910111213141516171819202122232425262728293031323334from sklearn.datasets import load_irisfrom sklearn.svm import SVCfrom sklearn.model_selection import train_test_split,cross_val_scoreiris_data load_iris()# X_train,X_test,y_train,y_test train_test_split(iris_data.data,iris_data.target,random_state0)X_trainval,X_test,y_trainval,y_test train_test_split(iris_data.data,iris_data.target,random_state0)X_train ,X_val,y_train,y_val train_test_split(X_trainval,y_trainval,random_state1)# grid search startbest_score 0for gamma in [0.001,0.01,1,10,100]:for c in [0.001,0.01,1,10,100]:# 对于每种参数可能的组合进行一次训练svm SVC(gammagamma,Cc)# 5 折交叉验证scores cross_val_score(svm,X_trainval,y_trainval,cv5)score scores.mean()# 找到表现最好的参数if score best_score:best_score scorebest_parameters {gamma:gamma,C:c}# 使用最佳参数构建新的模型svm SVC(**best_parameters)# 使用训练集和验证集进行训练 more data always resultd in good performancesvm.fit(X_trainval,y_trainval)# evalyation 模型评估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))结果123Best socre:0.97Best parameters:{gamma: 0.01, C: 100}Best score on test set:0.97交叉验证经常与网络搜索进行结合作为参数评价的一种方法这种方法叫做grid search with cross validation。sklearn因此设计了一个这样的类GridSearchCV这个类实现fitpredictscore等方法。被当做一个estimator使用fit方法该过程中(1) 搜索到最佳参数(2)实例化了一个最佳参数的estimator3RandomizedSearchCV——(随机搜索)文献地址可以参考请点击我所谓的模型配置一般统称为模型的超参数(Hyperparameters)比如KNN算法中的K值SVM中不同的核函数(Kernal)等。多数情况下超参数等选择是无限的。在有限的时间内除了可以验证人工预设几种超参数组合以外也可以通过启发式的搜索方法对超参数组合进行调优。称这种启发式的超参数搜索方法为网格搜索。我们在搜索超参数的时候如果超参数个数较少(三四个或者更少)那么我们可以采用网格搜索一种穷尽式的搜索方法。但是当超参数个数比较多的时候我们仍然采用网格搜索那么搜索所需时间将会指数级上升。所以有人就提出了随机搜索的方法随机在超参数空间中搜索几十几百个点其中就有可能有比较小的值。这种做法比上面稀疏化网格的做法快而且实验证明随机搜索法结果比稀疏网格法稍好。RandomizedSearchCV使用方法和类GridSearchCV 很相似但他不是尝试所有可能的组合而是通过选择每一个超参数的一个随机值的特定数量的随机组合这个方法有两个优点如果你让随机搜索运行 比如1000次它会探索每个超参数的1000个不同的值(而不是像网格搜索那样只搜索每个超参数的几个值)你可以方便的通过设定搜索次数控制超参数搜索的计算量。RandomizedSearchCV的使用方法其实是和GridSearchCV一致的但它以随机在参数空间中采样的方式代替了GridSearchCV对于参数的网格搜索在对于有连续变量的参数时RandomizedSearchCV会将其当做一个分布进行采样进行这是网格搜索做不到的它的搜索能力取决于设定的n_iter参数同样的给出代码。代码如下1234567891011121314151617181920212223242526272829303132333435363738394041import numpy as npimport pandas as pdimport xgboost as xgbfrom sklearn.grid_search import RandomizedSearchCV#导入训练数据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)#分类器使用 xgboostclf1 xgb.XGBClassifier()#设定搜索的xgboost参数搜索范围值搜索XGBoost的主要6个参数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参数说明clf1设置训练的学习器#param_dist字典类型放入参数搜索范围#scoring neg_log_loss精度评价方式设定为“neg_log_loss“#n_iter300训练300次数值越大获得的参数精度越大但是搜索时间越长#n_jobs -1使用所有的CPU进行训练默认为1使用1个CPUgrid RandomizedSearchCV(clf1,param_dist,cv 3,scoring neg_log_loss,n_iter300,n_jobs -1)#在训练集上训练grid.fit(traindata.values,np.ravel(trainlabel.values))#返回最优的训练器best_estimator grid.best_estimator_print(best_estimator)#输出最优训练器的精度print(grid.best_score_)建议使用随机搜索。超参数搜索——网格搜索并行搜索代码12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849#-*- coding:utf-8 -*-#1.使用单线程对文本分类的朴素贝叶斯模型的超参数组合执行网格搜索from sklearn.datasets import fetch_20newsgroupsimport numpy as npnews fetch_20newsgroups(subsetall)from sklearn.cross_validation import train_test_split#取前3000条新闻文本进行数据分割X_train,X_test,y_train,y_testtrain_test_split(news.data[:3000],news.target[:3000],test_size0.25,random_state33)from sklearn.svm import SVCfrom sklearn.feature_extraction.text import TfidfVectorizer#*************导入pipeline*************from sklearn.pipeline import Pipeline#使用Pipeline简化系统搭建流程sklean提供的pipeline来将多个学习器组成流水线通常流水线的形式为#将数据标准化的学习器---特征提取的学习器---执行预测的学习器#将文本特征与分类器模型串联起来,[(),()]里有两个参数#参数1:执行 vect TfidfVectorizer(stop_wordsenglish,analyzerword)操作#参数2:执行 svc SVC()操作clf Pipeline([(vect,TfidfVectorizer(stop_wordsenglish,analyzerword)),(svc,SVC())])#这里需要试验的2个超参数svc_gamma和svc_C的元素个数分别为4、3,这样我们一共有12种超参数对集合#numpy.linspace用于创建等差数列numpy.logspace用于创建等比数列#logspace中开始点和结束点是10的幂#例如logspace(-2,1,4)表示起始数字为10^-2结尾数字为10^1即10元素个数为4的等比数列#parameters变量里面的key都有一个前缀,这个前缀其实就是在Pipeline中定义的操作名。二者相结合使我们的代码变得十分简洁。#还有注意的是这里对参数名是下划线 __parameters {svc__gamma:np.logspace(-2,1,4),svc__C:np.logspace(-1,1,3)}#从sklearn.grid_search中导入网格搜索模块GridSearchCVfrom sklearn.grid_search import GridSearchCV#GridSearchCV参数解释:#1.estimator : estimator(评估) object.#2.param_grid : dict or list of dictionaries#3.verbose:Controls the verbosity(冗余度): the higher, the more messages.#4.refit:defaultTrue, Refit(再次拟合)the best estimator with the entire dataset#5.cv : int, cross-validation generator 此处表示3折交叉验证gs GridSearchCV(clf,parameters,verbose2,refitTrue,cv3)#执行单线程网格搜索gs.fit(X_train,y_train)print gs.best_params_,gs.best_score_#最后输出最佳模型在测试集上的准确性print the accuracy of best model in test set is,gs.score(X_test,y_test)#小结#1.由输出结果可知使用单线程的网格搜索技术 对朴素贝叶斯模型在文本分类任务中的超参数组合进行调优共有12组超参数组合*3折交叉验证 36项独立运行的计算任务#2.在本机上该过程一共运行了2.9min寻找到最佳的超参数组合在测试集上达到的分类准确性为82.27%#2.使用多线程对文本分类的朴素贝叶斯模型的超参数组合执行网格搜索1234567891011#n_jobs-1,表示使用该计算机的全部cpugs GridSearchCV(clf,parameters,verbose2,refitTrue,cv3,n_jobs-1)gs.fit(X_train,y_train)print gs.best_params_,gs.best_score_#输出最佳模型在测试集上的准确性print the accuracy of best model in test set is,gs.score(X_test,y_test)#小结#总任务相同的情况下使用并行搜索技术进行计算的话执行时间只花费了1.1min#而且最终所得的的best_params_和score没有发生变化说明并行搜索可以在不影响准确性的前提下#有效的利用计算机的CPU资源大大节省了最佳超参数的搜索时间。4 超参数估计的随机搜索和网格搜索的比较使用的数据集是小数据集 手写数字数据集 load_digits() 分类 数据规模 5620*64(sklearn中的小数据可以直接使用大数据集在第一次使用的时候会自动下载)比较随机森林超参数优化的随机搜索和网格搜索。所有影响学习的参数都是同时搜索的(除了估计值的数量它会造成时间/质量的权衡)。随机搜索和网格搜索探索的是完全相同的参数空间。参数设置的结果非常相似而随机搜索的运行时间要低的多。随机搜索的性能稍差不过这很可能是噪声效应不会延续到外置测试集注意在实践中人们不会使用网格搜索同时搜索这么多不同的参数而是只选择那些被认为最重要的参数。代码如下123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293#_*_coding:utf-8_*_# 输出文件开头注释的内容 __doc__的作用Python有个特性叫做文档字符串即DocString 这个特性可以让你的程序文档更加清晰易懂print(__doc__)import numpy as npfrom time import timefrom scipy.stats import randint as sp_randintfrom sklearn.model_selection import GridSearchCVfrom sklearn.model_selection import RandomizedSearchCVfrom sklearn.datasets import load_digitsfrom sklearn.ensemble import RandomForestClassifier# get some datadigits load_digits()X, y digits.data , digits.target# build a classifierclf RandomForestClassifier(n_estimators20)# utility function to report best scoresdef 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()# 指定取样的参数和分布 specify parameters and distributions to sample fromparam_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 searchn_iter_search 20random_search RandomizedSearchCV(clf,param_distributionsparam_dist,n_itern_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 parametersparam_grid {max_depth:[3,None],max_features:[1, 3, 10],min_samples_split:[2, 3, 10],bootstrap:[True, False],criterion:[gini,entropy]}# run grid searchgrid_search GridSearchCV(clf, param_gridparam_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:1Mean 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:2Mean 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:3Mean 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:1Mean 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:2Mean 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:3Mean 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库概述sklearn的Grid Search官网地址请点击我GridSearchCV简介GridSearchCV它存在的意义就是自动调参只要把参数输进去就能给出最优化结果和参数。但是这个方法适合于小数据集一旦数据的量级上去了很难得到结果。这个时候就需要动脑筋了。数据量比较大的时候可以使用一个快速调优的方法——坐标下降。它其实是一种贪心算法拿当前对模型影响最大的参数调参直到最优化再拿下一个影响最大的参数调优如此下去直到所有的参数调整完毕。这个方法的缺点就是可能会跳到局部最优而不是全局最优但是省时间省力巨大的优势面前还是试一试后续可以再拿bagging再优化。通常算法不够好需要调试参数时必不可少。比如SVM的惩罚因子C核函数kernelgamma参数等对于不同的数据使用不同的参数结果效果可能差1~5个点sklearn为我们专门调试参数的函数grid_search。GridSearchCV参数说明参数如下123class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoringNone,fit_paramsNone, n_jobsNone, iid’warn’, refitTrue, cv’warn’, verbose0,pre_dispatch‘2*n_jobs’, error_score’raise-deprecating’, return_train_score’warn’)说明如下1)estimator选择使用的分类器并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数或者score方法如estimator RandomForestClassifier(min_sample_split100,min_samples_leaf 20,max_depth 8,max_features ‘sqrt’ , random_state 10),2)param_grid需要最优化的参数的取值值为字典或者列表例如param_grid param_test1,param_test1 {‘n_estimators’ : range(10,71,10)}3)scoring None 模型评价标准默认为None这时需要使用score函数或者如scoring ‘roc_auc’根据所选模型不同评价准则不同字符串(函数名)或是可调用对象需要其函数签名形如scorer(estimatorXy)如果是None则使用estimator的误差估计函数。4)fit_para,s None5)n_jobs 1 n_jobs并行数int个数-1跟CPU核数一致1默认值6)iid Trueiid默认为True为True时默认为各个样本fold概率分布一致误差估计为所有样本之和而非各个fold的平均。7)refit True 默认为True程序将会以交叉验证训练集得到的最佳参数重新对所有可能的训练集与开发集进行作为最终用于性能评估的最佳模型参数。即在搜索参数结束后用最佳参数结果再次fit一遍全部数据集。8)cv None交叉验证参数默认None使用三折交叉验证。指定fold数量默认为3也可以是yield训练/测试数据的生成器。9)verbose 0 ,scoring None  verbose日志冗长度int冗长度0不输出训练过程1偶尔输出1对每个子模型都输出。10)pre_dispatch ‘2*n_jobs’ 指定总共发的并行任务数当n_jobs大于1时候数据将在每个运行点进行复制这可能导致OOM而设置pre_dispatch参数则可以预先划分总共的job数量使数据最多被复制pre_dispatch次。##进行预测的常用方法和属性grid.fit() 运行网格搜索grid_scores_ 给出不同参数情况下的评价结果best_params_ 描述了已取得最佳结果的参数的组合best_score_ 提供优化过程期间观察到的最好的评分cv_results_ 具体用法模型不同参数下交叉验证的结果4GridSearchCV属性说明(1) cv_results_ : dict of numpy (masked) ndarrays具有键作为列标题和值作为列的dict可以导入到DataFrame中。注意“params”键用于存储所有参数候选项的参数设置列表。(2) best_estimator_ : estimator通过搜索选择的估计器即在左侧数据上给出最高分数(或指定的最小损失)的估计器。如果refit False则不可用。(3)best_score_ float best_estimator的分数(4)best_parmas_ : dict 在保存数据上给出最佳结果的参数设置(5) best_index_ : int 对应于最佳候选参数设置的索引(cv_results_数组)search.cv_results _ [‘params’] [search.best_index_]中的dict给出了最佳模型的参数设置给出了最高的平均分数(search.best_score_)。(6)scorer_ : functionScorer function used on the held out data to choose the best parameters for the model.(7)n_splits_ : intThe number of cross-validation splits (folds/iterations).利用决策树预测乳腺癌的例子(网格搜索算法优化)网格搜索算法与K折交叉验证理论知识网格搜索算法是一种通过遍历给定的参数组合来优化模型表现的方法。以决策树为例当我们确定了要使用决策树算法的时候为了能够更好地拟合和预测我们需要调整它的参数。在决策树算法中我们通常选择的参数是决策树的最大深度。于是下面我们会给出一系列的最大深度的值比如{‘max_depth’[1,2,3,4,5] }我们就会尽可能包含最优最大深度。不过我们如何知道哪个最大深度的模型是最好的呢我们需要一种可靠的评分方法对每个最大深度的决策树模型都进行评价这其中非常经典的一种方法就是交叉验证下面我们就以K折交叉验证为例详细介绍一下其算法过程。首先我们先看一下数据集时如何分割的我们拿到的原始数据集首先会按照一定的比例划分出训练集和测试集。比如下图以8:2分割的数据集训练集是用来训练我们的模型它的作用就像我们平时做的练习题测试集用来评估我们训练好的模型表现如何它不能被提前被模型看到。因此在K折交叉验证中我们用到的数据是训练集中的所有数据我们将训练集的所有数据平均划分出K份(通常选择K10)取第K份作为验证集它的作用就像我们用来估计高考分数的模拟题余下的K-1份作为交叉验证的训练集。对于我们最开始选择的决策树的5个最大深度以max_depth1为例我们先用第2-10份数据作为训练集训练模型用第一份数据作为验证集对这次训练的模型进行评分得到第一个分数然后重新构建一个max_depth 1的决策树用第1和3-10份数据作为训练集训练模型用第2份数据作为验证集对这次训练的模型进行评分得到第二个分数…..以此类推最后构建一个max_depth 1的决策树用第1-9份数据作为训练集训练模型用第10份数据作为验证集对这次训练的模型进行评分得到10个验证分数然后计算着10个验证分数的平均分数就是max_depth 1的决策树模型的最终验证分数。对于max_depth 2,3,4,5时分别进行和max_depth 1 相同的交叉验证过程得到他们的最终验证分数然后我们就可以对这5个最大深度的决策树的最终验证分数进行比较分数最高的那个就是最优最大深度我们利用最优参数在全部训练集上训练一个新的模型整个模型就是最优模型。简单的利用决策树预测乳腺癌的例子代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647from sklearn.model_selection import GridSearchCV,KFold,train_test_splitfrom sklearn.metrics import make_scorer , accuracy_scorefrom sklearn.tree import DecisionTreeClassifierfrom sklearn.datasets import load_breast_cancerimport warningsfrom sklearn.neighbors import KNeighborsClassifier as KNNwarnings.filterwarnings(ignore)# load datadata 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_size0.8 , random_state0)regressor DecisionTreeClassifier(random_state0)parameters {max_depth:range(1,6)}scorin_fnc make_scorer(accuracy_score)kflod KFold(n_splits10)grid GridSearchCV(regressor,parameters,scorin_fnc,cvkflod)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训练方法knn KNN()# 进行填充测试数据进行训练knn.fit(X_train,y_train)params knn.get_params()score knn.score(X_test,y_test)print(KNN 预测得分为%s%score)结果1234567(569, 30)(569,)best score:0.938462best parameters:max_depth:4test score : 0.956140KNN 预测得分为0.9385964912280702问题一AttributeError: ‘GridSearchCV’ object has no attribute ‘grid_scores_’问题描述Python运行代码的时候到gsearch1.grid_scores_ 时报错1AttributeError: GridSearchCV object has no attribute grid_scores_原因之所以出现以上问题原因在于grid_scores_在sklearn0.20版本中已被删除取而代之的是cv_results_。解决方法将下面代码1a,b,c gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_换成1a,b,c gsearch1.cv_results_, gsearch1.best_params_, gsearch1.best_score_问题二ModuleNotFoundError: No module named ‘sklearn.grid_search’问题描述Python运行代码时候到from sklearn.grid_search import GridSearchCV时报错1ModuleNotFoundError: No module named sklearn.grid_search原因sklearn.grid_search模块在0.18版本中被弃用它所支持的类转移到model_selection 模板中。还要注意新的CV迭代器的接口与这个模块的接口不同sklearn.grid_search在0.20中被删除。解决方法将下面代码1from sklearn.grid_search import GridSearchCV修改成1from sklearn.model_selection import GridSearchCV致谢
http://www.huolong8.cn/news/347668/

相关文章:

  • 怎么找做网站的客户中国空间站叫什么名
  • 做产品网站费用吗wordpress不好用
  • 如何填写网站建设计划表电子商城网站开发公司
  • wordpress手机怎么分享链接地址衡阳seo优化首选
  • 学校网站代码app订制
  • 怎么介绍自己做的电影网站吗绿色大气5.7织梦网站模版
  • 聊城营销网站建设价格青岛福瀛建设集团有限公司网站
  • 公司网站 数据库制冷设备东莞网站建设
  • 建立网站的主机方式百度搜索引擎api
  • 网页制作期末作业网站建立一个网站需要会什么软件
  • 国外建站公司互联网营销的优点
  • 手机网站开发算什么费用ui设计好学吗?要学多久
  • 网站代码怎么优化分类网站怎么做项目
  • 企业电商网站商城建设东莞横沥地图
  • 好的门户网站网站设计自已申请
  • 学做缝纫的网站wordpress 文章投票
  • 做电子元器件销售什么网站好阿里云轻量WordPress
  • 网站域名不变网站可以从做吗免费创建论坛网站
  • 纪检监察网站建设情况汇报微商商城系统
  • 品牌网站建设小i蝌蚪网站最上面标题怎么改
  • 辽宁做网站公司外贸做网站公司
  • 甘肃网站推广平面设计网站大全网站
  • 马鞍山建设机械网站网站通常用什么编程做
  • 卡片式网站模板长沙的汽车网站建设
  • WordPress资讯站点源码济南网站建设开发公司哪家好
  • 许昌建设企业网站自动做PPT的网站
  • 怎么购买域名自己做网站seo资源网站排名
  • 网易网站开发语言东莞企业网站制作出售
  • 论文检索网站怎么做wordpress文章调用链接
  • 竹子建站公司电影网站源码怎么做的