使用实值特征的斯坦福分类器

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

我从ClassifierExample开始,并用一个简单的实值特征F替换了当前的特征,当红绿灯状态为BROKEN时,特征值为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或0)。

关于最大熵分类器,这里有一些进一步的阅读材料:http://web.stanford.edu/class/cs124/lec/Maximum_Entropy_Classifiers

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

以下是你的示例情况的公式,具有1个特征和2个类别(“works”, “broken”):

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

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

分类器选择概率较高的类别。请注意,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分配更高的概率。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注