全栈工程师开发手册 (作者:栾鹏)

python数据挖掘系列教程

优化的相关的知识内容可以参考
https://blog.csdn.net/luanpeng825485697/article/details/78765923

网格搜索GridSearchCV

GridSearchCV用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。

classsklearn.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:所使用的分类器,如estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10), 并且传入除需要确定最佳的参数之外的其他参数。每一个分类器都需要一个scoring参数,或者score方法。

param_grid:值为字典或者列表,即需要最优化的参数的取值,param_grid =param_test1,param_test1 = {'n_estimators':range(10,71,10)}。

scoring :准确度评价标准,默认None,这时需要使用score函数;或者如scoring=’roc_auc’,根据所选模型不同,评价准则不同。字符串(函数名),或是可调用对象,需要其函数签名形如:scorer(estimator, X, y);如果是None,则使用estimator的误差估计函数。下文表格中详细指定了score可取的值和函数形式。

cv :交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。也可是是诸如StratifiedKFold(n_splits=10)这样的类对象。

refit :默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。

iid:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。

verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。

n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值。

pre_dispatch:指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次

随机参数优化RandomizedSearchCV

尽管使用参数设置的网格法是目前最广泛使用的参数优化方法, 其他搜索方法也具有更有利的性能。 RandomizedSearchCV 实现了对参数的随机搜索, 其中每个设置都是从可能的参数值的分布中进行取样。 这对于穷举搜索有两个主要优势:

  • 可以选择独立于参数个数和可能值的预算
  • 添加不影响性能的参数不会降低效率

指定如何取样的参数是使用字典完成的, 非常类似于为 GridSearchCV 指定参数。 此外, 通过 n_iter 参数指定计算预算, 即取样候选项数或取样迭代次数。 对于每个参数, 可以指定在可能值上的分布或离散选择的列表 (均匀取样):

{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1),'kernel': ['rbf'], 'class_weight':['balanced', None]}

对象返回值grid的属性

1.cv_results_:给出不同参数情况下的评价结果的记录,这是一个字典,可以通过grid.cv_results_.keys()打印该字典的所有详细键值対信息。

2.best_params_:描述了已取得最佳结果的参数的组合,是一个字典

3.best_score_:成员提供优化过程期间观察到的最好的评分

4.best_estimator_:返回最佳的估计器对象。

