【问题标题】:Stanford Classifier with Real Valued Features具有实值特征的斯坦福分类器
【发布时间】:2017-06-27 17:30:45
【问题描述】:

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

我从ClassifierExample 开始,如果停车灯是BROKEN0.1,则用一个简单的实值特征F 替换当前特征值100,否则会产生以下代码(除了第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

现在我的问题是:我是否做错了什么,我是否还需要更改代码的其他部分才能使实值功能正常工作,还是我对线性分类器的理解有问题?

【问题讨论】:

    标签: java machine-learning classification stanford-nlp text-classification


    【解决方案1】:

    您的代码看起来不错。请注意,通常使用最大熵分类器可以提供二进制值特征(1 或 0)。

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

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

    这是您的示例案例的公式,其中包含 1 个功能和 2 个类(“works”、“broken”):

    probability(c1) = exp(w1 * f1) / total probability(c2) = exp(w2 * f1) / total total = exp(w1 * f1) + exp(w2 * f1)

    w1 是“works”的学习权重,w2 是“broken”的学习权重

    分类器选择更高的概率。注意 f1 = (100 or 0.1) 你的特征值。

    如果您考虑您的特定示例数据,因为您有(2 个类,1 个特征,特征始终为正),所以不可能构建一个最大熵分类器来分离该数据,它总是会以一种方式猜测或其他。

    为了争论,说w1 &gt; w2

    假设v &gt; 0 是您的特征值(100 或 0.1)。

    然后是w1 * v &gt; w2 * v,因此是exp(w1 * v) &gt; exp(w2 * v),因此无论 v 具有什么值,您总是会为 class1 分配更多概率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 2017-03-16
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多