网格搜索

对给定参数进行组合,用某标准进行评价,只适合小数据集

  1. 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’)

参数

estimator:一个学习器对象,它必须有.fit方法用于学习,.predict方法用于预测,.score方法用于评分

param_grid:字典或者字典的列表,每个字典是学习器的一个参数,key是参数名,value是备选参数序列

scoring:评分函数,可以是一个字符串,或一个可调用对象,或者None

    如果是None,使用学习器的.score方法,

    如果是字符串,可以为如下值:

      accuracy:用 metrics.accuracy_score 评分函数

      average_precision:用 metrics.average_precision_score 评分函数

      f1系列:用 metrics.f1_score 评分函数

        f1:用于二分类

        f1_micro:micro_averaged

        f1_macro:macro_averaged

        f1_weighted:weighted average

        f1_samples:by multilabel sample

      log_loss:用 metrics.log_loss 评分函数

      precision:用 metrics.precision_score 评分函数,具体形式类似f1系列

      recall:用 metrics.recall_score 评分函数,具体形式类似f1系列

      roc_auc:用的是 metrics.roc_auc_score 评分函数

      adjusted_rand_score:

      mean_absolute_error:

      mean_squared_error:

      median_absolute_error:

      r2:

fit_params:字典形式,用于给学习器的fit传递参数

n_jobs:并行性,默认为-1或None,表示派发任务到所有计算机的cpu上

iid:样本独立同分布,bool值

refit:bool值,如果为True,表示在参数优化之后,使用整个数据集来重新训练该最优的estimator

cv:一个整数,k折交叉生成器,一个迭代器,或者None

  如果为None,使用3折交叉验证

  如果为整数k,使用k这交叉验证

  如果为k折交叉验证生成器

  迭代器

verbose:整数,控制输出日志的内容,该值越大,输出越多的内容

pre_dispatch:整数或者字符串,控制并行执行时分发的总的任务量

error_score:

return_train_score:

属性

grid_scores_:命名元组组成的列表,列表中每个元素代表参数组合的得分

best_estimator_:一个学习器对象,代表最后的最优学习器

best_score_:最佳学习器的得分

best_params_:最佳参数组合

方法

fit:执行参数优化  

predict:使用学习到的最佳学习器预测数据

predict_log_proba(x):使用最佳学习器来预测属于每个类别的概率的对数值

predict_proba(x):使用最佳学习器来预测属于每个类别的概率

score:最佳学习器的评分

