百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

5行代码使Scikit-Learn参数学习速度提高5倍

toyiye 2024-06-21 12:26 9 浏览 0 评论

大家都知道Scikit-Learn——它是数据科学家基本都知道的产品,提供了几十种易于使用的机器学习算法。它还提供了两种现成的技术来解决超参数调整问题:网格搜索(GridSearchCV)和随机搜索(RandomizedSearchCV)。

这两种技术都是找到正确的超参数配置的强力方法,但是这是一个昂贵和耗时的过程!

如果想加快这个过程呢

Tune sklearn是Scikit Learn模型选择模块的一个替代品,采用了先进的超参数调整技术(贝叶斯优化、早期停止、分布式执行)——这些技术比网格搜索和随机搜索提供了显著的加速!

以下是tune sklearn提供的功能:

  • 与Scikit Learn API的一致性:tune sklearn是GridSearchCV和RandomizedSearchCV的一个替换,因此你只需要在标准Scikit Learn脚本中更改不到5行即可使用API。
  • 现代超参数调整技术:tune-sklearn允许你通过简单地切换几个参数,就可以轻松地利用贝叶斯优化、超空间和其他优化技术。
  • 框架支持:tune-sklearn主要用于调优Scikit-Learn模型,但它也支持并为许多其他具有Scikit-Learn框架提供示例,例如Skorch (Pytorch)、KerasClassifiers(Keras)和XGBoostClassifiers(XGBoost)。
  • 分布式:Tune sklearn利用Ray Tune,一个分布式超参数调优库,高效透明地并行化多核甚至多台机器上的交叉验证。

Tune sklearn也很快。为了看到这一点,我们在标准的超参数扫描上,将tune sklearn(启用早期停止)与本机Scikit Learn进行基准测试。在我们的基准测试中,我们可以看到普通笔记本电脑和48个CPU核心的大型工作站的显著性能差异。

对于更大的基准48核计算机,Scikit Learn花了20分钟在大小为40000的数据集上搜索75个超参数集。Tune sklearn只花了3.5分钟,并且以最小影响性能的方式执行。

第一个图:在个人双核i5 8gb ram笔记本电脑上,搜索6个超参集。第二个图:在一台48核250gb ram的大型计算机上,搜索75个超参集。

注意:对于较小的数据集(10000个或更少的数据点),在试图应用早期停止时,可能会牺牲准确性。我们预计这不会对用户产生影响,因为该库旨在用大型数据集加速大型训练任务。

简单的60秒漫游

运行pip install tune-sklearn ray[tune]开始下面章节的示例代码。

让我们来看看它是如何工作的。

Hyperparam set 2是一组没有希望的超参数,它将被tune的早期停止机制检测到,并提前停止以避免浪费训练时间和资源。

TuneGridSearchCV示例

首先,只需更改import语句即可获得Tune的网格搜索交叉:

# from sklearn.model_selection import GridSearchCV
from tune_sklearn import TuneGridSearchCV

从这里开始,我们将像在Scikit Learn的接口风格中继续!让我们使用一个“虚拟”自定义分类数据集和一个SGD分类程序来对数据进行分类。

我们选择SGDClassifier是因为它有一个partial_fit的 API,这使得它能够停止拟合特定超参数配置的数据。如果估计器不支持早期停止,我们将回到并行网格搜索。

# 导入其他库
import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import SGDClassifier

# 设置训练集和验证集
X, y = make_classification(n_samples=11000, n_features=1000, n_informative=50, 
                           n_redundant=0, n_classes=10, class_sep=2.5)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1000)

# 从SGDClassifier调优的示例参数
parameters = {
   'alpha': [1e-4, 1e-1, 1],
   'epsilon':[0.01, 0.1]
}

如你所见,这里的设置正是你为Scikit Learn所做的设置!现在,让我们试着拟合一个模型。

tune_search = TuneGridSearchCV(
    SGDClassifier(),
    parameters,
    early_stopping=True,
    max_iters=10
)
import time # 比较拟合时间
start = time.time()
tune_search.fit(X_train, y_train)
end = time.time()
print("Tune Fit Time:", end - start)
pred = tune_search.predict(X_test)
accuracy = np.count_nonzero(np.array(pred) == np.array(y_test)) / len(pred)
print("Tune Accuracy:", accuracy)

请注意我们在上面介绍的细微差别:

  1. 一个新的early_stopping变量,以及
  2. max_iters参数

early_stopping决定何时停止,MedianStoppingRule 是一个很好的默认设置。

max_iters是给定的超参数集可以运行的最大迭代次数;如果提前停止搜索超参数集,则可以运行较少的迭代。

请尝试将其与GridSearchCV进行比较

from sklearn.model_selection import GridSearchCV
# n_jobs=-1 使用所有内核
sklearn_search = GridSearchCV(
   SGDClassifier(),
   parameters,
   n_jobs=-1
)

start = time.time()
sklearn_search.fit(X_train, y_train)
end = time.time()
print("Sklearn Fit Time:", end - start)
pred = sklearn_search.predict(X_test)
accuracy = np.count_nonzero(np.array(pred) == np.array(y_test)) / len(pred)
print("Sklearn Accuracy:", accuracy)

TuneSearchCV贝叶斯优化示例

除了网格搜索接口之外,tunesklearn还提供了一个接口TuneSearchCV,用于从超参数分布中进行采样。

此外,只需几行代码更改,就可以轻松地对TuneSearchCV中的发行版启用贝叶斯优化。

运行pip install scikit-optimize以尝试以下示例:

from tune_sklearn import TuneSearchCV

# 其他导入
import scipy
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import SGDClassifier

# 设置训练集和验证集
X, y = make_classification(n_samples=11000, n_features=1000, n_informative=50, 
                           n_redundant=0, n_classes=10, class_sep=2.5)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1000)

# 从SGDClassifier调优的示例参数
# 注意,如果需要贝叶斯优化,则使用元组
param_dists = {
   'alpha': (1e-4, 1e-1),
   'epsilon': (1e-2, 1e-1)
}

tune_search = TuneSearchCV(SGDClassifier(),
   param_distributions=param_dists,
   n_iter=2,
   early_stopping=True,
   max_iters=10,
   search_optimization="bayesian"
)

tune_search.fit(X_train, y_train)
print(tune_search.best_params_)

第17、18和26行是为启用贝叶斯优化而更改的代码行

如你所见,将tunesklearn集成到现有代码中非常简单。

另外请看一看Ray对joblib的替代,它允许用户在多个节点(而不仅仅是一个节点)上并行化训练,从而进一步加快了训练速度。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码