30分钟学会CatBoost

模型融合---CatBoost总结 一、Catboost简介 全称:Gradient Boosting(梯度提升) + Categorical Features(类别型特征) 作者:俄罗斯的搜索巨头Yandex 官方地址 论文链接 | 项目地址 文档地址 视频 二、Catboost的特点   一般来说,Gradient Boosting(GB)方法适用于异质化数据。即,若你的数据集全由图片数据构成... 阅读详情
AI摘要

本文介绍CatBoost算法的特点与优势,详细解释其针对类别特征处理的OrderedTargetStatistics编码方法、特征交叉方法及OrderedBoosting方法,并通过实例展示如何使用CatBoost解决实际问题。

一,CatBoost简介

CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。

正如其名字所说那样,CatBoost主要是在类别特征上的处理上做了很多的改进。

从用户使用角度来看,相比XGBoost和LightGBM,CatBoost具有如下特点。

  • 模型精度:XGBoost和LightGBM相当,CatBoost往往略好一些,无需调参即可获取很好的结果。

  • 训练速度:LightGBM远快于XGBoost,CatBoost快于XGBoost但比LightGBM慢。

  • 预测速度:LightGBM与XGBoost相当,CatBoost远快于LightGBM与XGBoost,是它们的几十分之一。

  • 内存消耗:LightGBM远小于XGBoost,CatBoost小于XGBoost,但大于LightGBM。

  • 类别特征:XGBoost不支持类别特征,需要OneHot编码预处理。LightGBM支持类别特征,需转换成整数编码。CatBoost提供更强大的对类别特征的支持,直接支持字符串类型的类别特征,无需预处理。

  • 缺失值特征:XGBoost和LightGBM都可以自动处理特征缺失值,CatBoost不能自动处理缺失值(或者将缺失值视为最小值/最大值)。

  • GPU支持:LightGBM与CatBoost支持GPU训练,XGBoost也支持GPU训练。

  • 可视化:CatBoost还自带一套可视化工具,可以在Jupyter Notebook或者TensorBoard中实时看到指标变化。

CatBoost主要创新点如下:

  • 类别特征的 Ordered Target Statistics 数值编码方法。

  • 基于贪心策略的特征组合方法。

  • 避免预测偏移的 Ordered Boosting 方法。

  • 使用对称二叉树作为基模型,有正则作用且预测极快。

eafdb015beeb8a6625e97d482ef9667a.png

二,原理说明

1, 类别特征的Ordered Target Statistics 数值编码方法

对于类别特征,如果类别数目不多,可以使用onehot编码。

但如果类别数量成百上千,使用onehot编码会导致特征数量爆炸。

CatBoost设计了一种基于预测目标统计值的方法可以将类别特征转化为数值特征。

以风控领域的预测信贷用户是否会违约为例,假设有一个类别特征是根据身份证号码解析出来的用户所出生的城市。

全国有几百个城市,转化为onehot编码会造成特征维数爆炸。

一种非常make sense 的方式是我们用某个城市用户的平均逾期率来作为该城市的数值特征编码。

简而言之,我们用如下方式将 city = "上海" 这一类别特征取值 代替为如下值。

city_numeric("上海") = sample_count(city="上海" and label=1(逾期)) / sample_count(city="上海")

这就是所谓的 Target Statistics 编码方法。

但是考虑到有一些小城市,比如黑龙江鹤岗市,可能在训练样本中数量很少甚至没有,这时候用训练样本中鹤岗市的用户平均逾期率来估计会比较不靠谱。

例如鹤岗市只有1个样本,并且这个样本是逾期的,那么数值编码

city_numeric("鹤岗") = sample_count(city="鹤岗" and label=1(逾期)) / sample_count(city="鹤岗") = 1.0

我们可以考虑加入先验值来抑制这种小样本的波动。

假设不区分城市,全部训练样本中用户的 逾期率 为 P = 0.1, 我们可以在分子分母上分别加入 a = 100个 逾期率为P 的先验样本。

city_numeric("鹤岗") = (sample_count(city="鹤岗" and label=1(逾期)) + a·P) / (sample_count(city="鹤岗")+ a) = 11/101

这样就合理多了。

这种数值编码方式虽然好,但是会造成训练集中 label的泄露,因为对于某个样本来说,其数值编码计算过程中已经把这个样本的 label值纳入了计算过程中。

