使用libsvm功能的例子在Python中支持向量机

Usi*_*Usi 5 python machine-learning svm libsvm

我已经抓了很多像这样的ebay游戏:

Apple iPhone 5 White 16GB Dual-Core
Run Code Online (Sandbox Code Playgroud)

我用这种方式手动标记了所有这些内容

B M C S NA
Run Code Online (Sandbox Code Playgroud)

其中B =品牌(Apple)M =型号(iPhone 5)C =颜色(白色)S =尺寸(尺寸)NA =未指定(双核)

现在我需要使用python中的libsvm库训练SVM分类器,以了解ebay标题中出现的序列模式.

我需要通过将问题视为分类来为该属性(品牌,模型,颜色,大小)提取新值.通过这种方式,我可以预测新模型.

我想考虑这个功能:

* Position
- from the beginning of the title
- to the end of the listing
* Orthographic features
- current word contains a digit
- current word is capitalized 
....
Run Code Online (Sandbox Code Playgroud)

我无法理解如何将所有这些信息提供给库.官方文档缺乏很多信息

我的班级是品牌,型号,尺寸,颜色,NA

SVM算法的输入文件必须包含什么?

我怎么创建它?考虑到我在问题中提供的4个功能,我可以举一个该文件的示例吗?我是否还可以使用一些示例来详细说明输入文件?

*更新* 我想代表这些功能......我该怎么办?

  1. 当前单词的身份

我想我可以用这种方式解释它

0 --> Brand
1 --> Model
2 --> Color
3 --> Size 
4 --> NA
Run Code Online (Sandbox Code Playgroud)

如果我知道这个单词是Brand,我会将该变量设置为1(true).在训练测试中可以这样做(因为我已经标记了所有单词)但是我怎样才能为测试集做到这一点?我不知道一个词的类别是什么(这就是我学习它的原因:D).

  1. 当前单词的N-gram子串特征(N = 4,5,6)没有想法,这意味着什么?

  2. 当前单词前2个单词的标识.我该如何建模此功能?

考虑到我为第一个功能创建的传奇,我有5 ^(5)组合)

00 10 20 30 40
01 11 21 31 41
02 12 22 32 42
03 13 23 33 43
04 14 24 34 44
Run Code Online (Sandbox Code Playgroud)

如何将其转换为libsvm(或scikit-learn)可以理解的格式?

  1. 4个属性字典的成员资格

我怎么能这样做?有4个字典(颜色,大小,型号和品牌)我必须创建一个bool变量,我将设置为true,当且仅当我在4个字典之一中有当前单词的匹配时.

  1. 品牌词典的独家会员资格

我认为像4.功能一样,我必须使用bool变量.你同意吗?

Jul*_*arz 11

以下是如何使用数据训练SVM然后使用相同数据集进行评估的分步指南.它也可以在http://nbviewer.ipython.org/gist/anonymous/2cf3b993aab10bf26d5f上找到.在网址上你还可以看到中间数据的输出和结果的准确性(这是一个iPython笔记本)

第0步:安装依赖项

您需要安装以下库:

  • 大熊猫
  • scikit学习

从命令行:

pip install pandas
pip install scikit-learn
Run Code Online (Sandbox Code Playgroud)

第1步:加载数据

我们将使用pandas来加载我们的数据.pandas是一个可以轻松加载数据的库.为了说明,我们首先将样本数据保存到csv然后加载它.

我们将训练SVM train.csv并获得测试标签test.csv

import pandas as pd

train_data_contents = """
class_label,distance_from_beginning,distance_from_end,contains_digit,capitalized
B,1,10,1,0
M,10,1,0,1
C,2,3,0,1
S,23,2,0,0
N,12,0,0,1"""


with open('train.csv', 'w') as output:
    output.write(train_data_contents)

train_dataframe = pd.read_csv('train.csv')
Run Code Online (Sandbox Code Playgroud)

第2步:处理数据

我们将数据帧转换为numpy数组,这是scikit-learn理解的格式.

我们需要将标签"B","M","C",......转换为数字,因为svm不理解字符串.

然后我们将用数据训练线性svm

import numpy as np

train_labels = train_dataframe.class_label
labels = list(set(train_labels))
train_labels = np.array([labels.index(x) for x in train_labels])
train_features = train_dataframe.iloc[:,1:]
train_features = np.array(train_features)

print "train labels: "
print train_labels
print 
print "train features:"
print train_features
Run Code Online (Sandbox Code Playgroud)

我们在这里看到train_labels(5)的长度与我们所拥有的行数完全匹配trainfeatures.每个项目train_labels对应一行.

第3步:训练SVM

from sklearn import svm
classifier = svm.SVC()
classifier.fit(train_features, train_labels)
Run Code Online (Sandbox Code Playgroud)

第4步:在某些测试数据上评估SVM

test_data_contents = """
class_label,distance_from_beginning,distance_from_end,contains_digit,capitalized
B,1,10,1,0
M,10,1,0,1
C,2,3,0,1
S,23,2,0,0
N,12,0,0,1
"""

with open('test.csv', 'w') as output:
    output.write(test_data_contents)

test_dataframe = pd.read_csv('test.csv')

test_labels = test_dataframe.class_label
labels = list(set(test_labels))
test_labels = np.array([labels.index(x) for x in test_labels])

test_features = test_dataframe.iloc[:,1:]
test_features = np.array(test_features)

results = classifier.predict(test_features)
num_correct = (results == test_labels).sum()
recall = num_correct / len(test_labels)
print "model accuracy (%): ", recall * 100, "%"
Run Code Online (Sandbox Code Playgroud)

链接和提示

  • 如何加载LinearSVC的示例代码:http://scikitlearn.org/stable/modules/svm.html#svm
  • 很长的scikit-learn示例列表:http://scikitlearn.org/stable/auto_examples/index.html .我发现这些有点温和,但我自己常常感到困惑.
  • 如果您发现SVM需要很长时间进行训练,请尝试使用LinearSVC:http://scikitlearn.org/stable/modules/generated/sklearn.svm.LinearSVC.html
  • 这是关于熟悉机器学习模型的另一个教程:http://scikit-learn.org/stable/tutorial/basic/tutorial.html

您应该能够获取此代码train.csv,test.csv并将您的测试数据替换为您的训练数据,并获得测试数据的预测以及准确性结果.

请注意,由于您正在使用您训练过的数据进行评估,因此准确度会异常高.