使用与多项式核支持向量分类scikit学习(Using a support vector class

2019-09-21 19:30发布

我与在scikit学习包中实现不同的分类试验,做一些NLP任务。 我用它来进行分类的代码如下

def train_classifier(self, argcands):
        # Extract the necessary features from the argument candidates
        train_argcands_feats = []
        train_argcands_target = []

        for argcand in argcands:
            train_argcands_feats.append(self.extract_features(argcand))
            train_argcands_target.append(argcand["info"]["label"]) 

        # Transform the features to the format required by the classifier
        self.feat_vectorizer = DictVectorizer()
        train_argcands_feats = self.feat_vectorizer.fit_transform(train_argcands_feats)

        # Transform the target labels to the format required by the classifier
        self.target_names = list(set(train_argcands_target))
        train_argcands_target = [self.target_names.index(target) for target in train_argcands_target]

        # Train the appropriate supervised model
        self.classifier = LinearSVC()
        #self.classifier = SVC(kernel="poly", degree=2)

        self.classifier.fit(train_argcands_feats,train_argcands_target)

        return

def execute(self, argcands_test):
        # Extract features
        test_argcands_feats = [self.extract_features(argcand) for argcand in argcands_test]

        # Transform the features to the format required by the classifier
        test_argcands_feats = self.feat_vectorizer.transform(test_argcands_feats)

        # Classify the candidate arguments 
        test_argcands_targets = self.classifier.predict(test_argcands_feats)

        # Get the correct label names
        test_argcands_labels = [self.target_names[int(label_index)] for label_index in test_argcands_targets]

        return zip(argcands_test, test_argcands_labels)

如通过代码可以看出,我在测试支持向量机分类的两种实现方式:在LinearSVC和SVC与多项式核。 现在,我的“问题”。 当使用LinearSVC,我得到的,没有任何问题分类:测试实例标记有一些标签。 但是,如果我用多项式SVC,所有的测试实例加上相同的标签。 我知道,一个可能的解释是,简单地说,多项式SVC是不是合适的分类来使用我的任务,这很好。 我只是想确保我使用适当的多项式SVC。

感谢所有帮助/建议你可以给我。

更新后的答案中给出的建议,我已经改变了训练的分类做了以下代码:

# Train the appropriate supervised model
parameters = [{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['poly'], 'degree': [2]}]
self.classifier = GridSearchCV(SVC(C=1), parameters, score_func = f1_score)

现在,我得到了以下信息:

ValueError: The least populated class in y has only 1 members, which is too few. The minimum number of labels for any class cannot be less than k=3.

这有是与类的实例在我的训练数据的分布不均,对不对? 还是我打电话的程序是否有误?

Answer 1:

在这两种情况下,你应该调整使用正则化参数C的值网格搜索 。 你不能结果,否则作为比较,对C一个很好的价值的一个可能会产生糟糕的结果对其他模型。

对于多项式核还可以网格搜索程度(例如2个或3个或更多)的最佳值:在同一时间的话,你应该网格搜索C和程度。

编辑

这有是与类的实例在我的训练数据的分布不均,对不对? 还是我打电话的程序是否有误?

请检查您是否每班至少3个样品,以能够做到StratifiedKFold交叉验证与k == 3 (我认为这是由默认CV GridSearchCV分类)。 如果你有少,不要指望模型能够预测什么有用的东西。 我建议至少100个样品每类(如绑定的拇指分钟有点武断规则,除非你在玩具问题工作少于10层的功能,并在决策边界类之间有很多规律性的)。

顺便说一句,请务必粘贴问题/错误报告的完整回溯。 否则,一个人可能没有必要的信息来诊断正义事业。



文章来源: Using a support vector classifier with polynomial kernel in scikit-learn