示例代码

  1. from sklearn.datasets import load_digits
  2. from sklearn.linear_model import LogisticRegression
  3. from sklearn.metrics import classification_report
  4. from sklearn.model_selection import train_test_split, GridSearchCV
  5.  
  6. ###
  7. digits = load_digits()
  8. X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=0, stratify=digits.target)
  9.  
  10. ###
  11. tuned_parameters = [{'penalty':['l1', 'l2'], 'C':[0.01, 0.05, 0.1, 0.5, 1, 5, 10, 50, 100], 'solver':['liblinear'], 'multi_class':['ovr']},
  12. {'penalty':['l2'], 'C':[0.01, 0.05, 0.1, 0.5, 1, 5, 10, 50, 100], 'solver':['lbfgs'], 'multi_class':['ovr', 'multinomial']}]
  13.  
  14. clf = GridSearchCV(LogisticRegression(tol=1e-6), tuned_parameters, cv=10)
  15. clf.fit(X_train, y_train)
  16. print(clf.best_params_) # {'penalty': 'l2', 'multi_class': 'multinomial', 'C': 0.01, 'solver': 'lbfgs'}
  17.  
  18. for i in clf.grid_scores_:
  19. print(i)
  20.  
  21. # mean: 0.93022, std: 0.01571, params: {'penalty': 'l1', 'multi_class': 'ovr', 'C': 0.01, 'solver': 'liblinear'}
  22. # mean: 0.96511, std: 0.01095, params: {'penalty': 'l2', 'multi_class': 'ovr', 'C': 0.01, 'solver': 'liblinear'}
  23. # mean: 0.96437, std: 0.01082, params: {'penalty': 'l1', 'multi_class': 'ovr', 'C': 0.05, 'solver': 'liblinear'}
  24. # mean: 0.96511, std: 0.01164, params: {'penalty': 'l2', 'multi_class': 'ovr', 'C': 0.05, 'solver': 'liblinear'}
  25. # ...
  26. # mean: 0.95100, std: 0.01262, params: {'penalty': 'l1', 'multi_class': 'ovr', 'C': 1, 'solver': 'liblinear'}
  27. # mean: 0.95323, std: 0.01390, params: {'penalty': 'l2', 'multi_class': 'ovr', 'C': 1, 'solver': 'liblinear'}
  28. # mean: 0.95249, std: 0.01096, params: {'penalty': 'l1', 'multi_class': 'ovr', 'C': 5, 'solver': 'liblinear'}
  29. # mean: 0.95100, std: 0.01237, params: {'penalty': 'l2', 'multi_class': 'ovr', 'C': 5, 'solver': 'liblinear'}
  30. # ...
  31. # mean: 0.94358, std: 0.01260, params: {'penalty': 'l2', 'multi_class': 'ovr', 'C': 50, 'solver': 'lbfgs'}
  32. # mean: 0.95768, std: 0.01487, params: {'penalty': 'l2', 'multi_class': 'multinomial', 'C': 50, 'solver': 'lbfgs'}
  33. # mean: 0.93690, std: 0.01520, params: {'penalty': 'l2', 'multi_class': 'ovr', 'C': 100, 'solver': 'lbfgs'}
  34. # mean: 0.95620, std: 0.01314, params: {'penalty': 'l2', 'multi_class': 'multinomial', 'C': 100, 'solver': 'lbfgs'}
  35.  
  36. print(clf.score(X_test, y_test)) # 0.973333333333
  37.  
  38. pred = clf.predict(X_test)
  39. print(classification_report(y_test, pred))
  40. # precision recall f1-score support
  41. #
  42. # 0 1.00 1.00 1.00 45
  43. # 1 0.87 0.98 0.92 46
  44. # 2 1.00 0.98 0.99 44
  45. # 3 1.00 1.00 1.00 46
  46. # 4 1.00 0.96 0.98 45
  47. # 5 0.96 0.98 0.97 46
  48. # 6 1.00 0.98 0.99 45
  49. # 7 1.00 1.00 1.00 45
  50. # 8 0.93 0.88 0.90 43
  51. # 9 1.00 0.98 0.99 45
  52. #
  53. # avg / total 0.97 0.97 0.97 450

随机搜索

随机搜索的原理和网格搜索是一致的,只是随机搜索在取参数值时是随机取值,其主要解决以下问题

1. 参数很多

2. 参数取值是连续的,或者参数取值范围很大,或者参数可取值非常多

随机取值其实不是完全随机,如根据参数取值的分布进行采样,其实也可以自己定义

  1. class sklearn.model_selection.RandomizedSearchCV(estimator, param_distributions, n_iter=10, scoring=None, fit_params=None, n_jobs=None, iid=’warn’, refit=True,
    cv=’warn’, verbose=0, pre_dispatch=‘2*n_jobs’, random_state=None, error_score=’raise-deprecating’, return_train_score=’warn’)[source]

参数

参数与gridsearchCV大致相同,简单解释下

param_distributions:相当于上面的param_grid,只是字典的值是个分布,通常使用scipy.stats模块提供的分布类,如 scipy.expon 指数分布,scipy.gamma gamma分布,scipy.uniform 均匀分布等

n_iter:整数,指定每个参数采样的数量,通常该值越大,参数优化效果越好,但计算量也越大

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

属性

cv_results_:不同参数组合的得分

best_params_,best_score_ 等