未来要预测的验证集的数据分布未必与训练集相同,例如训练集中 上海市 用户的平均逾期率为 0.12,但是验证集中上海市用户的平均逾期率可能只有0.04,在训练集中这个 city_numeric特征可能会特别好用,特别重要,但是在验证集中可能会变得没有那么好用,没有那么重要。

为了让模型正确地评估 city_numeric 特征的真实有效性和重要程度,我们可以拿出一部分数据来计算这个 特征编码,用另外一部分数据来训练。但是这样会造成可用数据的减少。

CatBoost巧妙地设计了如下trick,来缓解这个问题。先将样本随机打乱,然后每个样本只使用它排序在它前面的样本来计算其类别特征的数值编码。这样就防止了label的泄露,并且能够较为合理地评估 这个特征的真实有效性。

不过这种方式会造成排在前面的样本的类别特征的数值编码估计不是很准,为了减少这个影响,CatBoost会设计多个样本随机排列(默认4个),在每次建树前从中随机取一个排列。

以上就是所谓的 Ordered Target Statistics 编码方法,也是CatBoost最重要的创新。

516c42912cf9adbb2d06495e165f7466.png

2,基于贪心策略的特征交叉方法

使用Ordered Target Statistics 方法将类别特征转化成为数值特征以后,会影响到特征交叉,因为数值特征无法有效地进行交叉。

依然以风控领域的预测信贷用户是否会违约为例,假设 city="北京市" 且 job="保安" 的用户信用特别好,但不是北京市所有的用户都信用好,也不是所有的保安都信用特别好。只有北京市的保安这个群体才信用好。

如果我们将 city转换为数值编码,也将保安转换为数值编码之后,我们得到两个数,这两个数相乘是没有意义的,我们无法表示 北京市的保安这个群体。

为了有效地利用特征交叉,CatBoost 在将类别特征转换为数值编码的同时,会自动生成 交叉特征。

如果让全部的类别特征之间都进行交叉,两两交叉,三三交叉,四四交叉,这个复杂度是指数级的,特征维度一定会爆炸。

CatBoost使用一种贪心的策略来进行特征交叉。生成tree的第一次分裂,CatBoost不使用任何交叉特征。在后面的分裂中,CatBoost会使用生成tree所用到的全部原始特征和交叉特征 跟 数据集中的全部 类别特征进行交叉。

在定义CatBoost模型时,我们可以用'max_ctr_complexity' 来控制允许的特征交叉的最大特征数量,如果设置为3,那么生成tree时所用到的交叉特征最多只会来自3个特征的交叉,也就是我们只能表示 city='北京市' 且 job='保安' 且 education='高中'这样的三阶交叉特征,而无法表示  city='北京市' 且 job='保安' 且 education='高中' 且 hobby='抽烟' 这样的四阶交叉特征。

3,避免预测偏移的 Ordered Boosting 方法。

使用XGBoost或者LightGBM做模型时,我们可能经常会发现模型在训练集上拟合的很好,train_auc甚至达到了1.0, 但是在验证集上却差了很多, va_auc 可能只有0.7。这当然有可能是因为tree的数量太多了,或者是每棵tree的leaves太多了,总之模型太复杂了造成了过拟合。

但也有一些XGBoost和LightGBM自身算法的缺陷因素。我们知道LightGBM在训练下一棵tree的时候,需要计算前面这些tree构成的加法模型在所有样本上的一阶梯度和二阶梯度(Loss对模型预测结果的导数),然后用这些梯度来决定下一棵树的结构和叶子节点取值。

但是我们计算的这些一阶梯度和二阶梯度值是问题的。前面的这些tree都是在这些样本上训练的,现在我们又在这些样本上估计模型预测结果的一阶和二阶梯度。我们应该换一些新的样本才更合理。但是我们从哪里找这些新的样本呢?

CatBoost 的作者故伎重演。先将样本随机打乱,然后每个样本只使用排序在它前面的样本来训练模型。用这样的模型来估计这个样本预测结果的一阶和二阶梯度。然后用这些梯度构建一棵tree的结构,最终tree的每个叶子节点的取值,是使用全体样本进行计算的。

这就是Ordered Boosting的主要思想。可以有效地减少梯度估计的误差,缓解预测偏移。但是会增加较多的计算量,影响训练速度。

