GradSearchCv 自定义验证集

首先解释一下什么叫使用自定义验证集进行模型调参。GridSearchCV默认使用的模型验证方法是KFold交叉验证,但很多时候我们自己已经预先分配好了验证集,我们就要在这个验证集上评价模型好坏(有些任性),所以我们并不需要GridSearchCV为我们自动产生验证集,这就是所谓的使用自定义验证集进行模型调参。好了,我们首先简单认识一下GridSearchCV的使用。

1. 问题背景
现在假设我有一个训练集,特征为数组train_features,标签为数组train_labels。我还有一个测试集,特征为数组test_features,没有标签。我希望在训练集上学习一个线性SVM,来预测测试集标签。我们知道,SVM有一些超参数需要人工设置,对于线性SVM,最关键的应该就是惩罚参数C。如何找到最优的C呢?通常情况下,我们使用KFold交叉验证。下面就简单介绍一下。

2. GridSearchCV使用简介
直接上代码:

import numpy as np
from sklearn.grid_search import GridSearchCV
from sklearn.svm import LinearSVC
from sklearn.externals import joblib

train_features = np.load(‘train_features.npy‘)
train_labels = np.load(‘train_labels.npy‘)
test_features = np.load(‘test_features.npy‘)

clf = LinearSVC(random_state=0)
params_search = {‘C‘:[1,10,100,1000]} # 我们想要优化的参数
grid_search_params = {‘estimator‘: clf, # 目标分类器
‘param_grid‘: params_search, # 前面定义的我们想要优化的参数
‘cv‘: 3, # 交叉验证split策略
‘n_jobs‘: -1, # 并行运行的任务数,-1表示使用所有CPU
‘verbose‘: 32} # 输出信息,数字越大输出信息越多
grsearch = GridSearchCV(**grid_search_params)
grsearch.fit(train_features, train_labels)
joblib.dump(grsearch, ‘grsearch.model‘)

bst = grsearch.best_estimator_
preds = bst.predict(test_features)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
在上面的代码中,我们使用3-fold交叉验证策略需找C的最优取值,每次的验证集从总的训练集中随机产生。

3. 使用自定义验证集
现在假设我们已经通过某种方式自己定义了训练集和验证集的划分方式,分别为train_features和val_features,我们并不想使用随机的划分,这时候要怎么办呢?可以使用PredefinedSplit。

import numpy as np
from sklearn.grid_search import GridSearchCV
from sklearn.cross_validation import PredefinedSplit
from sklearn.svm import LinearSVC
from sklearn.externals import joblib

train_features = np.load(‘train_features.npy‘)
train_labels = np.load(‘train_labels.npy‘)
val_features = np.load(‘val_features.npy‘)
val_labels = np.load(‘val_labels.npy‘)
test_features = np.load(‘test_features.npy‘)

# 合并训练集和验证集
train_val_features = np.concatenate((train_features,val_features ),axis=0)
train_val_labels = np.concatenate((train_labels,val_labels ),axis=0)

clf = LinearSVC(random_state=0)
test_fold = np.zeros(train_val_features.shape[0]) # 将所有index初始化为0,0表示第一轮的验证集
test_fold[:train_features.shape[0]] = -1 # 将训练集对应的index设为-1,表示永远不划分到验证集中
ps = PredefinedSplit(test_fold=test_fold)
params_search = {‘C‘:[1,10,100,1000]}
grid_search_params = {‘estimator‘: clf, # 目标分类器
‘param_grid‘: params_search, # 前面定义的我们想要优化的参数
‘cv‘: ps, # 使用前面自定义的split验证策略
‘n_jobs‘: -1, # 并行运行的任务数,-1表示使用所有CPU
‘verbose‘: 32} # 输出信息,数字越大输出信息越多
print train_features.shape
print train_labels.shape
grsearch = GridSearchCV(**grid_search_params)
grsearch.fit(train_test_features, train_test_labels)

joblib.dump(grsearch, model_save_path)
bst = grsearch.best_estimator_
preds = bst.predict(test_features)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
这里test_fold是一个索引list,用于划分数据集。除了上面使用的固定一个验证集,还可以划分多重验证集。加入数据集中有4个样本,那么test_fold = [0, 1, -1, 1]就表示在第一个验证集包含索引值为0的样本,第二个验证集包含引值为1的样本,以此类推,从而建立自定义的多重验证集。
这里有一段代码展示了这种划分方式:

