GridSearch(网格搜索)调参

Author: Xin Pan

Date: 2020.01.01


GridSearch

是模型调参的一个常用方法。使用穷举的思路,将需要调整的参数的所有组合罗列出来,每个参数组合训练一个模型得到一个精度。将参数组合的数量(如产生10种参数组合)作为X轴,将需要调整的参数和精度(如调整学习率=(1,2,3),隐层神经元数量=(128,256,512))作为Y轴。利用这些信息可以画一个表格,正好组成了一个个的网格,因此叫做网格搜索。

看了网上一位朋友写的博客(见文末链接)感觉收获不少,清晰地理解了这个方法的实践过程。但是可能实践比较久远的原因,原始博客里的程序和数据都出现了问题。我重新更改了,方便需要的朋友。

GridSearch实践

数据集来自UCI机器学习知识库,但是本文使用的数据集自己更改过。我发现原始的数据集不能用因为缺少字段。本文修改好的数据请点这里

使用的编程语言是Python3.5

from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import make_scorer, fbeta_score, accuracy_score
from sklearn.model_selection import GridSearchCV, KFold
from matplotlib import pyplot as pltdata = pd.read_csv("adult.data")
# print(data.head(n=1))
income_raw = data['income']
features_raw = data.drop('income', axis=1)
plt.xlabel("X")
plt.ylabel("Y")
len = len(features_raw)
x = np.linspace(0, len, len)
pcg = plt.plot(x, features_raw["capital-gain"])
pcl = plt.plot(x, features_raw["capital-loss"])
l1 = plt.legend([pcg, pcl], ["capital-gain", "capital-loss"], loc='upper left')
plt.gca().add_artist(l1)
plt.show()# 因为原始数据中的,capital-gain 和 capital-loss的倾斜度非常高,所以要是用对数转换。
skewed = ['capital-gain', 'capital-loss']
features_raw[skewed] = data[skewed].apply(lambda x: np.log(x + 1))pcgl = plt.plot(x, features_raw["capital-gain"])
pcll = plt.plot(x, features_raw["capital-loss"])
l2 = plt.legend([pcgl, pcll], ["capital-gain", "capital-loss"], loc='upper left')
plt.gca().add_artist(l2)
plt.show()scaler = MinMaxScaler()
numerical = ['age', 'education-num', 'capital-gain', 'capital-loss', 'hours-per-week'
]
features_raw[numerical] = scaler.fit_transform(data[numerical])
pcgs = plt.plot(x, features_raw["capital-gain"])
pcls = plt.plot(x, features_raw["capital-loss"])
l3 = plt.legend([pcgs, pcls], ["capital-gain", "capital-loss"], loc='upper left')
plt.gca().add_artist(l3)
plt.show()features = pd.get_dummies(features_raw)
income = income_raw.replace(['>50K', ['<=50K']], [1, 0])
X_train, X_test, y_train, y_test = train_test_split(features, income, test_size=0.2, random_state=0)# Adaboost
clf_Ada = AdaBoostClassifier(random_state=0)# 决策树
clf_Tree = DecisionTreeClassifier(random_state=0)# KNN
clf_KNN = KNeighborsClassifier()# SVM
clf_svm = SVC(random_state=0)# Logistic
clf_log = LogisticRegression(random_state=0)# 随机森林
clf_forest = RandomForestClassifier(random_state=0)# GBDT
clf_gbdt = GradientBoostingClassifier(random_state=0)# GaussianNB
clf_NB = GaussianNB()scorer = make_scorer(accuracy_score)# 参数调优kfold = KFold(n_splits=10)
# 决策树
parameter_tree = {'max_depth': range(1, 10)}
grid = GridSearchCV(clf_Tree, parameter_tree, scorer, cv=kfold)
grid = grid.fit(X_train, y_train)print("best score: {}".format(grid.best_score_))
print(pd.DataFrame(grid.cv_results_).T)

在使用的时候请将程序文件和数据(adult.data)放在同一目录中。像这样

额外内容

代码的32行对capital-gain, capital-loss施加了一个log变换,一开始我不明白是为什么。我当时觉得是要削弱这两个值或者说这两个变量对应values取值范围差异大对于模型的影响,可到底这么做了之后会有什么效果我自己并不清楚。于是我用图给了自己解释。

上图是capital-gain(lanse)和capital-loss(黄色)直接作为直方图显式的结果,可以看到它们的取值范围相差非常大,这对于模型训练影响是很大的。那么对于它们进行了log计算之后得到的结果如下图:


从图里看到它们之间的数值范围差异被明显缩短了,但是不同的特征之间还是有取值范围差异。为了更好的进行模型的训练,原文作者在此基础之上施加了一个归一化处理,这时capital-gain和capital-loss之间的差异,以及它们和别的参数之间的差异就都限制在了0-1之间了。

Reference

交叉验证与网格搜索

