【问题标题】:libsvm prediction problem using a generated model使用生成模型的 libsvm 预测问题
【发布时间】:2011-08-11 00:23:06
【问题描述】:

我有一个关于 libsvm 预测准确性的问题。我使用easy.py生成了svm模型文件。现在,当我尝试在 python 中以编程方式预测测试向量时,它显示错误预测的标签(全为 1),而使用 easy.py 我得到 91% 的准确度。

我的测试和训练数据的每一行都采用以下格式:

1 1:255 2:246 3:218 4:198 5:186 6:168 7:177 8:218 9:255 10:255 11:255 12:255 13:255 14:255 15:255 16:255 17:255 18:255 19:255 20:255 21:255 22:255 23:255 24:255 25:255 26:219 27:185 28:162 29:145 30:144 31:255 32:253 33:228 34:197

代码如下,我这里是不是做错了什么?

wimn_model = svm.svm_model("newtraindata.txt.model")
#load model
wimn_f_test=open('newtestdata.txt','r');
#load test data and train data
wimn_f_train=open('newtraindata.txt','r');

ii=0
for eachline in wimn_f_test:
        vec=eachline
        v=vec.split()
        vector={}
        ii=ii+1
        #print v[0]
        wimn_test_labels.append(int(v[0]))
        for i in range(1,len(v)):
                s=v[i].split(":")
                #print s[1]
                vector[i]=int(s[1])
        wimn_test_vectors.append(vector)
print "wimn test "+str(len(wimn_test_vectors))
# get the training and testing vectors and labels.
ii=0        
for eachline in wimn_f_train:
        vec=eachline
        v=vec.split()
        vector={}
        ii=ii+1
        wimn_train_labels.append(int(v[0]))
        #print v[0]
        for i in range(1,len(v)):
                s=v[i].split(":")
                #print s[1]
                vector[i]=int(s[1])
        wimn_train_vectors.append(vector)
print "wimn train "+str( len(wimn_train_vectors))

s=len(wimn_train_labels)
for i_s in range(0,s):
        #print i_s
        ww.append(wimn_model.predict(wimn_train_vectors[i_s]))

# wrongly predicted labels are in ww. correct labels are in wimn_train_labels, wimn_test_labels.

【问题讨论】:

  • 为什么要在字典而不是列表/元组中提供数据?另外,你的 libsvm 版本是多少?
  • 默认情况下,libsvm 最大限度地提高准确性,(TP+TN)/ALL,在大多数样本来自一个类的二元问题中,这会导致用一个标签标记所有数据。改为最大化 F 分数 (2*precision*recall)/(precision+recall)。
  • 我找到了解决方案。由于某种原因,libsvm(libsvm 3.0 是我使用的版本)在我尝试使用原始 test_data 预测它时预测错误的类标签,它预测全部为 1。但是,当我尝试使用缩放的 test_data 预测它时,它会预测正确的值(正如执行 easy.py 的输出所预期的那样)@highbandwidth:我使用 libsvm 3.0(虽然 3.1 已经存在)。我正在阅读测试向量作为字典列表,每个字典代表一个特征向量。我在网上找到了一些使用相同的教程,所以我也这样做了。

标签: python libsvm


【解决方案1】:

需要加载缩放的输入值才能获得预测值。问题得到了解决。

但是,easy.py 生成的预测标签与我加载模型并预测标签时的标签之间似乎存在一些差异。

网络上没有关于 libsvm 的适当文档。

【讨论】:

  • 我用过 libsvm 很多次,我的经验是,在开始试验之前,您必须遵循指南 csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf。我很快意识到我不想使用任何包装器并直接从 bash 调用主例程。如果您想使用其他评估指标或无论如何并行运行它,您将需要更改 cpp 代码。我什至给教授写了一封电子邮件。 Chih-Jen Lin 不到一小时就得到了回复。总结一下:按照libsvm指南,尝试直接调用c++例程。
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2023-03-27
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多