You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确定CatBoost分类器class_weights参数对应的类别顺序?

CatBoost 分类器类别权重设置解决方案

1. 权重列表顺序对应规则

CatBoost的class_weights参数仅支持传入列表/数组,不支持字典格式,列表的权重顺序与模型内部的类别排序严格对应,默认排序为训练集标签列去重后的字典升序排列结果,你可以通过以下方式确认准确顺序:

# 方法1:先训练一个极简临时模型获取类别顺序
temp_clf = CatBoostClassifier(verbose=0, iterations=10)
temp_clf.fit(X_train, y_train)
print(temp_clf.classes_)
# 输出结果的顺序就是你需要传入class_weights的权重对应顺序
# 方法2:直接手动计算默认排序
import numpy as np
cat_order = sorted(np.unique(y_train))
print(cat_order)

比如你拿到的顺序是['confused', 'happy', 'mad', 'neutral', 'sad'],那你的权重列表就按这个顺序依次填入对应类别的权重即可。

2. 更简便的自动权重设置方案

你不需要手动计算权重和对应顺序,直接使用CatBoost内置的自动类别平衡参数即可:

from sklearn.feature_selection import chi2

pipe = Pipeline([
    ("tokenizer",CountVectorizer(analyzer= 'word',
                                ngram_range=(1, 2),
                                token_pattern=r"\w+",
                                stop_words="english"
                            )),
    # 注意:你原来的SelectKBest写法有误,第一个参数需要传入评分函数,比如卡方检验chi2
    ("feature_selection", SelectKBest(chi2, k=90)),
    ("clf",  CatBoostClassifier(auto_class_weights='Balanced'))
])
pipe.fit(X_train, y_train)

设置auto_class_weights='Balanced'后,CatBoost会自动根据训练集的类别分布计算平衡权重,完全避免顺序对应错误的问题。

3. 手动权重的最优计算方式

如果你确实需要手动设置权重,建议使用标准的类别平衡权重计算逻辑,而非你看到的1-占比方式,计算规则为:
单类别权重 = 总样本数 / (类别总数 * 该类别样本数)
该逻辑和scikit-learn的class_weight='balanced'规则一致,对不平衡样本的适配效果更好。

内容的提问来源于stack exchange,提问作者Yuxxxxxx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:54:07