在定义CatBoost模型时,我们可以用'boosting_type'这个参数来设置是使用Ordered Boosting 还是 LightGBM那样的 Plain Boosting。如果不显式设置,CatBoost会根据样本和特征数量自己决定。

a9a7679d2cb6be377668c838b4f4838e.png

4,使用对称二叉树作为基模型,有正则作用且预测极快

XGBoost和LightGBM采用的基模型是普通的二叉树,但是CatBoost采用的是对称的二叉树。

这种对树结构上的约束有一定的正则作用。更为重要的是,它可以让CatBoost模型的推断过程极快。

对于CatBoost的tree的预测过程来说,每个特征的分裂都是独立的,不分先后顺序,多个样本可以一起预测。

85c1d41c20b6a6dd7c9ad75d75431c25.png

三,使用范例

#!pip install catboost 
import catboost as cb 
print(cb.__version__)

1.0.4

from IPython.display import display 

import datetime,json
import numpy as np
import pandas as pd
import catboost as cb 
from catboost.datasets import titanic
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold

from sklearn.metrics import f1_score,roc_auc_score,accuracy_score
import plotly.graph_objs as go 
import plotly.express as px 


def printlog(info):
    nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print("\n"+"=========="*8 + "%s"%nowtime)
    print(info+'...\n\n')
     
#================================================================================
# 一,准备数据
#================================================================================
printlog("step1: preparing data...")

dfdata,dftest = titanic()

display(dfdata.head()) 

label_col = "Survived"

# 填充空值特征
dfnull = pd.DataFrame(dfdata.isnull().sum(axis=0),columns = ["null_cnt"]).query("null_cnt>0")
print("null_features:") 
print(dfnull)

dfdata.fillna(-9999, inplace=True)
dftest.fillna(-9999, inplace=True)


# 刷选类别特征
cate_cols = [x for x in dfdata.columns 
             if dfdata[x].dtype not in [np.float32,np.float64] and x!=label_col]
for col in cate_cols:
    dfdata[col] = pd.Categorical(dfdata[col]) 
    dftest[col] = pd.Categorical(dftest[col]) 

# 分割数据集
dftrain,dfvalid = train_test_split(dfdata, train_size=0.75, random_state=42)
Xtrain,Ytrain = dftrain.drop(label_col,axis = 1),dftrain[label_col]
Xvalid,Yvalid = dfvalid.drop(label_col,axis = 1),dfvalid[label_col]
cate_cols_indexs = np.where(Xtrain.columns.isin(cate_cols))[0]


# 整理成Pool
pool_train = cb.Pool(data = Xtrain, label = Ytrain, cat_features=cate_cols)
pool_valid = cb.Pool(data = Xvalid, label = Yvalid, cat_features=cate_cols)


#================================================================================
# 二,设置参数
#================================================================================
printlog("step2: setting parameters...")
                               
iterations = 1000
early_stopping_rounds = 200

params = {
    'learning_rate': 0.05,
    'loss_function': "Logloss",
    'eval_metric': "Accuracy",
    'depth': 6,
    'min_data_in_leaf': 20,
    'random_seed': 42,
    'logging_level': 'Silent',
    'use_best_model': True,
    'one_hot_max_size': 5,   #类别数量多于此数将使用ordered target statistics编码方法,默认值为2。
    'boosting_type':"Ordered", #Ordered 或者Plain,数据量较少时建议使用Ordered,训练更慢但能够缓解梯度估计偏差。
    'max_ctr_complexity': 2, #特征组合的最大特征数量,设置为1取消特征组合,设置为2只做两个特征的组合,默认为4。
    'nan_mode': 'Min' 
}


#================================================================================
# 三,训练模型
#================================================================================
printlog("step3: training model...")


model = cb.CatBoostClassifier(
    iterations = iterations,
    early_stopping_rounds = early_stopping_rounds,
    train_dir='catboost_info/',
    **params
)


#直接训练
model.fit(
    pool_train,
    eval_set=pool_valid,
    plot=True
)

print("model.get_all_params():")
print(model.get_all_params() )


#5折交叉验证
cv_data= cb.cv(
    cb.Pool(dfdata.drop(label_col,axis = 1), dfdata[label_col], cat_features=cate_cols_indexs),
    params,
    fold_count = 3,
    plot=True
)

