工具系列:PyCaret介绍_编写和训练自定义机器学习模型

文章目录

      • PyCaret
      • 安装PyCaret
      • 👉 让我们开始吧
      • 👉 数据集
      • 👉 数据准备
      • PyCaret中的设置函数
      • 👉 可用模型
      • 👉 模型训练与选择
      • 👉 编写和训练自定义模型
        • 👉 GPLearn模型
        • 👉 NGBoost 模型
        • 👉 编写自定义类

在这里插入图片描述

PyCaret

PyCaret是一个开源的、低代码的机器学习库和端到端模型管理工具,使用Python构建,用于自动化机器学习工作流程。它因其易用性、简单性和快速高效地构建和部署端到端ML原型的能力而广受欢迎。

PyCaret是一个可替代数百行代码的低代码库,只需几行代码即可。这使得实验周期指数级地快速和高效。

PyCaret简单易用。在PyCaret中执行的所有操作都顺序存储在一个管道中,该管道完全自动化用于部署。无论是填充缺失值、独热编码、转换分类数据、特征工程,还是超参数调整,PyCaret都可以自动化完成。

安装PyCaret

安装PyCaret非常容易,只需几分钟即可完成。我们强烈建议使用虚拟环境,以避免与其他库可能发生的冲突。

PyCaret的默认安装是一个精简版的pycaret,只安装硬依赖项在此处列出。

# 安装slim版本(默认)
pip install pycaret

# 安装完整版本
pip install pycaret[full]

当您安装完整版的pycaret时,所有可选依赖项都会被安装,如此处所列。

👉 让我们开始吧

在我们开始讨论自定义模型训练之前,让我们先看一下PyCaret如何使用开箱即用的模型进行快速演示。我将使用PyCaret存储库上可用的“保险”数据集。该数据集的目标是基于某些属性预测患者的费用。

👉 数据集

# 从pycaret仓库中读取数据
from pycaret.datasets import get_data

# 使用get_data函数从pycaret仓库中获取insurance数据集
data = get_data('insurance')

在这里插入图片描述

👉 数据准备

在PyCaret中,对于所有模块来说,设置(setup)是在PyCaret中执行任何机器学习实验的第一个且唯一必需的步骤。这个函数负责在训练模型之前进行所有必要的数据准备工作。除了执行一些基本的默认处理任务外,PyCaret还提供了广泛的预处理功能。要了解PyCaret中的所有预处理功能,请参阅此链接。

# 导入pycaret.regression模块中的所有函数
from pycaret.regression import *

# 初始化设置
# data为数据集,target为目标变量
# s为初始化后的设置,包含了数据预处理、特征工程、模型选择等步骤
s = setup(data, target='charges')

在这里插入图片描述

PyCaret中的设置函数

每当您在PyCaret中初始化设置函数时,它会对数据集进行分析,并推断所有输入特征的数据类型。如果所有数据类型都被正确推断,则可以按Enter键继续。
在这里插入图片描述

👉 可用模型

要查看所有可用于训练的模型列表,您可以使用名为 models 的函数。它会显示一个包含模型ID、名称和实际估计器引用的表格。

# 导入必要的库
import torch
from transformers import AutoModel, AutoTokenizer

# 定义一个函数,用于打印所有可用的模型
def models():
    # 获取所有可用的预训练模型的名称
    model_names = AutoModel.from_pretrained.__self__.CONFIG_PRETRAINED_MODEL_ARCHIVE_LIST
    
    # 打印所有可用的模型名称
    for name in model_names:
        print(name)

# 调用函数,打印所有可用的模型
models()

在这里插入图片描述

👉 模型训练与选择

在PyCaret中,用于训练任何模型的最常用函数是create_model。它接受一个你想要训练的估计器的ID。

# 创建决策树模型
dt = create_model('dt')

在这里插入图片描述

输出显示了10折交叉验证的指标,包括均值和标准差。这个函数的输出是一个训练好的模型对象,本质上是一个scikit-learn对象。

# 打印当前日期和时间
print(dt)

在这里插入图片描述

要在循环中训练多个模型,您可以编写一个简单的列表推导式:

# 创建多个模型

# 创建一个包含多个模型的列表,模型类型分别为'dt'、'lr'和'xgboost'
multiple_models = [create_model(i) for i in ['dt', 'lr', 'xgboost']]

# 检查 multiple_models 的类型和长度
type(multiple_models), len(multiple_models)
>>> (list, 3)

# 打印 multiple_models
print(multiple_models)

在这里插入图片描述

如果你想训练库中所有可用的模型而不是只选择几个,你可以使用PyCaret的compare_models函数,而不是编写自己的循环(尽管结果将是相同的)。

# compare_models()函数是一个用于比较所有模型的函数,它会返回最佳模型。

