Python 2.7
IDE Pychrm 5.0.3
sci-kit learn 0.18.1


前言

抖了个机灵,不要来打我,这是没有理论依据证明的,只是模型测试出来的确有效,并且等待时间下降(约)为原来的十分之一!!刺不刺激,哈哈哈。


原理

基本思想:先找重点在细分,再细分,伸缩Flexible你怕不怕。以下简称这种方法为FCV

不知道CV的请看@MrLevo520–总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)


伪代码

原理很好理解,直接上伪代码,懒得打字,上手稿


FCV测试时间

以GBDT为例,我测试了下,参数 n_estimators从190到300,max_depth从2到9,CV=3

  • 普通的GridSerachCV总共fit了110*7*3=2310次,耗时1842min,也就是30.7个小时,得出最优参数n_estimators=289,max_depth=3

  • FCV总共总共fit了345次,跑了166min,也就是2.8小时,得出最优参数n_estimators=256,max_depth=3

时间方面,相差11倍,那么效果呢,请看下面的CV得分


FCV测试效果

选取了GBDT,RF,XGBOST,SVM做了交叉验证比较,同一算法之间保持相同参数。

GBDT的测试结果

clf1 = GradientBoostingClassifier(max_depth=3,n_estimators=289)#.fit(train_data,train_label)
score1 = model_selection.cross_val_score(clf1,train_data,train_label,cv=5)
print score1
-------------------------------------
clf2 = GradientBoostingClassifier(max_depth=3,n_estimators=256)#.fit(train_data,train_label)
score2 = model_selection.cross_val_score(clf2,train_data,train_label,cv=5)
print score2------------------------------------
# 查看两种方法的交叉验证效果#传统方法CV=5:[ 0.79807692  0.82038835  0.80684597  0.76108374  0.78163772]
#改进方法CV=5:[ 0.79567308  0.82038835  0.799511    0.76847291  0.78411911]---------------------------------------#传统方法CV=10:[ 0.83333333  0.78571429  0.84615385  0.7961165   0.81067961  0.80097087   0.77227723  0.78109453  0.785   0.74111675]
#FCV方法CV=10:[ 0.85238095  0.78095238  0.85096154  0.7961165   0.81553398  0.7961165   0.76732673  0.79104478  0.795   0.75126904]

Xgboost的测试结果

clf1 = XGBClassifier(max_depth=6,n_estimators=200)#.fit(train_data,train_label)
score1 = model_selection.cross_val_score(clf1,train_data,train_label,cv=5)
print score1clf2 = XGBClassifier(max_depth=4,n_estimators=292)#.fit(train_data,train_label)
score2 = model_selection.cross_val_score(clf2,train_data,train_label,cv=5)
print score2-----------------------------
#传统方法CV=5:[ 0.79086538  0.83737864  0.80929095  0.79310345  0.7866005 ]
#FCV方法CV=5:[ 0.80288462  0.84466019  0.8190709   0.79064039  0.78163772]

RF的测试结果

注:由于RF的特殊性,选择样本的方式和选择特征的方式都随机,所以即使交叉验证,效果也不是稳定的,就像我在服务器上跑多进程和笔记本上跑同一个程序,出来的最佳值一个是247,一个是253,并不是说都会一致。(说的好像GBDT,XGBOOST不是树结构似得0.o)

clf1 = RandomForestClassifier(n_estimators=205)#.fit(train_data,train_label)
score1 = model_selection.cross_val_score(clf1,train_data,train_label,cv=5)
print score1
clf2 = RandomForestClassifier(n_estimators=253)#.fit(train_data,train_label)
score2 = model_selection.cross_val_score(clf2,train_data,train_label,cv=5)
print score2---------------
#传统方法CV=5: [ 0.77884615  0.82038835  0.78239609  0.79310345  0.74937965]
#FCV方法CV=5:[ 0.75721154  0.83495146  0.79217604  0.79310345  0.75186104]

SVM的测试结果

