【问题标题】:Training sklearn's SVC only yields 'positive'训练 sklearn 的 SVC 只产生“正面”
【发布时间】:2015-05-16 14:12:03
【问题描述】:

我正在使用 TfidfVectorizer 获得的特征训练 SVM。当通过请求预测来测试 SVM 时,即使是来自用于训练并被标记为“负面”的条目的特征向量也会导致“正面”预测。我感觉自己在做一些基本的错误——但我无法从文档中找出它是什么。

代码或多或少是这样的:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import SVC

data = load_data()                                  # a list of tuples, at position 0 is some text, at position 1 a label -- either 'positive' or 'negative'. Order is randomized.
vocab = {ch for entry in data for ch in entry[0]}   # the vocabulary


extractor = TfidfVectorizer(strip_accents='ascii', analyzer='char',
                            vocabulary=vocab, ngram_range=(1, 5), 
                            min_df=2, lowercase=False)
features, labels = extractor.fit_transform([entry[0] for entry in entries]), \
        [entry[1] for entry in entries]

clf = SVC()
clf.fit(features, labels)

for feature in features:
    print(clf.predict(feature))                      # testing on training data, half of the entries should be 'negative', but it always prints 'positive'

为了给数据一个印象,每个标签两个条目:


(0, 1) 0.15046358725
(0, 3) 0.431231348393
(0, 6) 0.126073691443
(0, 7) 0.053403320129
(0, 8) 0.172907188257
br> (0, 9) 0.176318488739
(0, 10) 0.0822510699681
(0, 11) 0.0750035434541
(0, 12) 0.245746908087
(0, 13) 0.07039326104, 14) 0.217021712559
(0, 15) 0.0348732598324
(0, 17) 0.330453439288
(0, 18) 0.0801049801935
(0, 19) 0.121622267101
0,4 (0, 19) > (0, 21) 0.105138945977
(0, 22) 0.104318311782
(0, 23) 0.142275533299
(0, 25) 0.114477206411
(0, 27) 0.160209505382
(0, 25) 0.114477206411
) 0.129046778512
(0, 29) 0.0618410863719
(0, 30) 0.322325274638
(0, 31) 0.0341389957579
(0, 32) 0.310109380247
(0, 32) 0.310109380251
2356380251
(0, 32) 366380251
(0, 34) 0.0662718061209
(0, 35) 0.301680645638
(0, 36) 0.070241173501
(0, 37) 0.0490111226972
(0, 38) 0.0979593205615
(0, 38) 0.0979593205615
0.0596363664168


(0, 1) 0.117625753539
(0, 3) 0.393303780468
(0, 6) 0.0919882279376
(0, 7) 0.146119207993
(0, 8) 0.13517116455
br> (0, 9) 0.402027406205
(0, 10) 0.150033882678
(0, 12) 0.0896532112974
(0, 13) 0.0642020479106
(0, 17) 0.26371578503, 18)0.0487064026643(0,19)0.0443701485229(0,21)0.0479458938703
(0,22)0.090286659581
(0,23)0.0865080972171
(0,24)0.059388745322
(0, 25) 0.156613097216
(0, 27) 0.37573403916
(0, 28) 0.0941575069348
(0, 29) 0.112804104567
(0, 30) 0.0734940476429
) 0.0404049579898
(0, 33) 0.0512281809479
(0, 34) 0.0604430823106
(0, 35) 0.432374318506
(0, 36) 0.1281266673468
29673468
(0, 36) 0.128126673468
29. (0, 39) 0.0543912413894

阴性
(0, 1) 0.0577944775799
(0, 3) 0.421629123125
(0, 6) 0.101694787822
(0, 7) 0.143589019178
(0, 8) 0.23245346460 br> (0, 9) 0.26666950341
(0, 10) 0.0368589769154
(0, 12) 0.165188968649
(0, 13) 0.0946354953804
(0, 14) 0.0364700345073, 15)0.0468830136663
(0,119)0.0717945095888(0,19)0.098104136602
(0,20)0.089336949956
(0,21)0.098104136602
(0,21)0.06010249646
(0, 22) 0.105182814722
(0, 23) 0.127515194624
(0, 24) 0.175081504231
(0, 25) 0.0384752992583
(0, 27) 0.123075952609
) 0.20818593649
(0, 29) 0.0831380981142
(0, 30) 0.162498218497
(0, 32) 0.416905743313
(0, 33) 0.0755116766399

(0, 32) 0.0755116766399
(09683) (0, 35) 0.260726333632
(0, 36) 0.0629540209892
(0, 38) 0.0438982779995
(0, 39) 0.04008705517


(0, 0) 0.140625053372
(0, 1) 0.185208158007
(0, 3) 0.434299020013
(0, 6) 0.124148980319
(0, 7) 0.065735044161 br> (0, 8) 0.121619636365
(0, 9) 0.217033390727
(0, 10) 0.0337480747364
(0, 14) 0.100175877346
(0, 17) 0.406760691514
18) 0.131470088322
(0, 19) 0.179648270846
(0, 20) 0.136328159775
(0, 21) 0.0323543238518
(0, 22) 0.16050893653501
(0, 21) 0.1605089363730
(0, 22) 0.1605089537301
(0, 21) > (0, 24) 0.0400761509423
(0, 25) 0.105683937825
(0, 27) 0.140860408865
(0, 28) 0.0635383392931
(0, 29) 0.07612123204217,
) 0.297566697793
(0, 31) 0.0840445271321
(0, 32) 0.38171884737
(0, 33) 0.172846204642
(0, 34) 0.08157507981967
(0, 34) 0.08157507981967
19643521 (0, 36) 0.11528138777
(0, 38) 0.0803865158889
(0, 39) 0.0734074055798

【问题讨论】:

  • 您正在使用带有 rbf 内核的 kernel-svm,而无需调整 gamma 或 C。这很少奏效。此外,rbf 内核 SVM 并不是真正适合文本数据。试试 LinearSVC。
  • 就是这样。我只是将 SVC 更改为 LinearSVC,而解决方案正是人们现在所期望的。最好将您的评论更改为帖子以便我接受。

标签: python scikit-learn svm


【解决方案1】:

您正在使用带有 rbf 内核的 kernel-svm,而无需调整 gamma 或 C。这很少奏效。此外,rbf 内核 SVM 并不是真正适合文本数据。试试 LinearSVC。

【讨论】:

    猜你喜欢
    • 2020-05-22
    • 2020-09-10
    • 2020-03-27
    • 2020-10-17
    • 2019-06-02
    • 2018-08-14
    • 2021-06-28
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多