from sklearn.datasets import load_iris  # 自带的样本数据集
from sklearn.neighbors import KNeighborsClassifier  # 要估计的是knn里面的参数,包括k的取值和样本权重分布方式
import matplotlib.pyplot as plt  # 可视化绘图
from sklearn.model_selection import GridSearchCV,RandomizedSearchCV  # 网格搜索和随机搜索iris = load_iris()X = iris.data  # 150个样本,4个属性
y = iris.target # 150个类标号k_range = range(1, 31)  # 优化参数k的取值范围
weight_options = ['uniform', 'distance']  # 代估参数权重的取值范围。uniform为统一取权值,distance表示距离倒数取权值
# 下面是构建parameter grid,其结构是key为参数名称,value是待搜索的数值列表的一个字典结构
param_grid = {'n_neighbors':k_range,'weights':weight_options}  # 定义优化参数字典,字典中的key值必须是分类算法的函数的参数名
print(param_grid)knn = KNeighborsClassifier(n_neighbors=5)  # 定义分类算法。n_neighbors和weights的参数名称和param_grid字典中的key名对应# ================================网格搜索=======================================
# 这里GridSearchCV的参数形式和cross_val_score的形式差不多,其中param_grid是parameter grid所对应的参数
# GridSearchCV中的n_jobs设置为-1时,可以实现并行计算(如果你的电脑支持的情况下)
grid = GridSearchCV(estimator = knn, param_grid = param_grid, cv=10, scoring='accuracy') #针对每个参数对进行了10次交叉验证。scoring='accuracy'使用准确率为结果的度量指标。可以添加多个度量指标
grid.fit(X, y)print('网格搜索-度量记录:',grid.cv_results_)  # 包含每次训练的相关信息
print('网格搜索-最佳度量值:',grid.best_score_)  # 获取最佳度量值
print('网格搜索-最佳参数:',grid.best_params_)  # 获取最佳度量值时的代定参数的值。是一个字典
print('网格搜索-最佳模型:',grid.best_estimator_)  # 获取最佳度量时的分类器模型# 使用获取的最佳参数生成模型,预测数据
knn = KNeighborsClassifier(n_neighbors=grid.best_params_['n_neighbors'], weights=grid.best_params_['weights'])  # 取出最佳参数进行建模
knn.fit(X, y)  # 训练模型
print(knn.predict([[3, 5, 4, 2]]))  # 预测新对象# =====================================随机搜索===========================================
rand = RandomizedSearchCV(knn, param_grid, cv=10, scoring='accuracy', n_iter=10, random_state=5)  #
rand.fit(X, y)print('随机搜索-度量记录:',grid.cv_results_)  # 包含每次训练的相关信息
print('随机搜索-最佳度量值:',grid.best_score_)  # 获取最佳度量值
print('随机搜索-最佳参数:',grid.best_params_)  # 获取最佳度量值时的代定参数的值。是一个字典
print('随机搜索-最佳模型:',grid.best_estimator_)  # 获取最佳度量时的分类器模型# 使用获取的最佳参数生成模型,预测数据
knn = KNeighborsClassifier(n_neighbors=grid.best_params_['n_neighbors'], weights=grid.best_params_['weights'])  # 取出最佳参数进行建模
knn.fit(X, y)  # 训练模型
print(knn.predict([[3, 5, 4, 2]]))  # 预测新对象# =====================================自定义度量===========================================
from sklearn import metrics
# 自定义度量函数
def scorerfun(estimator, X, y):y_pred = estimator.predict(X)return metrics.accuracy_score(y, y_pred)rand = RandomizedSearchCV(knn, param_grid, cv=10, scoring='accuracy', n_iter=10, random_state=5)  #
rand.fit(X, y)print('随机搜索-最佳度量值:',grid.best_score_)  # 获取最佳度量值
  • 当你的调节参数是连续的,比如回归问题的正则化参数,有必要指定一个连续分布而不是可能值的列表,这样RandomizeSearchCV就可以执行更好的grid search。

    Scoring Function Comment
    分类
    ‘accuracy’ metrics.accuracy_score 准确率
    ‘average_precision’ metrics.average_precision_score 平均准确率
    ‘f1’ metrics.f1_score for binary targets
    ‘f1_micro’ metrics.f1_score micro-averaged
    ‘f1_macro’ metrics.f1_score macro-averaged
    ‘f1_weighted’ metrics.f1_score weighted average
    ‘f1_samples’ metrics.f1_score by multilabel sample
    ‘neg_log_loss’ metrics.log_loss requires predict_proba support
    ‘precision’ etc. metrics.precision_score suffixes apply as with ‘f1’
    ‘recall’ etc. metrics.recall_score suffixes apply as with ‘f1’
    ‘roc_auc’ metrics.roc_auc_score roc_auc曲线
    Clustering
    ‘adjusted_rand_score’ metrics.adjusted_rand_score
    ‘adjusted_mutual_info_score’ metrics.adjusted_mutual_info_score
    ‘completeness_score’ metrics.completeness_score
    ‘fowlkes_mallows_score’ metrics.fowlkes_mallows_score
    ‘homogeneity_score’ metrics.homogeneity_score
    ‘mutual_info_score’ metrics.mutual_info_score
    ‘normalized_mutual_info_score’ metrics.normalized_mutual_info_score
    ‘v_measure_score’ metrics.v_measure_score
    Regression
    ‘explained_variance’ metrics.explained_variance_score
    ‘neg_mean_absolute_error’ metrics.mean_absolute_error
    ‘neg_mean_squared_error’ metrics.mean_squared_error
    ‘neg_mean_squared_log_error’ metrics.mean_squared_log_error
    ‘neg_median_absolute_error’ metrics.median_absolute_error
    ‘r2’ metrics.r2_score

    如果没有我们想要的度量字符串表达,我们可以自定义度量函数,将函数名设置为scoring参数的值。函数名必须为

    # 自定义度量函数
    def scorerfun(estimator, X, y):。。。return 。。
    • 1
    • 2
    • 3
    • 4