示例代码

  1. from sklearn.datasets import load_iris
  2. from sklearn.neighbors import KNeighborsClassifier # 要估计的是knn里面的参数,包括k的取值和样本权重分布方式
  3. from sklearn.model_selection import GridSearchCV,RandomizedSearchCV
  4.  
  5. iris = load_iris()
  6. X = iris.data
  7. y = iris.target
  8.  
  9. k_range = range(1, 31) # 优化参数k的取值范围
  10. weight_options = ['uniform', 'distance'] # 代估参数权重的取值范围。uniform为统一取权值,distance表示距离倒数取权值
  11. param_grid = {'n_neighbors':k_range,'weights':weight_options} # 字典中的key值必须是分类算法的函数的参数名
  12. print(param_grid)
  13.  
  14. knn = KNeighborsClassifier(n_neighbors=5)
  15.  
  16. # ================================网格搜索=======================================
  17. # 这里GridSearchCV的参数形式和cross_val_score的形式差不多,其中param_grid是parameter grid所对应的参数
  18. # GridSearchCV中的n_jobs设置为-1时,可以实现并行计算(如果你的电脑支持的情况下)
  19. grid = GridSearchCV(estimator = knn, param_grid = param_grid, cv=10, scoring='accuracy') #针对每个参数对进行了10次交叉验证。scoring='accuracy'使用准确率为结果的度量指标。可以添加多个度量指标
  20. grid.fit(X, y)
  21.  
  22. print('网格搜索-度量记录:',grid.cv_results_) # 包含每次训练的相关信息
  23. print('网格搜索-最佳度量值:',grid.best_score_) # 获取最佳度量值
  24. print('网格搜索-最佳参数:',grid.best_params_) # 获取最佳度量值时的代定参数的值。是一个字典
  25. print('网格搜索-最佳模型:',grid.best_estimator_) # 获取最佳度量时的分类器模型
  26.  
  27. # 使用获取的最佳参数生成模型,预测数据
  28. knn = KNeighborsClassifier(n_neighbors=grid.best_params_['n_neighbors'], weights=grid.best_params_['weights'])
  29. knn.fit(X, y)
  30. print(knn.predict([[3, 5, 4, 2]]))
  31.  
  32. # =====================================随机搜索===========================================
  33. rand = RandomizedSearchCV(knn, param_grid, cv=10, scoring='accuracy', n_iter=10, random_state=5) #
  34. rand.fit(X, y)
  35.  
  36. print('随机搜索-度量记录:',grid.cv_results_) # 包含每次训练的相关信息
  37. print('随机搜索-最佳度量值:',grid.best_score_) # 获取最佳度量值
  38. print('随机搜索-最佳参数:',grid.best_params_) # 获取最佳度量值时的代定参数的值。是一个字典
  39. print('随机搜索-最佳模型:',grid.best_estimator_) # 获取最佳度量时的分类器模型
  40.  
  41. # 使用获取的最佳参数生成模型,预测数据
  42. knn = KNeighborsClassifier(n_neighbors=grid.best_params_['n_neighbors'], weights=grid.best_params_['weights'])
  43. knn.fit(X, y)
  44. print(knn.predict([[3, 5, 4, 2]]))
  45.  
  46. # =====================================自定义度量===========================================
  47. from sklearn import metrics
  48. # 自定义度量函数
  49. def scorerfun(estimator, X, y):
  50. y_pred = estimator.predict(X)
  51. return metrics.accuracy_score(y, y_pred)
  52.  
  53. rand = RandomizedSearchCV(knn, param_grid, cv=10, scoring=scorerfun, n_iter=10, random_state=5) #
  54. rand.fit(X, y)
  55.  
  56. print('随机搜索-最佳度量值:',grid.best_score_) # 获取最佳度量值

参考资料:

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html

https://blog.csdn.net/luanpeng825485697/article/details/79831703