GridSearch(网格搜索)调参相关推荐

  1. ML之Xgboost:利用Xgboost模型(7f-CrVa+网格搜索调参)对数据集(比马印第安人糖尿病)进行二分类预测

    ML之Xgboost:利用Xgboost模型(7f-CrVa+网格搜索调参)对数据集(比马印第安人糖尿病)进行二分类预测 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 grid_s ...

  2. 机器学习之网格搜索调参sklearn

    网格搜索 网格搜索 GridSearchCV我们在选择超参数有两个途径:1凭经验:2选择不同大小的参数,带入到模型中,挑选表现最好的参数.通过途径2选择超参数时,人力手动调节注意力成本太高,非常不值得 ...

  3. 机器学习调参——网格搜索调参,随机搜索调参,贝叶斯调参

    from sklearn.datasets import load_boston from sklearn.metrics import mean_squared_error from lightgb ...

  4. 客户逾期贷款预测[6] - 网格搜索调参和交叉验证

    任务 使用网格搜索对模型进行调优并采用五折交叉验证的方式进行模型评估 实现 之前已经进行过数据探索,缺失值和异常值处理.特征生成.特征删除.缩放等处理,具体可见前几篇博客.本文只进行带交叉验证的网格搜 ...

  5. [实例] 特征选择方法、网格搜索调参、不平衡处理、pu-learning

    注: 很多内容是网上学习而得,感谢大佬们的分享~ 本文所有代码,包括一些参数搜索过程等详见:代码 一.特征选择 特征选择的代码请详见:特征选择基本方法 当特征非常多的时候,会导致算法性能的降低,所以我 ...

  6. 参数调优:K折交叉验证与GridSearch网格搜索

    本文代码及数据集来自<Python大数据分析与机器学习商业案例实战> 一.K折交叉验证 在机器学习中,因为训练集和测试集的数据划分是随机的,所以有时会重复地使用数据,以便更好地评估模型的有 ...

  7. 随机森林(RandomForest,RF)网格搜索法调参

    (随机森林(RandomForest,RF)网格搜索法调参) 摘要:当你读到这篇博客,如果你是大佬你可以选择跳过去,免得耽误时间,如果你和我一样刚刚入门算法调参不久,那么你肯定知道手动调参是多么的低效 ...

  8. 网格搜索法调参神经网络

    网格搜索法调参神经网络 通过包装 Keras 模型来使用 scikit-learn,并学习怎么使用网格搜索(grid search) - 怎样网格搜索通用神经网络参数,如学习速率(learning r ...

  9. 调参必备---GridSearch网格搜索

    什么是Grid Search 网格搜索? Grid Search:一种调参手段:穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果.其原理就像是在数组里找最 ...

  10. c语言网格搜索算法例题,模型参数选择方法——GridSearch网格搜索

    在日常模型训练过程中,模型有多种选择,模型的参数同样也有多种选择,如何根据同一批数据选出最适合的模型和参数呢? 一般情况下,模型还比较好选择,是选用机器学习中分类模型例如 LR.SVM或XGBoost ...

最新文章

  1. 关于maya与max互导FBX出现错误的解决方案。
  2. [Flex] 组件Tree系列 —— 阻止用户点击选中Tree中分支节点
  3. Android应用开发基础篇(1)-----Button
  4. python面向对象(3)
  5. OpenCV 中的图像处理
  6. 聊聊高并发(三十五)Java内存模型那些事(三)理解内存屏障
  7. LeetCode—37. 解数独(困难)
  8. 互联网大厂“抢填”高考志愿
  9. 在SpringBoot中优雅的实现定时任务
  10. Mongodb-副本集
  11. Android图片完整性检验,Android安全测试之应用完整性校验检测
  12. 通过java下载B站视频
  13. Win10 输入法工具栏抽风,无法调整水平垂直。
  14. mac以及windows日语键盘快捷键
  15. win10更新助手_快升级!win10精简版不到10G,比win7还干净流畅,无需更新!
  16. 用计算机算出身高,身高预测公式计算器靠谱吗
  17. 抖音SEO,抖音seo优化
  18. ps4 html5不能试用,PS4主机卡碟,无法取出光盘的处理办法
  19. python灰色波浪线_去除pycharm的波浪线
  20. String以及StringBuffer的基本操作

热门文章

  1. 关于Office 2010激活及一些相关知识
  2. JLink v8的自我救赎 defective or does not support the following memory access Read 0x02000004
  3. android图片素描效果,将图像转换为android中的铅笔素描
  4. 全拼输入法在计算机内部,全拼输入法,怎么安装在电脑里?
  5. eds能谱图分析实例_一文带你全面了解X射线光电子能谱(XPS)谱图分析
  6. LaTeX不显示页码_Ubuntu(20.04 LTS) OS 下 VS Code + LaTeX 快速配置指南
  7. 西门子工业自动化资料大全 (2019年3月8日版)
  8. 应用无界——第二届世界区块链大会·乌镇
  9. 从zookeeper的下载安装到环境配置,轻松入门zookeeper!
  10. Java项目——城市公交查询系统