print('Best validation accuracy score: {:.2f}±{:.2f} on step {}'.format(
    np.max(cv_data['test-Accuracy-mean']),
    cv_data['test-Accuracy-std'][np.argmax(cv_data['test-Accuracy-mean'])],
    np.argmax(cv_data['test-Accuracy-mean'])
))


#================================================================================
# 四,评估模型
#================================================================================
printlog("step4: evaluating model ...")


y_pred_train = model.predict(Xtrain)
y_pred_valid = model.predict(Xvalid)

train_score = f1_score(Ytrain,y_pred_train)
valid_score = f1_score(Yvalid,y_pred_valid)


print('train f1_score: {:.5} '.format(train_score))
print('valid f1_score: {:.5} \n'.format(valid_score))   



#feature importance 
dfimportance = model.get_feature_importance(prettified=True) 
dfimportance = dfimportance.sort_values(by = "Importances").iloc[-20:]
fig_importance = px.bar(dfimportance,x="Importances",y="Feature Id",title="Feature Importance")

display(dfimportance)
display(fig_importance)


#score distribution
y_test_prob = model.predict_proba(dftest)[:,-1]
trace1 = go.Histogram(x = y_test_prob,histnorm = 'probability',nbinsx=50)
layout = go.Layout(title = "Score Distribution",xaxis={"title":"score"},yaxis = {"title":"frequecy"})
fig_distribution = go.Figure(data = [trace1])
fig_distribution.update_layout(layout)
display(fig_distribution)


#================================================================================
# 五,使用模型
#================================================================================
printlog("step5: using model ...")

y_pred_test = model.predict(dftest)
y_pred_test_prob = model.predict_proba(dftest)

print("y_pred_test:\n",y_pred_test[:10])
print("y_pred_test_prob:\n",y_pred_test_prob[:10])

#================================================================================
# 六,保存模型
#================================================================================
printlog("step6: saving model ...")

model_dir = 'catboost_model'
model.save_model(model_dir)
model_loaded = cb.CatBoostClassifier()
model.load_model(model_dir)

86416363f40aa8ef243bb731a8ed0525.png

c096a99b0c42389c66ce36b61df38a56.png

f1097910332858192096ac970a1ab631.png

公众号后台回复关键词:CatBoost,获取本文全部代码和插图。

万水千山总是情,点个在看行不行?😋 😋 

CatBoost算法是如何工作的及使用示例 CatBoost是Yandex开发的尖端算法,是无缝,高效和令人兴奋的机器学习,分类和回归任务的首选解决方案。凭借其创新的有序提升算法,CatBoost通过利用决策树的力量将预测提升到新的高度。在本文中,您将探索catboost算法的工作原理。总而言之,CatBoost是一个功能强大且用户友好的梯度增强库,适用于广泛的应用。无论您是寻找简单机器学习方法的新手,还是寻找顶级性能的经验丰富的从业者,CatBoost都是您工具箱中的有用工具。 阅读详情

相关推荐

CatBoost算法的一些说明

本文讲解了CatBoost算法的基本原理,并对相关知识点进行了说明。

blinkyou001的博客 1834

CatBoost 原理及应用

CatBoost(categorical boosting)是一种能够很好地处理类别型特征的梯度提升算法库。本文中,我们对 CatBoost 基本原理及应用实例做个详细介绍。后面小猴子还将针对其中几个重要特性做专门介绍,如 CatBoost 对类别型特征处理、特征选择、文本特征处理、超参数调整以及多标签目标处理,敬请期待,看完记得点个赞支持下!梯度提升概述要理解 boos...

AI蜗牛车 4704

CatBoost全栈学习指南(二):入门实践篇——30分钟上手全流程

在理解了 CatBoost 的理论基础(如 Ordered Boosting 编码、抗过拟合机制)后,本篇将聚焦 “落地实践”—— 从环境搭建到完整分类任务流程,带你用最小成本实现 CatBoost 的首次应用。内容包含 “环境准备→数据池创建→模型训练→评估预测”,所有代码可直接复制运行,新手也能快速上手。

cjd688的博客 877

CatBoost 原理解释及主要算法图分析

