向分类器添加“无”类的首选方法是什么?

时间:2017-03-02 18:48:02

标签: machine-learning tensorflow classification

假设我有一些分类器,模型只是y = tf.matmul(x, W) + b,然后我用softmax来获取概率,如下所示:

{
 "dog_bark": "53.2912",
 "siren": "46.7088"
}

但我希望它看起来更像这样:

{
   "dog_bark": "0.25",
   "siren": "0.25",
   "none": "99.5"
}

我知道我可以添加一个带有随机功能集的非类,但这看起来很麻烦且耗时。我甚至不确定这是否准确 - 因为现实世界说,熊可能比随机数据更接近狗吠。是否有一些首选方法可以实现无类或类似的影响?

(理想情况下,没有捏造它没有的可能性)

1 个答案:

答案 0 :(得分:1)

如果您无法访问“无”类的真实示例,并且您不想要hacky解决方案(如生成它们,在问题中提出),那么剩下的唯一方法是学习生成模型而不是判别模型。换句话说,如果你学习每个(观察的)y的P(x | y)和P(y),那么你也有P(x)= SUM_i P(x | y = i)P(y = i),这是您所见过的任何类的概率。唯一缺少的是设置一个阈值T(或更复杂的决定方法),在该阈值下,您将样本放入“无”类。不幸的是,学习生成模型通常比典型的判别模型困难得多,但你的问题也更难(因为你希望你的模型“意识到非观察样本”)。或者,您可以独立于分类器学习P(x),并将其用作数据的“预过滤”,因此假设您使用某种密度估算技术(GMM,KDE等)学习P(x),以及然后根据以下内容进行分类:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/greet"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/greet"
        android:textSize="25sp" android:gravity="center" android:paddingTop="25sp" />

    <ImageView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/sachin" android:paddingTop="25sp" />

    <TextView
        android:textColor="#ffffff"
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/langselection"
        android:textAppearance="?android:attr/textAppearanceMedium" android:gravity="center" android:paddingTop="25sp"/>
    
    
 <Spinner
     android:popupBackground="#ff004372"
     android:id="@+id/spinner1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/languages"
       android:gravity="center" android:paddingTop="25sp" />

</LinearLayout>a

很容易证明以上是有效概率,因为NEW_P(y=i|x) = P(x)*P(y=i|x) NEW_P(y=none|x) = 1-P(x)

简而言之,你现在正在做的只给你P(y = i | x),并且有辨别力学习的整个技巧是你可以省略P(x)。对于你正在考虑的问题,你实际上需要它(除非你想要hacky事情/收集数据)。并且至少有几种方法可以学习(和使用)它。