best_model = compare_models()  # 调用compare_models()函数,并将返回的最佳模型赋值给best_model变量。

在这里插入图片描述

compare_models 函数返回的输出显示了所有模型的交叉验证指标。根据这个输出,Gradient Boosting Regressor 是最佳模型,使用 10 折交叉验证在训练集上的平均绝对误差(MAE)为 2,702。

# 打印最佳模型
print(best_model)

在这里插入图片描述

上面网格中显示的指标是交叉验证分数,用于检查最佳模型在留出集上的分数:

# 预测保留集上的结果
pred_holdout = predict_model(best_model)

在这里插入图片描述

为了在未见过的数据集上生成预测,您可以使用相同的predict_model函数,只需传递一个额外的参数data:

# 创建数据的副本并删除目标列
data2 = data.copy()  # 创建data的副本,命名为data2
data2.drop('charges', axis=1, inplace=True)  # 在data2中删除'charges'列,axis=1表示按列删除

# 生成预测
predictions = predict_model(best_model, data=data2)  # 使用best_model对data2进行预测,将结果保存在predictions中

在这里插入图片描述

👉 编写和训练自定义模型

到目前为止,我们已经看到了如何对PyCaret中所有可用的模型进行训练和模型选择。然而,PyCaret对于自定义模型的工作方式完全相同。只要你的估计器与sklearn API风格兼容,它就会以相同的方式工作。让我们看几个例子。

在我展示如何编写自己的自定义类之前,我将首先演示如何使用自定义的非sklearn模型(即不在sklearn或pycaret的基本库中的模型)。

👉 GPLearn模型

虽然遗传编程(GP)可以用于执行非常广泛的任务,但gplearn被有意地限制为解决符号回归问题。

符号回归是一种机器学习技术,旨在识别最能描述关系的基础数学表达式。它首先通过构建一组天真的随机公式来表示已知独立变量和它们的依赖变量目标之间的关系,以预测新数据。然后,每一代程序都是从前一代中选择适应度最高的个体经过遗传操作进化而来的。

要使用gplearn中的模型,您首先需要安装它:

# 导入所需的库
import numpy as np
from gplearn.genetic import SymbolicRegressor

# 创建一个简单的数据集
X_train = np.arange(0, 10, 0.1).reshape(-1, 1)
y_train = np.sin(X_train).ravel()

# 创建一个符号回归器对象
est_gp = SymbolicRegressor(population_size=500, generations=20, stopping_criteria=0.01,
                           p_crossover=0.7, p_subtree_mutation=0.1, p_hoist_mutation=0.05,
                           p_point_mutation=0.1, max_samples=0.9, verbose=1,
                           parsimony_coefficient=0.01, random_state=0)

# 使用训练数据拟合符号回归器
est_gp.fit(X_train, y_train)

# 打印符号回归器的最佳表达式
print(est_gp._program)

现在你可以简单地导入未训练的模型并将其传递给create_model函数:

# 入未经训练的估计器
from gplearn.genetic import SymbolicRegressor
# 创建一个SymbolicRegressor对象,作为未经训练的估计器
sc = SymbolicRegressor()

# 使用create_model函数对sc进行训练
sc_trained = create_model(sc)

在这里插入图片描述

## 打印已经训练好的sc_trained变量的值

在这里插入图片描述

您还可以检查此模型的保留分数:

## 检查留存数据的得分
pred_holdout_sc = predict_model(sc_trained)

在这里插入图片描述

👉 NGBoost 模型

ngboost 是一个实现了自然梯度提升的 Python 库,如 “NGBoost: Natural Gradient Boosting for Probabilistic Prediction” 中所述。它构建在 Scikit-Learn 之上,旨在在选择适当的评分规则、分布和基学习器方面具有可扩展性和模块化性。关于 NGBoost 方法学的教学介绍可在此 幻灯片 中找到。

要使用 ngboost 中的模型,您首先需要安装 ngboost:

# 导入所需的库
import numpy as np
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from ngboost import NGBRegressor
from ngboost.distns import Normal

# 生成回归数据集
X, y = make_regression(n_samples=100, n_features=1, noise=0.1, random_state=0)

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 创建NGBRegressor模型
ngb = NGBRegressor(Dist=Normal)

# 训练模型
ngb.fit(X_train, y_train)

# 使用训练好的模型进行预测
y_pred = ngb.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)

# 打印均方误差
print("均方误差:", mse)