clf1 = SVC(kernel='rbf', C=16, gamma=0.18)#.fit(train_data,train_label)
score1 = model_selection.cross_val_score(clf1,train_data,train_label,cv=5)
print score1clf2 = SVC(kernel='rbf', C=94.75, gamma=0.17)#.fit(train_data,train_label)
score2 = model_selection.cross_val_score(clf2,train_data,train_label,cv=5)
print score2# 默认CV参数搜索(2^-8,2^8),[ 0.88468992  0.88942774  0.88487805  0.8856305   0.8745098 ]# FCV参数搜索:[ 0.90116279  0.9185257   0.90146341  0.90713587  0.89509804]

FCV优点

  • 分割测试阈,极大提高速度,相较于普通的寻优,速度提升Step倍左右,寻优范围越大,提升越明显
  • 可根据自己的数据集进行弹性系数设置,默认为0.5Step,设置有效的弹性系数有利于减少遗漏值

FCV缺点

  • 有一定几率陷入局部最优
  • 需要有一定的阈值经验和步进Step设置经验

FCV代码

以GBDT为例,(RF被我改成多进程了),假设寻找两个最优参数,概念和上面的是一样的,上面的理解了,这里没啥问题的。

# -*- coding: utf-8 -*-
from sklearn import metrics, model_selection
import LoadSolitData
import Confusion_Show as cs
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import GradientBoostingClassifierdef gradient_boosting_classifier(train_x, train_y,Nminedge,Nmaxedge,Nstep,Dminedge,Dmaxedge,Dstep):model = GradientBoostingClassifier()param_grid = {'n_estimators': [i for i in range(Nminedge,Nmaxedge,Nstep)], 'max_depth': [j for j in range(Dminedge,Dmaxedge,Dstep)]}grid_search = GridSearchCV(model, param_grid, n_jobs=1, verbose=1)grid_search.fit(train_x, train_y)best_parameters = grid_search.best_estimator_.get_params()for para, val in best_parameters.items():print para, valreturn best_parameters["n_estimators"],best_parameters["max_depth"]def FlexSearch(train_x, train_y,Nminedge,Nmaxedge,Nstep,Dminedge,Dmaxedge,Dstep):NmedEdge,DmedEdge = gradient_boosting_classifier(train_x, train_y,Nminedge,Nmaxedge,Nstep,Dminedge,Dmaxedge,Dstep)Nminedge = NmedEdge - Nstep-Nstep/2Nmaxedge = NmedEdge + Nstep+Nstep/2Dminedge = DmedEdge - DstepDmaxedge = DmedEdge + DstepNstep = Nstep/2Dstep = Dstepprint "Current bestPara:N-%.2f,D-%.2f"%(NmedEdge,DmedEdge)print "Next Range:N-%d-%d,D--%d-%d"%(Nminedge,Nmaxedge,Dminedge,Dmaxedge)print "Next step:N-%.2f,D-%.2f"%(Nstep,Nstep)if Nstep > 0 :return FlexSearch(train_x, train_y,Nminedge,Nmaxedge,Nstep,Dminedge,Dmaxedge,Dstep)else:print "The bestPara:N-%.2f,D-%.2f"%(NmedEdge,DmedEdge)return NmedEdge,DmedEdgeif __name__ == '__main__':train_data,train_label,test_data,test_label = LoadSolitData.TrainSize(1,0.2,[i for i in range(1,14)],"outclass")
#这里数据自己导,我是写在别的子函数里面了。NmedEdge,DmedEdge = FlexSearch(train_data, train_label, 190, 300, 10, 2, 9, 1)Classifier = GradientBoostingClassifier(n_estimators=NmedEdge,max_depth=DmedEdge)Classifier.fit(train_data,train_label)predict_label = Classifier.predict(test_data)report = metrics.classification_report(test_label, predict_label)print report

What’s More

采用多进程+FCV的方法,速度再次提升一个数量级。我假定命名为MFCV方法

不知道什么是多进程和多线程请看
@MrLevo520–Python小白带小白初涉多进程
@MrLevo520–Python小白带小白初涉多线程