>>> from sklearn.cross_validation import PredefinedSplit
>>> X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
>>> y = np.array([0, 0, 1, 1])
>>> ps = PredefinedSplit(test_fold=[0, 1, -1, 1])
>>> len(ps)
2
>>> print(ps)
sklearn.cross_validation.PredefinedSplit(test_fold=[ 0 1 -1 1])
>>> for train_index, test_index in ps:
... print("TRAIN:", train_index, "TEST:", test_index)
... X_train, X_test = X[train_index], X[test_index]
... y_train, y_test = y[train_index], y[test_index]
TRAIN: [1 2 3] TEST: [0]
TRAIN: [0 2] TEST: [1 3]
---------------------
作者:isMarvellous
来源:CSDN
原文:https://blog.csdn.net/isMarvellous/article/details/78195010
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/fujian-code/p/9823441.html

时间: 2024-08-25 08:43:00

GradSearchCv 自定义验证集的相关文章

Mvc自定义验证

假设我们书店需要录入一本书,为了简单的体现我们的自定义验证,我们的实体定义的非常简单,就两个属性,一个名称Name,一个出版社Publisher. public class BookInfo { public string Name { get; set; } public string publisher { get; set; } } Ok,需求有了,实体有了,那么添加我们的控制器和视图.先把代码贴出来.稍后我们在做分析 [HttpGet] public ActionResult Index

WCF使用X509证书自定义验证

接触WCF时间比较短,在项目中要使用X509证书,纠结好几天终于有了结论,因此为了方便日后查阅和园友交流特意单独将部分代码提出,并做以记录. 1.准备工作 制作X509证书,此处用到三个证书名称 导入证书步骤: 第一步:运行mmc 打开控制台,添加证书 将证书导入,再设置证书的读取权限 2.方便阅读下文,先展示下代码整体结构 3.编写服务代码(WcfSite工程下) 服务一: 1 public class HelloService : IHelloService 2 { 3 public str

Laravel 5.5 的自定义验证对象/类

本文和大家分享的主要是Laravel 5.5 的自定义验证对象/类相关内容,一起来看看吧,希望对大家学习Laravel有所帮助. Laravel 5.5 将提供一个全新的自定义验证规则的对象,以作为原来的 Validator::extend 方法的替代. Laravel 中的表单验证是比较方便的,而且内置了大量的可用验证规则,但不管官方提供了多少,总还是会有满足不了需求的时候.很多时候我们会直接用正则表达式来处理这种特殊的验证,也有时候我们会选择用 Validator::extend来扩展一个自

sencha touch Model validations 自定义验证 二选一输入验证、重复验证

项目初始化时执行以下代码 1 //重写模型,方便进行自定义验证 2 Ext.define("Ext.zh.data.Model", { 3 override: "Ext.data.Model", 4 validate: function () { 5 var errors = Ext.create('Ext.data.Errors'), 6 validations = this.getValidations().items, 7 validators = Ext.d

validate自定义验证,进行小数点后2位小数的验证(完美)

1.进行form表单提交(咱们这个表单提交的是数字) <form action="" method="post" id="form" target="_blank"> <input class="form-control" type="text" id="cash" name="cash"> <button type=

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttribute应用到Model的类型或者属性上即可.对于自定义验证,我们也只需要定义相应的Validation 就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤.[源代码从这里下载] 一.AgeRangeAttr

easyui 自定义验证,动态设置提示信息

//自定义验证规则 名称为name //$.fn.validatebox.defaults.rules.name.message 动态自定义提示内容 $.extend($.fn.validatebox.defaults.rules, { name: { validator: function (value, param) { var error=false;; if(!/^\S{4,25}$/.test(value)){ //4-25验证 $.fn.validatebox.defaults.ru

thinkphp5.0自定义验证器

虽然我早就会些php基础语法,我套过数据,自己写的控制器层,不是用的api方式,那个公司是为了锻炼我,所以才那样做的,基本上的东西都是用的框架自带的,重来自己没有去封装过这些东西,所以编程思想上,还很欠缺,所以我得先好好模仿一下别人的代码. 问题: 如何自定义验证器类,并且如何使用自定义规则; 不管是验证器,还是拦截器,过滤器,都是要先继承相应的类,只要继承了就是对应的什么验证器,拦截器...了; eg: 1.自定义验证器类 class ValidateCustom extends Valida

Struts2之—自定义结果集实现ajax

项目中我们经常遇到这样的需求--页面部分刷新,例如:添加用户,转到添加用户页面时,页面自动加载了所有部门. 完整流程:选择所属部门,填写用户名和密码,点击"注册" 填写用户名后,需要立即检查数据库是否存在此用户名,如何在不刷新页面的情况下实现此效果? 但看上面提出的问题并不难,情况很常见,都知道使用ajax实现,但是如何在struts中自定义结果集来实现ajax--这是这篇博客的重点. (注:servlet要么转发要么重定向,struts2可以自定义结果集) 转发.重定向.action