CatBoost 与 XGBoost 、LightGBM是主流的三大Boosting框架,都是高效的GBDT算法工程化实现框架。CatBoost 则因长于处理类别特征而取名为CatBoost(Categorical + Boosting)。算法的理论特色,包括用于处理类别变量的目标变量统计和排序提升算法。CatBoost算法论文。原文结构如下:1、Introduction(简介)2、Background(算法提出背景)3、Categary Features(处理类别特征)(修正排版、文字等错误)

reept的博客 9803

TensorFlow、LightGBM与CatBoost处理不平衡数据的实战差异

不平衡数据是机器学习在风控、医疗、工业等场景落地的核心障碍,其本质在于模型优化目标(如准确率)与业务目标(如高召回率)错位。解决该问题需深入理解算法底层机制:深度学习框架依赖损失函数设计(如Focal Loss)和端到端可调性;梯度提升树(如LightGBM)通过分裂增益加权(scale_pos_weight)干预树构建过程;而CatBoost则将类别特征编码与类别权重耦合,实现隐式平衡。技术价值不仅在于提升AUC或PR曲线,更在于支撑可解释决策、时序建模与业务规则融合。本文聚焦金融欺诈检测等真实低频正样本

cuemes08808的博客 411

CatBoost vs XGBoost:哪个更适合你的数据?详细对比与选择指南

本文详细对比了CatBoost和XGBoost两大梯度提升框架的核心差异、性能表现及适用场景,帮助数据科学家根据项目需求做出最优选择。通过基准测试和参数调优指南,揭示CatBoost在类别特征处理和自动化方面的优势,以及XGBoost在高维稀疏数据和时间序列预测中的卓越表现。

weixin_33712987的博客 367

30 分钟看懂 CatBoost(Python代码)

CatBoost和XGBoost、LightGBM并称为GBDT的三大主流神器,都是在GBDT算法框架下的一种改进实现。 正如其名字所说那样,CatBoost主要是在类别特征上的处理上做了很多的改进。 从用户使用角度来看,相比XGBoost和LightGBM,CatBoost具有如下特点。 模型精度: XGBoost和LightGBM相当,CatBoost往往略好一些,无需调参即可获取很好的结果。 训练速度: LightGBM远快于XGBoost,CatBoost快于XGBoost但比LightGB

Python学习与数据挖掘 4459

CatBoost分类变量自动编码原理与实战避坑指南

CatBoost是一种专为结构化数据设计的梯度提升算法,其核心价值在于原生支持分类特征的端到端处理。它通过Ordered Target Encoding机制,在训练过程中动态生成类别编码,天然规避目标泄露;结合Ordered Boosting和Symmetric Trees设计,在保持高预测精度的同时显著降低过拟合风险与调参复杂度。该技术特别适用于电商、金融、风控等场景中大量存在字符串型字段(如城市、设备品牌、会员等级)的真实业务数据。本文深入解析CatBoost对categorical features的

weixin_30835649的博客 391

XGBoost、LightGBM与CatBoost算法对比与调参

机器学习Author:louwillMachine Learning Lab 虽然现在深度学习大行其道,但以XGBoost、LightGBM和CatBoost为代表的Boostin...

weixin_37737254的博客 4898

TensorFlow/LightGBM/CatBoost应对类别不均衡实战指南

类别不均衡(Imbalanced Dataset)是工业AI落地的核心挑战,其本质是数据分布偏斜引发的模型学习偏差、优化失焦与评估失效三重干扰。理解样本权重机制(如class_weight、scale_pos_weight)、有序编码(Ordered Target Encoding)等底层原理,有助于构建对少数类敏感的鲁棒模型。技术价值在于提升召回率(Recall)与精确率(Precision)的平衡能力,支撑金融风控、设备故障诊断、医疗罕见病识别等高价值场景。本文聚焦TensorFlow、LightGBM

diegouyi3472的博客 393

2021工业AI实战五模型:随机森林/XGBoost/LightGBM/CatBoost选型指南

机器学习模型选型本质上是工程约束下的最优解匹配,而非单纯追求指标排名。在真实工业场景中,数据噪声大、样本稀疏、算力受限、可解释性要求高,使得传统教科书模型常面临部署失效、推理延迟、维护困难等挑战。本文聚焦2021年企业级AI落地关键阶段,围绕随机森林的决策冗余机制、XGBoost的正则化工程意义、LightGBM的直方图内存权衡、CatBoost的有序编码物理适配等核心能力展开技术解析,强调模型与数据质量、硬件资源、运维能力的深度耦合。适用于设备故障预测、传感器时序分析、边缘智能部署等典型工业AI任务,为算

