1

让我先解释一下我正在使用的数据集。

我有三套。

  1. 形状为 (1277, 927) 的火车,目标出现的时间约为 12%
  2. 形状为 (174, 927) 的评估集,目标出现的时间约为 11.5%
  3. 支持形状为 (414, 927) 的集合,目标出现的时间约为 10%

这组也是使用时间片构建的。训练集是最旧的数据。支持集合是最新数据。并且 Eval 集在中间集。

现在我正在构建两个模型。

型号1:

# Initialize CatBoostClassifier
model = CatBoostClassifier(
    # custom_loss=['Accuracy'],
    depth=9,
    random_seed=42,
    l2_leaf_reg=1,
    # has_time= True,
    iterations=300,
    learning_rate=0.05,
    loss_function='Logloss',
    logging_level='Verbose',
)

## Fitting catboost model
model.fit(
    train_set.values, Y_train.values,
    cat_features=categorical_features_indices,
    eval_set=(test_set.values, Y_test)
    # logging_level='Verbose'  # you can uncomment this for text output
)

预测保持集。

型号2:

model = CatBoostClassifier(
    # custom_loss=['Accuracy'],
    depth=9,
    random_seed=42,
    l2_leaf_reg=1,
    # has_time= True,
    iterations= 'bestIteration from model1',
    learning_rate=0.05,
    loss_function='Logloss',
    logging_level='Verbose',

)

## Fitting catboost model
model.fit(
    train.values, Y.values,
    cat_features=categorical_features_indices,
    # logging_level='Verbose'  # you can uncomment this for text output
)

除了迭代之外,两个模型都是相同的。第一个模型修复了 300 轮,但它会将模型收缩到最佳迭代。第二个模型使用模型1中的最佳迭代。

但是,当我比较特征重要性时。看起来差别很大。

  Feature  Score_m1  Score_m2     delta
0      x0  3.612309  2.013193 -1.399116
1      x1  3.390630  3.121273 -0.269357
2      x2  2.762750  1.822564 -0.940186
3      x3  2.553052       NaN       NaN
4      x4  2.400786  0.329625 -2.071161

如您所见,在第一个模型中位于 top3 的特性 x3 在第二个模型中下降。不仅如此,给定特征的模型之间的权重也有很大的变化。模型 1 中存在的大约 60 个特征在模型 2 中不存在。模型 2 中存在的大约 60 个特征在模型 1 中不存在。delta 是 Score_m1 和 Score_m2 之间的差异。我已经看到模型变化在哪里得分不是那么剧烈。当我使用模型 1 或模型 2 时,AUC 和 LogLoss 并没有太大变化。

现在我有以下关于这种情况的问题。

  1. 由于样本数量少,特征数量多,这个模型是否不稳定。如果是这种情况,如何检查?

  2. 此模型中是否有功能只是没有提供有关模型结果的太多信息,并且它正在创建分裂的随机变化。如果这种情况如何检查这种情况?

  3. 这种 catboost 是适合这种情况的模型吗?

任何有关此问题的帮助将不胜感激

4

1 回答 1

1

是的。一般来说,树木有些不稳定。如果您删除最不重要的功能,您可以获得一个非常不同的模型。

拥有更多数据可以减少这种趋势。

拥有更多特征会增加这种趋势。

树算法本质上是随机的,因此结果会有所不同。

要尝试的事情:

  1. 多次运行模型,但使用不同的随机种子。使用结果来确定哪个特征似乎最不重要。(你有多少功能?)

  2. 尝试平衡你的训练集。这可能需要您对罕见的情况进行上采样。

  3. 获取更多数据。也许你必须将你的训练集和测试集结合起来,并使用holdout作为测试。

于 2020-08-29T21:43:11.123 回答