### 在Python中使用libsvm的支持向量机特征示例

我已经从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个特征示例,能否提供一个该文件的示例? 能否也提供一个处理输入文件的代码示例?

* 更新 *我想表示这些特征… 我应该怎么做?

  1. 当前词的身份

我想我可以这样解释

0 --> 品牌1 --> 型号2 --> 颜色3 --> 尺寸 4 --> 未分配

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

  1. 当前词的N-gram子字符串特征(N=4,5,6)我不知道这意味着什么?

  2. 当前词前两个词的身份。我该如何建模这个特征?

考虑到我为第一个特征创建的图例,我有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)可以理解的格式?

  1. 属于4个属性字典的成员

我又该如何做?拥有4个字典(用于颜色、尺寸、型号和品牌),我想我必须创建一个布尔变量,如果且仅当当前词与4个字典中的一个匹配时,我会将其设置为真。

  1. 独占属于品牌名称字典的成员

我想像第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, "%"

链接和提示

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

请注意,由于您使用训练数据进行评估,准确率会异常高。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注