代码解释:

  1. 导入所需的库:导入numpy库用于数值计算,导入make_regression函数用于生成回归数据集,导入train_test_split函数用于划分数据集,导入mean_squared_error函数用于计算均方误差,导入NGBRegressor类和Normal类用于创建和训练NGBRegressor模型。
  2. 生成回归数据集:使用make_regression函数生成包含100个样本和1个特征的回归数据集,噪声为0.1,随机种子为0。
  3. 将数据集划分为训练集和测试集:使用train_test_split函数将生成的数据集划分为训练集和测试集,测试集占总样本的20%,随机种子为0。
  4. 创建NGBRegressor模型:使用NGBRegressor类创建一个NGBRegressor模型,指定分布类型为Normal。
  5. 训练模型:使用fit方法训练NGBRegressor模型,传入训练集的特征和标签。
  6. 使用训练好的模型进行预测:使用predict方法对测试集的特征进行预测,得到预测结果。
  7. 计算均方误差:使用mean_squared_error函数计算预测结果与测试集标签之间的均方误差。
  8. 打印均方误差:将计算得到的均方误差打印出来。

一旦安装完成,您可以从ngboost库中导入未经训练的估计器,并使用create_model来训练和评估模型:

 # 导入未经训练的估计器
from ngboost import NGBRegressor
ng = NGBRegressor()

# 使用create_model进行训练
ng_trained = create_model(ng)

在这里插入图片描述

# 打印ng_trained
print(ng_trained)

在这里插入图片描述

👉 编写自定义类

上述的两个例子gplearn和ngboost是pycaret的自定义模型,因为它们在默认库中不可用,但您可以像使用其他开箱即用的模型一样使用它们。然而,可能会有一种情况需要编写自己的算法(即算法背后的数学),在这种情况下,您可以继承sklearn的基类并编写自己的数学。

让我们创建一个天真的估计器,在拟合阶段学习目标变量的平均值,并对所有新数据点预测相同的平均值,而不考虑X输入(在现实生活中可能没有用,但只是为了演示功能)。

# 创建自定义的估计器

import numpy as np
from sklearn.base import BaseEstimator

class MyOwnModel(BaseEstimator):
    
    def __init__(self):
        self.mean = 0  # 初始化均值为0
        
    def fit(self, X, y):
        self.mean = y.mean()  # 计算目标变量y的均值
        return self
    
    def predict(self, X):
        return np.array(X.shape[0]*[self.mean])  # 返回一个长度为X的样本数量的数组,每个元素都是均值

现在让我们使用这个估计器进行训练:

# 创建一个名为mom的MyOwnModel类的实例对象

mom = MyOwnModel()

# 使用create_model函数对mom进行训练,并将训练后的模型保存在mom_trained中

mom_trained = create_model(mom)

在这里插入图片描述

# 生成数据的预测结果

# 使用训练好的mom_trained模型对数据进行预测

# predict_model函数用于生成数据的预测结果,接受两个参数:模型mom_trained和数据data

predictions = predict_model(mom_trained, data=data)

在这里插入图片描述

请注意,标签列(即预测结果)对于所有行来说都是相同的数字$13,225,这是因为我们以这样的方式创建了这个算法,它从训练集的均值中学习并预测相同的值(只是为了保持简单)。

我希望您能欣赏PyCaret的易用性和简单性。只需几行代码,您就可以进行端到端的机器学习实验,并编写自己的算法,而无需调整任何原生代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决log4j多个日志都写到一个文件

之前客户端程序由于Websockt包依赖的log4j,就用log4j写日志了,Web用的log4j2没毛病。用log4j的多个logger的日志都写到一个文件里了,查了很多资料都没解决。今天闲了解决一下。 最后好使的配置 # 设置日志根 log4j.rootLogger INFO,Except…

嵌入式开发中利用strstr()对部分模块回传数据进行解析的问题(坑)

受到以下博文的启发: https://www.cnblogs.com/yup1983/p/11337837.html 验证: 最近通过ESP8266远程控制小车,在wifi回传的数据解析过程中遇到标题所述的烦恼 如上截图所示,数据回传过程中会接受到‘\0’字节对应的ASCII码为0x0…

基于IPP-FFT的线性调频Z(Chirp-Z,CZT)的C++类库封装并导出为dll(固定接口支持更新)

上一篇分析了三种不同导出C++类方法的优缺点,同时也讲了如何基于IPP库将FFT函数封装为C++类库,并导出为支持更新的dll库供他人调用。 在此基础上,结合前面的CZT的原理及代码实现,可以很容易将CZT变换也封装为C++类库并导出为dll,关于CZT的原理和实现,如有问题请参考: …

大数据应用开发1——配置基础环境

一、基础环境配置 1.配置虚拟网络 1.1、点击1、编辑2和3, 1.2、点开4,编辑网关 2、配置虚拟机环境 1.1、安装一台虚拟机,使用root用户登录,打开终端 1.2修改主机名 终端输入: vim /etc/hostname使用vim编辑/etc/ho…

MQ(消息队列)相关知识

1. 什么是mq 消息队列是一种“先进先出”的数据结构 2. 应用场景 其应用场景主要包含以下3个方面 应用解耦 系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何…