MFCV原理

在FCV的基础上,gap = (maxedge-minedge)/k,其中的k为进程个数,把大块切割成小块,然后小块在按照FCV进行计算,最后得出K个最优值,再进行K个最优值选择一下就可以了。


MFCV优点

  • 速度更快,多进程并发
  • 因为分割片在片上做FCV,然后再集合做CV,一定程度上避免FCV陷入局部最优

MFCV缺点

  • 与FCV不同,只能进行单参数的多进程并发寻优,两个参数的现在多进程我还没想到怎么实现,想到再说。

MFCV测试时间

因为只能单参数,所以RF为例,参数 n_estimators从190到330,CV=10,普通GridSerachCV时间为97.2min,而FCV时间为18min,MFCV为14min,这里因为fit总数太少了,所以效果不是非常明显,但是大家可以想象一下,单参数跨度很大的时候是什么效果。。。


MFCV测试效果

clf1 = RandomForestClassifier(n_estimators=205)#.fit(train_data,train_label)
score1 = model_selection.cross_val_score(clf1,train_data,train_label,cv=10)
print score1
clf2 = RandomForestClassifier(n_estimators=239)#.fit(train_data,train_label)
score2 = model_selection.cross_val_score(clf2,train_data,train_label,cv=10)
print score2#传统方法CV=10:[ 0.84169884  0.85328185  0.85907336  0.84912959  0.82101167  0.8540856 0.84015595  0.87968442  0.84980237  0.83003953]
#MFCV方法CV=10:[ 0.84169884  0.86100386  0.85521236  0.86266925  0.82101167  0.85019455  0.83625731  0.87771203  0.85177866  0.83201581]

效果和传统方法相比,相差不多,持平,并且速度提升一个数量集,我认为可以采用


MFCV代码

# -*- coding: utf-8 -*-
#! /usr/bin/python
from multiprocessing import Process
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
import Confusion_Show as cs
import LoadSolitData
from sklearn.model_selection import GridSearchCVdef write2txt(data,storename):f = open(storename,"w")f.write(str(data))f.close()def V_candidate(candidatelist,train_x, train_y):model = RandomForestClassifier()param_grid = {'n_estimators': [i for i in candidatelist]}grid_search = GridSearchCV(model, param_grid, n_jobs=1, verbose=1,cv=10)grid_search.fit(train_x, train_y)best_parameters = grid_search.best_estimator_.get_params()for para, val in best_parameters.items():print para, valreturn best_parameters["n_estimators"]def random_forest_classifier(train_x, train_y,minedge,maxedge,step):model = RandomForestClassifier()param_grid = {'n_estimators': [i for i in range(minedge,maxedge,step)]}grid_search = GridSearchCV(model, param_grid, n_jobs=1, verbose=1,cv=10)grid_search.fit(train_x, train_y)best_parameters = grid_search.best_estimator_.get_params()for para, val in best_parameters.items():print para, valreturn best_parameters["n_estimators"]def FlexSearch(train_x, train_y,minedge,maxedge,step,storename):mededge = random_forest_classifier(train_x, train_y,minedge,maxedge,step)minedge = mededge - step-step/2maxedge = mededge + step+step/2step = step/2print "Current bestPara:",mededgeprint "Next Range%d-%d"%(minedge,maxedge)print "Next step:",stepif step > 0:return FlexSearch(train_x, train_y,minedge,maxedge,step,storename)elif step==0:print "The bestPara:",mededgewrite2txt(mededge,"RF_%s.txt"%storename)def Calc(classifier):Classifier.fit(train_data,train_label)predict_label = Classifier.predict(test_data)predict_label_prob = Classifier.predict_proba(test_data)total_cor_num = 0.0dictTotalLabel = {}dictCorrectLabel = {}for label_i in range(len(predict_label)):if predict_label[label_i] == test_label[label_i]:total_cor_num += 1if predict_label[label_i] not in dictCorrectLabel: dictCorrectLabel[predict_label[label_i]] = 0dictCorrectLabel[predict_label[label_i]] += 1.0if test_label[label_i] not in dictTotalLabel: dictTotalLabel[test_label[label_i]] = 0dictTotalLabel[test_label[label_i]] += 1.0accuracy = metrics.accuracy_score(test_label, predict_label) * 100kappa_score = metrics.cohen_kappa_score(test_label, predict_label)average_accuracy = 0.0label_num = 0for key_i in dictTotalLabel:try:average_accuracy += (dictCorrectLabel[key_i] / dictTotalLabel[key_i]) * 100label_num += 1except:average_accuracy = average_accuracyaverage_accuracy = average_accuracy / label_numresult = "OA:%.4f;AA:%.4f;KAPPA:%.4f"%(accuracy,average_accuracy,kappa_score)print resultreport = metrics.classification_report(test_label, predict_label)print reportcm = metrics.confusion_matrix(test_label, predict_label)cs.ConfusionMatrixPng(cm,['1','2','3','4','5','6','7','8','9','10','11','12','13'])if __name__ == '__main__':train_data,train_label,test_data,test_label = LoadSolitData.TrainSize(1,0.5,[i for i in range(1,14)],"outclass") # 数据集自导自己的minedge = 180maxedge = 330step = 10gap = (maxedge-minedge)/3subprocess = []for i in range(1,4):#设置了3个进程p = Process(target=FlexSearch,args=(train_data,train_label,minedge+(i-1)*gap,minedge+i*gap,step,i))subprocess.append(p)for j in subprocess:j.start()for k in subprocess:k.join()candidatelist = []for i in range(1,4):with open("RF_%s.txt"%i) as f:candidatelist.append(int(f.readlines()[0].strip()))print "candidatelist:",candidatelistbest_n_estimators = V_candidate(candidatelist, train_data,train_label)print "best_n_estimators",best_n_estimatorsClassifier = RandomForestClassifier(n_estimators=best_n_estimators)Calc(Classifier)

