我想在TensorFlow / Keras中使用随机森林对一些分类变量进行预测。我期望输出应该是概率的向量,并且如果至少有三个可能的输出值,则是这种情况。令人惊讶的是,如果可能值的集合仅由两个元素组成,则答案似乎是 * 单个数字 *。
如果我不需要单独处理这些特殊情况,我的代码会更容易,所以我的问题是:为什么TensorFlow以一种特殊的方式处理这一点,是否有某种方法可以以统一的方式处理这两种情况?
下面你可以找到最小的例子。
import tensorflow as tf
import keras
import tensorflow_decision_forests as tfdf
import pandas as pd
def train_and_predict(multi, values):
train_pd=pd.DataFrame( [ {"key":v, "value":v} for _ in range(multi) for v in values ] )
train_tf = tfdf.keras.pd_dataframe_to_tf_dataset(train_pd, label= "value")
rf = tfdf.keras.RandomForestModel()
rf.fit(x=train_tf)
to_guess =pd.DataFrame( [ {"key":v} for v in values] )
guess_tf = tfdf.keras.pd_dataframe_to_tf_dataset(to_guess)
return rf.predict(guess_tf )
print(train_and_predict(500, ["a", "b"] ) )
print(train_and_predict(500, ["a", "b", "c"] ) )
对于输入
print(train_and_predict(500, [3, 5] )
我们得到了一个概率向量
[[0. 0. 0. 0.99999917 0. 0. ]
[0. 0. 0. 0. 0. 0.99999917]]
不幸的是,对于分类变量
print(train_and_predict(500, ["a", "b"] )
我们得到一个数字作为答案
[[0. ]
[0.99999917]]
而如果存在至少三个可能值:
print(train_and_predict(500, ["a", "b", "c"] )
我们得到一个很好的概率列表:
[[0.99999917 0. 0. ]
[0. 0.99999917 0. ]
[0. 0. 0.99999917]]
我在Kaggle上使用TensorFlow和Keras版本“2.11.0”。
1条答案
按热度按时间bsxbgnwa1#
**简短回答:**如果您的分类问题(带有字符串标签)在标签中只有两个值(即二进制分类),TF-DF仅输出正标签的概率P,即具有较大的字典序的一个。另一个标签的概率可以用1-p计算。
详情:
字符串标签:Keras本身不支持字符串标签-对于Keras,标签必须是(正)整数。由于TF-DF是通过Keras API使用的,因此函数
tfdf.keras.pd_dataframe_to_tf_dataset()
通过对标签列中的字符串进行排序并分配标签0,1,...,n-1将它们转换为整数,其中n是标签列中唯一值的数量。对于n=2,该问题被识别为二进制分类问题,TF-DF仅输出正类(Map到1的类)的概率,即根据Python对字符串值的排序的第二个字符串。
整型标签:如果标签已经是整数,
tfdf.keras.pd_dataframe_to_tf_dataset()
不会修改它们。TF-DF还将整数标签识别为“已经整数化”,并且不应用任何Map以保存空间/复杂性。相反,它假设可能的标签是0,1,...,max_label,其中max_label是标签列中最大标签的值。因此,输出向量具有max_label+1维度。如果你的标签是[0,1],你也会看到只有标签1的概率被返回。完整披露:Tensorflow Decision Forests的作者之一。