SpringMVC核心处理流程梳理

1、处理流程图展示 当我拿出这张图,阁下又该如何应对呢?执行流程是不是一目了然了。 2、DispatcherServlet:中央处理器或者中央调度器 下图官方的解释应该最完善了。 3、SpringMVC三大核心组件 HandlerMapping 处理器映射器,…

iApp最新版无服务器多功能软件库源码

无需服务器的多功能软件库源码分享,仅需添加一个后台应用和一个文档即可 使用教程如下: 在浏览器中打开理想后台地址:http://apps.xiaofei.run/user/ 如果没有账号,请注册一个免费账号。 登录账号后,添加一个后台应…

Oracle 学习(1)

Oracle简介 Oracle是殷墟(yīn Xu)出土的甲骨文(oracle bone inscriptions)的英文翻译的第一个单词,在英语里是“神谕”的意思。Oracle公司成立于1977年,总部位于美国加州,是世界领先的信息管…

微信小程序(uniapp)api讲解

Uniapp是一个基于Vue.js的跨平台开发框架,可以同时开发微信小程序、H5、App等多个平台的应用。下面是Uniapp常用的API讲解: Vue.js的API Uniapp采用了Vue.js框架,因此可以直接使用Vue.js的API。例如:v-show、v-if、v-for、comput…

类和对象

1 类定义: class ChecksumAccumulator {// class definition goes here } 你就能创建 ChecksumAccumulator 对象:new CheckSumAccumulator 注:1scala类中成员默认是public类型,若设为私有属性则必须加private关键字。在scala中是…

Defi安全-Mono攻击事件分析--etherscan+phalcon

MonoX攻击事件相关信息 在Ethereum和Polygon网络都发生了,攻击手段相同,以Ethereum为例进行分析: 攻击者地址:MonoX Finance Exploiter | Address 0xecbe385f78041895c311070f344b55bfaa953258 | Etherscan 攻击合约&#xff1a…

JavaScript常用技巧专题五

文章目录 一、使用适当的命名和注释来提高代码可读性二、优雅的写条件判断代码2.1、普通的if else2.2、三元运算符2.3、多个if else2.4、switch case2.5、对象写法2.6、Map写法 三、封装条件语句四、函数应该只做一件事五、Object.assign给默认对象赋默认值六、函数参数两个以下…

OpenGL 绘制Mesh数据(Qt)

文章目录 一、简介二、实现代码三、实现效果一、简介 Mesh数据的结构主要就是点与三角面片,因此本质上仍然是对三角面片进行绘制。这里我们借助VCG这个库实现对Mesh数据的读取,这个库相对简单轻巧,很方便使用。 二、实现代码 由于修改的部分很多,我们逐一进行解释一下: --…

云服务器安装Docker并启动相关服务

云服务器安装Docker 环境准备1、云服务器2、在windterm创建会话2.1、登录2.2、身份验证失败的解决方案在创建好终端服务器修改密码修改会话设置取消不必要的验证 2.3生成密钥流程 3、安装docker3.1 安装报错3.2 解决方案3.2.1操作步骤3.2.1.1 查看当前目录下有那些文件3.2.1.2跳…

智能算法(GA、DBO等)求解零空闲流水车间调度问题(NIFSP)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

6G未来的潜在应用场景

虽然目前6G还不是一种可行技术,但是离6G技术成熟和普及的时间应该不远了。未来6G一旦普及,将能够支持全球更大的设备网络,彻底改变医疗保健等行业的应用,并将有助于更多技术的开发和普及。 虽然过渡到6G技术需要时间,…

【C++11/17】std::map高效插入

我们在使用stl的映射容器std::map时,经常需要向容器中插入数据。由于map的元素key值是唯一的,我们经常遇到这样的场景: 向map中插入元素时,指定的key已经存在则直接更新;指定的key不存在,然后才做插入操作…

解读SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC

SPP与SPPF 一、SPP的应用的背景 在卷积神经网络中我们经常看到固定输入的设计,但是如果我们输入的不能是固定尺寸的该怎么办呢? 通常来说,我们有以下几种方法: (1)对输入进行resize操作,让他们…

Netty-4-网络编程模式

我们经常听到各种各样的概念——阻塞、非阻塞、同步、异步,这些概念都与我们采用的网络编程模式有关。 例如,如果采用BIO网络编程模式,那么程序就具有阻塞、同步等特质。 诸如此类,不同的网络编程模式具有不同的特点&#xff0c…

linux循环调度执行

9.2 循环调度执行 9.2.1 简介 cron的概念和crontab是不可分割的。 ​ crontab是一个命令,常见于Unix和Linux的操作系统之中用于设置周期性被执行的指令。 ​ 该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执…