总结

在单参数寻优上可以选用MFCV,多参数寻优上选择FCV,经过CV得分可知,效果与普通遍历查询保持一致,但是速度提升效果明显,越是广阈查询,提升越明显,已通过ISO9001认证,请放心食用。。。。。。算法非常简单啊,但万一哪天火了呢,所以我要保留所有权利,转载请注明。(我能说Bootstrap这么简单的一种思想是怎么统治统计学的么,BTW,GridSerach思想本来也很简单呢)


附录1–FCV手稿


手稿1

手稿2


附录2

如果你也想尝试xgboost这个非常好用的分类器,强烈建议你采用FCV进行调参,因为xgboost借助OpenMP,能自动利用单机CPU的多核进行并行计算,就像这样,一运行就陷入烤鸡模式,所以尽量减少调参时候的运行次数极为重要!

如何安装Xgboost请看@MrLevo520–解决:win10_x64 xgboost python安装所遇到问题


致谢

@abcjennifer–python并行调参——scikit-learn grid_search
@MrLevo520–解决:win10_x64 xgboost python安装所遇到问题 @wzmsltw–XGBoost-Python完全调参指南-参数解释篇
@u010414589–xgboost 调参经验
@MrLevo520–总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)
@MrLevo520–Python小白带小白初涉多进程
@MrLevo520–Python小白带小白初涉多线程