culuo8053的博客 1256

CatBoost处理教育数据的实战边界与交叉验证必要性

CatBoost是一种专为高基数类别特征设计的梯度提升算法,其核心优势在于内置有序目标编码(Ordered Target Encoding)和对半结构化文本的原生支持,避免了传统One-Hot导致的维度爆炸与LabelEncoder引发的语义失真。在教育AI场景中,学生行为数据普遍具有时间混乱、标签两极分化、缺失值富含业务语义等特点,CatBoost凭借对类别变量的鲁棒建模能力与低预处理依赖,显著缩短特征工程周期并提升模型稳定性。交叉验证在此类分布易漂移的数据中并非可选优化项,而是识别训练集偏差、暴露样本代

abo1977的博客 445

CatBoost交叉验证实战:教育数据建模的特征处理与调优

梯度提升树(GBDT)是处理结构化业务数据的核心算法,其原理在于通过多轮残差拟合构建强集成模型,技术价值体现在对高维稀疏特征、类别变量及缺失值的天然鲁棒性。在教育数据分析场景中,学生行为日志普遍具备离散特征多、样本不均衡、时间依赖性强等特点,亟需适配目标编码、分层时序分割与F2-score加权评估等定制化策略。CatBoost凭借有序目标编码、缺失值语义化处理和GPU加速下的稳定特征重要性,成为该领域优于XGBoost与LightGBM的实践优选。本文聚焦教育数据建模全流程,涵盖CatBoost交叉验证、特

weixin_33816821的博客 631

基于CatBoost与自学习机制的API资产智能分类实践

在微服务与云原生架构中,API作为核心数字资产,其高效治理依赖于准确的分类。传统基于规则或静态模型的方法面临维护成本高、难以适应业务变化的挑战。机器学习技术,特别是梯度提升算法,通过从API的路径、参数、流量日志等特征中自动学习模式,为智能分类提供了解决方案。其技术价值在于实现分类的自动化与持续优化,从而支撑API治理、安全审计与监控告警等应用场景。本文聚焦的**自学习机制**与**特征工程**,正是实现这一目标的关键:系统通过构建包含静态定义与动态行为的特征画像,并利用如CatBoost等算法进行建模,形

weixin_34393428的博客 440

CatBoost在电力短期负荷预测中的应用与特征工程实践

从梯度提升树的基本思想出发,介绍CatBoost通过Ordered Boosting与对称树结构缓解预测偏移和过拟合的原理。结合实际电力负荷数据,说明滞后特征、滚动窗口、时间标识与天气耦合等特征工程方法,并强调时序切分与防泄漏的重要性。CatBoost原生支持类别特征,适合处理星期、节假日等强周期变量,在短期负荷预测场景中具备精度和稳定性的双重价值,可作为售电侧、调度侧及预测建模任务的高效工具。通过SHAP归因可进一步解释模型决策,提升工程落地的可信度。

weixin_34008933的博客 368

OpenTCS打造移动机器人交通管制系统(四)

先分析下OpenTCS的一些策略方面的东西,这是OpenTCS的基础。 首先需要先明确下OpenTCS内核中的三个概念: 路由(Route) : 决定了车辆通过什么样的方式和算法来获得一段路径,未来车辆将沿着此路径运行。 派遣(Dispacher): 决定了一个订单应该关联哪一辆小车,即为订单分配车辆和为车辆分配订单。 调度(schedule):狭义上的调度,交通管制的核心,决定了何时分配...

白色冰激凌的技术专栏 5269

【机器学习基础】XGBoost、LightGBM与CatBoost算法对比与调参

机器学习Author:louwillMachine Learning Lab 虽然现在深度学习大行其道,但以XGBoost、LightGBM和CatBoost为代表的Boostin...

fengdu78的博客 3732

从零开始的机械臂yolov5抓取gazebo仿真(一)

本文介绍了如何将机械臂模型导出为URDF

qq_48427527的博客 1万+
上一篇: bugrobot用6行代码调用微信报警机器人
下一篇: Plotly深入浅出
算法美食屋
博客等级 码龄9年 2万+粉丝 154原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值