当前位置: 首页 > 知识库问答 >
问题:

具有实值特征的Stanford分类器

温星华
2023-03-14

我想使用斯坦福分类器进行文本分类。我的特征主要是文本特征,但也有一些数字特征(例如句子的长度)。

我从ClassifierExample开始,并用一个简单的实值特性F替换当前特性,如果停止灯Breaked,则值100,否则0.1,这将导致以下代码(除了第10-16行的MakeStopLights()函数之外,这只是原始ClassifierExample类的代码):

public class ClassifierExample {

    protected static final String GREEN = "green";
    protected static final String RED = "red";
    protected static final String WORKING = "working";
    protected static final String BROKEN = "broken";

    private ClassifierExample() {} // not instantiable

    // the definition of this function was changed!!
    protected static Datum<String,String> makeStopLights(String ns, String ew) {
        String label = (ns.equals(ew) ? BROKEN : WORKING);
        Counter<String> counter = new ClassicCounter<>();
        counter.setCount("F", (label.equals(BROKEN)) ? 100 : 0.1);
        return new RVFDatum<>(counter, label);
    }


    public static void main(String[] args) {
        // Create a training set
        List<Datum<String,String>> trainingData = new ArrayList<>();
        trainingData.add(makeStopLights(GREEN, RED));
        trainingData.add(makeStopLights(GREEN, RED));
        trainingData.add(makeStopLights(GREEN, RED));
        trainingData.add(makeStopLights(RED, GREEN));
        trainingData.add(makeStopLights(RED, GREEN));
        trainingData.add(makeStopLights(RED, GREEN));
        trainingData.add(makeStopLights(RED, RED));
        // Create a test set
        Datum<String,String> workingLights = makeStopLights(GREEN, RED);
        Datum<String,String> brokenLights = makeStopLights(RED, RED);
        // Build a classifier factory
        LinearClassifierFactory<String,String> factory = new LinearClassifierFactory<>();
        factory.useConjugateGradientAscent();
        // Turn on per-iteration convergence updates
        factory.setVerbose(true);
        //Small amount of smoothing
        factory.setSigma(10.0);
        // Build a classifier
        LinearClassifier<String,String> classifier = factory.trainClassifier(trainingData);
        // Check out the learned weights
        classifier.dump();
        // Test the classifier
        System.out.println("Working instance got: " + classifier.classOf(workingLights));
        classifier.justificationOf(workingLights);
        System.out.println("Broken instance got: " + classifier.classOf(brokenLights));
        classifier.justificationOf(brokenLights);
    }

}

根据我对线性分类器的理解,特性f应该使分类任务变得非常容易--毕竟,我们只需要检查f的值是否大于某个阈值。但是,分类器对测试集中的每个实例返回working

现在我的问题是:我犯了什么错误吗?我是否需要修改代码的其他部分来使实值特征工作?还是我对线性分类器的理解有问题?

共有1个答案

李奕
2023-03-14

你的代码看起来很好。注意,通常使用最大熵分类器提供二进制值特征(1或0)。

以下是更多关于最大熵分类器的阅读:http://web.stanford.edu/class/cs124/lec/maximal_entropy_classifiers

请看题为“基于特征的线性分类器”的幻灯片,了解最大熵分类器的具体概率计算。

w1是“工作”的学习权重,w2是“破碎”的学习权重

分类器选择较高的概率。请注意,f1=(100或0.1)您的特征值。

如果您考虑您的具体示例数据,因为您有(2个类,1个特征,特征总是正的),所以不可能构建一个最大熵分类器来分离这些数据,它总是以这样或那样的方式猜测。

为了参数起见,请说w1>w2

假设v>0是特征值(100或0.1)。

然后w1*v>w2*v,因此exp(w1*v)>exp(w2*v),因此无论v是什么值,您都将为class1分配更多的概率。

 类似资料:
  • 我使用Stanford NLP文本分类器(ColumnDataClassifier)从我的Java代码。我有两个主要问题。

  •   假设向量v是方阵A的特征向量,可以表示成下面的形式:   这里lambda表示特征向量v所对应的特征值。并且一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解为下面的形式:   其中Q是这个矩阵A的特征向量组成的矩阵。sigma是一个对角矩阵,每个对角线上的元素就是一个特征值。   特征值分解是一个提取矩阵特征很不错的方法,但是它只适合于方阵,对于非方阵,它不适合。这就需要用到奇

  • 这个例子展示了如何使用 scikit-learn 中的单词包方法,根据主题对文档进行分类。本例使用scipy.sparse中的矩阵来存储特征,并演示各种能够有效处理稀疏矩阵的分类器。 本例中使用的数据集是20条新闻组数据集。通过scikit-learn可以自动下载该数据集,并进行缓存。 下述条形图展示了各个不同分类器,其信息包括精度、训练时间(已归一化)和测试时间(已归一化)。 import lo

  • 在Java中,所有对象都继承自。在Go中,所有类型/结构都实现空接口。Rust语言中是否有类似的构造? 如果答案是否定的,是什么让它变得不必要?这是因为Rust中的所有实体(模块除外)都可以按类型参数化吗?这是否消除了所有Rust实体/结构/枚举共享的公共“超类型”或公共特性的需要?

  • 看看这个代码。 愚蠢的Scala编译器在这里显示错误: 错误:(22, 39) 类型不匹配;找到: mix.type (底层类型 SomeMix) 必需: T with SomeMix 大小写混合: SomeMix = 它不理解表达式I匹配到在某种混合已经是类型T。好吧,让我们帮助他。更改代码: 现在,它同意一切都是正确的,但显示警告: 警告:(22,17)抽象类型模式T未选中,因为它已通过擦除大