优化:一种将grid-search速度提升10倍的方法相关推荐

  1. 使用Apache Spark让MySQL查询速度提升10倍以上

    作者:Alexander Rubin 链接:http://coyee.com/article/11012-how-apache-spark-makes-your-slow-mysql-queries- ...

  2. 骗你不是人 硬盘传输速度提升100倍的方法

    这年头大家应该都用上固态硬盘了吧?之前说过,要想花最少的钱升级硬件,换块固态硬盘是最具性价比的方案,立竿见影. 总之现在固态硬盘应该是一种趋势,你看最近新出的笔记本电脑使用的基本都是固态硬盘,传统的机 ...

  3. 骗你不是人 硬盘传输速度提升4倍的方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 2010 ...

  4. opengl开启垂直同步_玩游戏卡顿?只要简单2步,开启电脑最大性能,速度提升10倍!...

    你玩过游戏吗?打过王者开过黑吃过鸡吗? 作为一名青少年,人生中最大的诱惑就是逃不过游戏这个"小妖精",一放假打开电脑,喊上三五个好友一起开黑,一天又过去了,别提多逍遥自在.(当然, ...

  5. 撸代码速度提升10倍的技巧,收藏慢慢看!!!【内含福利】

    今天带大家提升一下写代码的速度,idea 是我们用的最多的开发工具,这个工具有个特别的牛逼的功能:live template. 这个功能掌握之后,撸代码的速度至少翻两番. 先带大家见识一下这玩意的威力 ...

  6. python效率提升_Python GUI开发,效率提升10倍的方法!

    1 框架简介 这个框架的名字叫 PySimpleGUI,它完全基于Python语言,能非常方便地开发GUI界面,代码量相比现有框架减少50%到90%.并且,它提供了极为友好的Python风格的接口,大 ...

  7. 英伟达发布ChatGPT专用GPU,性能提升10倍,还推出云服务,普通企业也能训练LLM...

    Pine 发自 凹非寺 量子位 | 公众号 QbitAI "AI的iPhone时刻已至",英伟达或成最大赢家. 在GTC2023大会上,黄仁勋接连放出大招: 不仅发布了ChatGP ...

  8. ZippyPoint: 一种基于学习的特征点提取+二进制描述子,速度提升5倍+,为移动平台提供一种ORB的替代方案...

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Realcat 来源丨 计算机视觉SLAM 作者来自ETHZ Computer Vision实验 ...

  9. 【云原生AI】Fluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍

    简介: 深度学习平台在微博社交业务扮演着重要的角色.计算存储分离架构下,微博深度学习平台在数据访问与调度方面存在性能低效的问题.本文将介绍微博内部设计实现的一套全新的基于 Fluid(内含 Jindo ...

最新文章

  1. ISCW实验:配置Cisco IOS EASY ××× Server和Cisco ××× Client
  2. 学完python基础开始学爬虫_零基础入门Python爬虫不知道怎么学?这是入门的完整教程...
  3. MFC控件的SubclassDlgItem
  4. python乘法口诀代码-浅析一句python代码成生九九乘法表
  5. 性能超强悍 戴尔 R920服务器
  6. 【软件开发底层知识修炼】二十八 C/C++中volatile的作用
  7. php 备份数据库(生成word,excel,json,xml,sql)
  8. python之字典方法
  9. 多项目加载顺序修改_面试官:Java 类在 Tomcat 中是如何加载的?
  10. 最小公倍数和最大公约数的简洁写法
  11. linux打开dwg文件怎么打开方式,dwg文件扩展名,dwg文件怎么打开?
  12. 使用前端方式挑战 Chrome 小恐龙游戏高分
  13. 基于Java实现的商品推荐系统
  14. 利用Python绘制一朵太阳花
  15. Windows10如何关闭Windows Defender杀毒软件
  16. java 音频 合成_java 音频 合成
  17. Azkaban配置Work Flow案例实操
  18. linux 移动某个文件夹及其所有子文件夹内指定类型的文件
  19. 深入理解微服务Maven父子项目构造以及项目打包部署
  20. ios for 高通Vuforia图像识别+AR(一)

热门文章

  1. AI安全---对抗攻击防御措施
  2. Windows Server 2025 简体中文版下载(Inside Preview)
  3. win10关闭快速启动_win10系统关闭快速启动功能教程
  4. ios 只用3x图可以吗_对于仅限iPhone的iOS 7应用,我们只能包含@ 3x图像吗?
  5. 【题解】Luogu-P5345 【XR-1】快乐肥宅
  6. 【HTML5 基础及 HTML编辑器】
  7. JavaScript-----tab栏的切换
  8. 稳压二极管与续流二极管
  9. Redis——》内存淘汰策略
  10. ES(elasticsearch) - kibana导出csv