首页 > 解决方案 > Tensorflow 决策森林自定义指标与树的数量

问题描述

我已经使用 tensorflow 决策森林创建了一个分类模型。我正在努力评估非默认指标的性能变化与树的数量(在本例中为 PR-AUC)。

下面是我尝试的一些代码。

from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
import pandas as pd
import tensorflow as tf
import tensorflow_decision_forests as tfdf

train = load_diabetes()
X = pd.DataFrame(train['data'])
X['target'] = (pd.Series(train['target']) > 100).astype(int)
X_train, X_test = train_test_split(X)
train_ds = tfdf.keras.pd_dataframe_to_tf_dataset(X_train, label="target")   
test_ds = tfdf.keras.pd_dataframe_to_tf_dataset(X_test, label="target")   
pr_auc = tf.keras.metrics.AUC( curve='PR',)
tfdf_clf = tfdf.keras.GradientBoostedTreesModel()
tfdf_clf.compile(metrics=[pr_auc])
tfdf_clf.fit(train_ds, validation_data=test_ds,)

现在我得到了非常有用的训练日志

tfdf_clf.make_inspector().training_logs()
#[TrainLog(num_trees=1, evaluation=Evaluation(num_examples=None, accuracy=0.9005518555641174, loss=0.6005926132202148, rmse=None, ndcg=None, aucs=None)),
#TrainLog(num_trees=2, evaluation=Evaluation(num_examples=None, accuracy=0.9005518555641174, loss=0.5672071576118469, rmse=None, ndcg=None, aucs=None)),

但它不包含任何关于 PR-AUC 与迭代的信息

如果我评估模型,它只会在训练结束时保留 PR-AUC,尽管它会记录一些中间信息。

tfdf_clf.evaluate(test_ds)

1180/1180 [===============================] - 10s 8ms/step - 损耗:0.0000e+00 - auc: 0.6832

如何找到测试数据 PR-AUC 与树数的变化?我需要专门使用 tensforflow 决策森林库。

标签: pythontensorflowkerasdecision-treeevaluation

解决方案


绘制 AUPRC。插值精度-召回曲线下的面积,通过针对不同的分类阈值绘制(召回,精度)点而获得。根据计算方式,PR AUC 可能相当于模型的平均精度。看起来精度比较高,但是召回率和 ROC 曲线下面积(AUC)并没有你想象的那么高. 分类器在尝试最大化精度和召回率时经常面临挑战,在处理不平衡数据集时尤其如此。在您关心的问题的背景下考虑不同类型错误的成本是很重要的。在这个例子中,假阴性(欺诈性交易被遗漏)可能会产生财务成本,

一般来说,你使用的树越多,得到的结果就越好。然而,随着树数量的增加,改进会降低,即在某个点上,学习更多树的预测性能收益将低于学习这些额外树的计算时间成本。随机森林是集成方法,您可以对许多树进行平均。同样,如果您想估计实值随机变量的平均值(例如,您所在国家/地区公民的平均身高),您可以取样。预期方差将随着样本量的平方根而减小,并且在某一点上,收集更大样本的成本将高于从如此大样本中获得的准确性收益。在您的情况下,您观察到在单个测试集的单个实验中,10 棵树的森林比 500 棵树的森林表现更好。这可能是由于统计方差。如果这会系统地发生,我会假设实施有问题。树的数量的典型值是 10、30 或 100。我认为只有极少数实际案例中超过 300 棵树的成本超过了学习它们的成本(好吧,除非你有一个非常大的数据集)。


推荐阅读