参数优化-API的更多相关文章

  1. sklearn参数优化方法

    学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的 ...

  2. Web Api 内部数据思考 和 利用http缓存优化 Api

    在上篇<Web Api 端点设计 与 Oauth>后,接着我们思考Web Api 的内部数据: 其他文章:<API接口安全加强设计方法> 第一  实际使用应该返回怎样的数据 ? ...

  3. 《转》sklearn参数优化方法

    sklearn参数优化方法  http://www.cnblogs.com/nolonely/p/7007961.html   学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参 ...

  4. tomcat jvm参数优化

    根据gc(垃圾回收器)的选择,进行参数优化 JVM给了三种选择:串行收集器.并行收集器.并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器. -XX:+Us ...

  5. sklearn参数优化

    学习器模型中一般有两个参数:一类参数可以从数据中学习估计得到,还有一类参数无法从数据中估计,只能靠人的经验进行指定,后一类参数就叫超参数 比如,支持向量机里的C,Kernel,gama,朴素贝叶斯里的 ...

  6. 如何优化API?8个实用技巧!【eolink翻译】

    使用 API 可以让公司利用现代连接的力量来帮助他们扩大全球影响力.传输数据和改进集成.由于 API 使企业能够简化流程并增强可用性,所以企业会使用一些优化策略,不断优化流程,比如接下来要说到的8个技 ...

  7. linux下TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...

  8. Windows下tcp参数优化

    Windows系统下的TCP参数优化2013-04-25      0 个评论       作者:最初的幸福ever收藏     我要投稿Windows系统下的TCP参数优化 TCP连接的状态与关闭方 ...

  9. paper 62:高斯混合模型(GMM)参数优化及实现

    高斯混合模型(GMM)参数优化及实现 (< xmlnamespace prefix ="st1" ns ="urn:schemas-microsoft-com:of ...

随机推荐

  1. Debian初始化配置

    1.解决中文显示乱码windows的宋体文件上传到debian的字体目录,并运行dpkg-reconfigure locales命令来设置系统的字体root@debian:~# mv simsun.t ...

  2. linux文件管理之查找

    1 文件查找 1.1 which 查找可执行文件的路径which是通过 PATH环境变量到该路径内查找可执行文件,所以基本的功能是寻找可执行文件[root@www ~]# which [-a] com ...

  3. vue select中的option循环的时候,要使用 :value,不能使用 v-model

    <select class="classColor" @change="select" v-model="selectValue"&g ...

  4. 大div中嵌套小div,点击大div时隐藏,点击小div不隐藏

    给小div添加一个click事件 <div onClick="event.cancelBubble = true">  //小div

  5. Huffman Coding

    哈夫曼树 霍夫曼编码是一种无前缀编码.解码时不会混淆.其主要应用在数据压缩,加密解密等场合. 1. 由给定结点构造哈夫曼树 (1)先从小到大排序(nlogn) (2)先用最小的两个点构造一个节点,父节 ...

  6. dijkstra优化

    1, 桶优化最短路, 时间复杂度$O(m+n)$, 空间$O(C)$, $C$为最短路长度 const int N = 1e6+10; int n, m; struct _ {int to,w;}; ...

  7. Pascal's Triangle 2(leetcode java)

    问题描述: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return ...

  8. First Bad Version leetcode java

    问题描述: You are a product manager and currently leading a team to develop a new product. Unfortunately ...

  9. 『TensorFlow』第九弹_图像预处理_不爱红妆爱武装

    部分代码单独测试: 这里实践了图像大小调整的代码,值得注意的是格式问题: 输入输出图像时一定要使用uint8编码, 但是数据处理过程中TF会自动把编码方式调整为float32,所以输入时没问题,输出时 ...

  10. 模拟spring的IoC

    1.新建一个web项目,jdk版本为1.8.0_111,使用 Jsp + Servlet + Model 实现MVC模式,并使用BeanFactory工厂 + xml配置文件 + 反射 来解耦合 整个 ...