我已经从eBay上抓取了很多这样的标题:
Apple iPhone 5 White 16GB Dual-Core
并且我已经手动标记了所有这些标题,如下所示:
B M C S NA
其中B=品牌(Apple) M=型号(iPhone 5) C=颜色(White) S=尺寸(Size) NA=未分配(Dual Core)
现在我需要使用Python中的libsvm库训练一个SVM分类器,以学习eBay标题中出现的序列模式。
我需要通过将问题视为分类问题来提取这些属性(品牌、型号、颜色、尺寸)的新值。这样我就可以预测新的型号。
我想考虑以下特征:
* 位置-从标题的开始到列表的结束* 拼写特征-当前词包含数字-当前词首字母大写....
我不知道如何将所有这些信息提供给库。官方文档缺少很多信息
我的类别是品牌、型号、尺寸、颜色、未分配
SVM算法的输入文件必须包含什么?
我如何创建它? 考虑到我在问题中提到的4个特征示例,能否提供一个该文件的示例? 能否也提供一个处理输入文件的代码示例?
* 更新 *我想表示这些特征… 我应该怎么做?
- 当前词的身份
我想我可以这样解释
0 --> 品牌1 --> 型号2 --> 颜色3 --> 尺寸 4 --> 未分配
如果我知道这个词是品牌,我会将该变量设置为1(真)。在训练测试中这样做是可以的(因为我已经标记了所有词),但在测试集中我该怎么做呢? 我不知道一个词的类别(这就是我学习它的原因:D)。
-
当前词的N-gram子字符串特征(N=4,5,6)我不知道这意味着什么?
-
当前词前两个词的身份。我该如何建模这个特征?
考虑到我为第一个特征创建的图例,我有5^(5)种组合)
00 10 20 30 4001 11 21 31 4102 12 22 32 4203 13 23 33 4304 14 24 34 44
我如何将其转换为libsvm(或scikit-learn)可以理解的格式?
- 属于4个属性字典的成员
我又该如何做?拥有4个字典(用于颜色、尺寸、型号和品牌),我想我必须创建一个布尔变量,如果且仅当当前词与4个字典中的一个匹配时,我会将其设置为真。
- 独占属于品牌名称字典的成员
我想像第4个特征一样,我必须使用一个布尔变量。你同意吗?
回答:
以下是使用您的数据训练SVM并使用相同数据集进行评估的分步指南。您也可以在http://nbviewer.ipython.org/gist/anonymous/2cf3b993aab10bf26d5f查看。它是一个iPython笔记本,您还可以看到中间数据的输出和最终的准确率结果。
步骤0: 安装依赖
您需要安装以下库:
- pandas
- scikit-learn
从命令行:
pip install pandaspip install scikit-learn
步骤1: 加载数据
我们将使用pandas来加载我们的数据。pandas是一个用于轻松加载数据的库。为了说明,我们首先将样本数据保存到csv文件中,然后加载它。
我们将使用train.csv
来训练SVM,并使用test.csv
来获取测试标签
import pandas as pdtrain_data_contents = """class_label,distance_from_beginning,distance_from_end,contains_digit,capitalizedB,1,10,1,0M,10,1,0,1C,2,3,0,1S,23,2,0,0N,12,0,0,1"""with open('train.csv', 'w') as output: output.write(train_data_contents)train_dataframe = pd.read_csv('train.csv')
步骤2: 处理数据
我们将我们的数据框转换为numpy数组,这是scikit-learn可以理解的格式。
我们还需要将标签”B”, “M”, “C”,…转换为数字,因为svm不理解字符串。
然后我们将使用数据训练一个线性svm
import numpy as nptrain_labels = train_dataframe.class_labellabels = 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_labelsprint print "train features:"print train_features
我们在这里看到train_labels
的长度(5)正好与trainfeatures
中的行数相匹配。train_labels
中的每一项对应一行。
步骤3: 训练SVM
from sklearn import svmclassifier = svm.SVC()classifier.fit(train_features, train_labels)
步骤4: 在一些测试数据上评估SVM
test_data_contents = """class_label,distance_from_beginning,distance_from_end,contains_digit,capitalizedB,1,10,1,0M,10,1,0,1C,2,3,0,1S,23,2,0,0N,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_labellabels = 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, "%"
链接和提示
- 加载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
替换为您的测试数据,并获取测试数据的预测结果以及准确率结果。
请注意,由于您使用训练数据进行评估,准确率会异常高。