python调参神器hyperopt

Hyperopt库为python中的模型选择和参数优化提供了算法和并行方案。

给一段代码,一看就明白

from sklearn.model_selection import cross_val_score
import pickle
from hyperopt import fmin, tpe, hp,space_eval,rand,Trials,partial,STATUS_OK
from xgboost.sklearn import XGBClassifier
import xgboost as xgb# 定义一个目标函数,接受一个变量,计算后返回一个函数的损失值,
def GBM(argsDict):max_depth = argsDict["max_depth"] + 5n_estimators = argsDict['n_estimators'] * 5 + 50learning_rate = argsDict["learning_rate"] * 0.02 + 0.05subsample = argsDict["subsample"] * 0.1 + 0.7min_child_weight = argsDict["min_child_weight"]+1global attr_train,label_traingbm = xgb.XGBClassifier(nthread=4,    #进程数max_depth=max_depth,  #最大深度n_estimators=n_estimators,   #树的数量learning_rate=learning_rate, #学习率subsample=subsample,      #采样数min_child_weight=min_child_weight,   #孩子数max_delta_step = 10,  #10步不降则停止objective="binary:logistic")metric = cross_val_score(gbm,attr_train,label_train,cv=5,scoring="roc_auc").mean()print(metric)return -metric# 定义参数的搜索空间space = {"max_depth":hp.randint("max_depth",15),"n_estimators":hp.randint("n_estimators",10),  #[0,1,2,3,4,5] -> [50,]"learning_rate":hp.randint("learning_rate",6),  #[0,1,2,3,4,5] -> 0.05,0.06"subsample":hp.randint("subsample",4),#[0,1,2,3] -> [0.7,0.8,0.9,1.0]"min_child_weight":hp.randint("min_child_weight",5), #}
algo = partial(tpe.suggest,n_startup_jobs=1)  # 定义随机搜索算法。搜索算法本身也有内置的参数决定如何去优化目标函数
best = fmin(GBM,space,algo=algo,max_evals=4)  # 对定义的参数范围,调用搜索算法,对模型进行搜索print(best)
print(GBM(best))
  • 关于参数空间的设置,比如优化函数q,输入fmin(q,space=hp.uniform(‘a’,0,1))
    hp.uniform函数的第一个参数是标签,每个超参数在参数空间内必须具有独一无二的标签。

    • hp.choice返回一个选项,选项可以是list或者tuple.options可以是嵌套的表达式,用于组成条件参数。
    • hp.pchoice(label,p_options)以一定的概率返回一个p_options的一个选项。这个选项使得函数在搜索过程中对每个选项的可能性不均匀。
    • hp.uniform(label,low,high)参数在low和high之间均匀分布。
    • hp.quniform(label,low,high,q),参数的取值是round(uniform(low,high)/q)*q,适用于那些离散的取值。
    • hp.loguniform(label,low,high)绘制exp(uniform(low,high)),变量的取值范围是[exp(low),exp(high)]
    • hp.randint(label,upper) 返回一个在[0,upper)前闭后开的区间内的随机整数。

机器学习--模型参数优化及scoring可选参数相关推荐

  1. tensorflow官方Blog-使用Keras Tuner超参数优化框架 进行超参数调整 ,具体实现版本

    文章目录 进入正题,keras tuner超参数优化框架 模型构建def build_model(hp): 实例化tuner 加载数据集,进行超参数搜索tuner.search() 找到最佳的模型tu ...

  2. java虚拟机参数优化_JAVA虚拟机JVM参数优化(2):垃圾收集算法选择

    JAVA虚拟机JVM优化重要性,昨天JAVA虚拟机JVM参数优化(1)文章中已经描述,今天我们来讨论JAVA虚拟机在不同性能要求下如何选择三种垃圾收集算法. JVM内部结构如下图所示: 串行收集用于单 ...

  3. linux 的内核参数优化,Linux服务器内核参数优化

    Linux服务器内核参数优化 cat >> /etc/sysctl.conf << EOF #kernel optimization net.ipv4.tcp_fin_time ...

  4. linux 内核参数优化 mysql_Linux记录-mysql参数优化

    1.参数优化 show variables like '' /etc/my.cnf [mysqld] Max_connections =1024 #请求的最大连接数 back_log =1024 #m ...

  5. python中可选参数如何指定_Python可选参数

    Python 2 documentation, 7.6. Function definitions提供了几种方法来检测调用者是否提供了可选参数. 首先,可以使用特殊的形参参数语法*.如果函数定义具有以 ...

  6. 潭州教育学python_潭州教育-Python学习笔记6@函数基础,必备参数,位置参数,可选参数...

    6.1 函数定义: def BiJiao(a,b): #驼峰规则(首字母大写),见名知意-函数名大写 if a>b: print(a) elif a==b : print('xiangdeng' ...

  7. tensorflow超参数优化,Tensorflow的超参数调整

    I am searching for a hyperparameter tune package for code written directly in Tensorflow (not Keras ...

  8. [机器学习] --- 参数优化与模型选择

    一 交叉验证 交叉验证的目的 在实际训练中,模型通常对训练数据好,但是对训练数据之外的数据拟合程度差.用于评价模型的泛化能力,从而进行模型选择. 交叉验证的基本思想 把在某种意义下将原始数据(data ...

  9. 机器学习模型的超参数优化 | 原力计划

    作者 | deephub 责编 | 王晓曼 出品 | CSDN博客 头图 | CSDN付费下载自东方IC 引言 模型优化是机器学习算法实现中最困难的挑战之一.机器学习和深度学习理论的所有分支都致力于模 ...

最新文章

  1. 记录计算顺子(12,3,4或者9,0,1,2)的方法
  2. 《人人都是产品经理》阅读笔记一
  3. 八十、React中的容器组件和无状态组件
  4. dubbo学习总结三 消费端
  5. java 表格树_00030-layui+java 树形表格treeTable
  6. petshop 中的 cache机制
  7. 加密货币如何改变着IT产业
  8. 用Jsp开发wap应用
  9. 图片、文本、文件如何在线生成二维码?
  10. 谷牛期权持仓重心上移
  11. unity物体自身轴旋转_Unity实现物体沿自身的任意轴向旋转
  12. 2.15 Spring Framework 5.x 之ApplicationContext附加功能
  13. 鸿蒙系统上市时间p20pro,华为P20/20 Pro今日正式发布:外观配置详细汇总
  14. Google和Edge翻译问题解决方法整理
  15. 全球与中国雄激素和合成代谢类固醇市场发展前景与投资规划建议2021-2027年版
  16. Matlab绘图图层调节
  17. php生成mobileconfig,.mobileconfig的生成与签名
  18. 如果使用 Python3(Flask) 一步一步模拟一个网页微信客户端
  19. 写给前端开发者的「Promise备忘手册」
  20. INRIA数据集转换成VOC格式

热门文章

  1. 判断链表是否为【回文结构】
  2. c语言程序无法打开文件,C语言fopen()总是提示无法正常打开文件
  3. 如何实现‘请在微信客户端打开链接’
  4. 心跳包(确保连接的有效性)
  5. 严格别名规则“-fstrict-aliasing”和“-fno-strict-aliasing”及类型双关
  6. 前端基础知识点-每天一个基本知识点(100+个前端小知识,你是否都知道?)
  7. Java 环境变量的配置的详细教程(Windows 10)
  8. java集合举例_菜鸟程序员都能听得懂得Java集合介绍,快来收藏
  9. 如何处理接口幂等性问题(重复提交)
  10. 卷积神经网络架构不包含,卷积神经网络架构分析