将输入的Word数据处理为Scikit-Learn的SVC算法

时间:2017-08-01 15:30:27

标签: python csv scikit-learn classification sklearn-pandas

让我们说人们通过电子邮件向我发送他们遇到的有关程序的问题。我想教机器根据每封电子邮件中使用的单词将这些电子邮件分类为“问题类型”类。

我创建了两个CSV文件,分别包含:

  • 每封电子邮件的字词内容
  • 每个电子邮件都会被标记为

Here is an image showing the two CSV files

我正在尝试将这些数据提供给Python 3中的Scikit-Learn的SVC算法。但据我所知,带有电子邮件内容的CSV文件无法直接传递到SVC;它似乎只接受花车。

我尝试运行以下代码:

import pandas as pd 
import os 
from sklearn import svm 
from pandas import DataFrame 


data_file = "data.csv" 
data_df = pd.read_csv(data_file, encoding='ISO-8859-1')

classes_file = "classes.csv" 
classes_df = pd.read_csv(classes_file, encoding='ISO-8859-1')


X = data_df.values[:-1] #training data
y = classes_df.values[:-1] #training labels
     #The SVM classifier requires the specific variables X and y
         #an array X of size [n_samples, n_features] holding the training samples, 
         #and an array y of class labels (strings or integers), size [n_samples]

clf = svm.SVC(gamma=0.001, C=100)
clf.fit(X, y)

当我运行它时,我在最后一行收到“ValueError”,声明“无法将字符串转换为浮动”,然后是“data.csv”文件中第一封电子邮件的内容。我是否需要将这些电子邮件内容转换为浮点数以便将它们提供给SVC算法?如果是这样,我将如何做到这一点?

我一直在http://scikit-learn.org/stable/datasets/index.html#external-datasets阅读,并说明

  

存储为字符串的分类(或名义)特征(在pandas DataFrames中很常见)需要转换为整数,并且当编码为单热变量时,整数分类变量可能被最佳利用

然后引导我阅读他们关于预处理数据的文档,但是我担心接下来要去哪里会有点迷失。我不完全确定我需要对我的电子邮件内容做什么,才能使用SVC算法。

我非常感谢任何人可以提供的有关如何解决此问题的见解。

1 个答案:

答案 0 :(得分:0)

是的,您需要对分类功能进行编码,然后将其用于SVC。

您可以DictVectorizer使用data_df功能,然后classes_df使用import pandas as pd from sklearn.feature_extraction import DictVectorizer from sklearn import preprocessing from sklearn import svm data_file = "data.csv" data_df = pd.read_csv(data_file, encoding='ISO-8859-1') classes_file = "classes.csv" classes_df = pd.read_csv(classes_file, encoding='ISO-8859-1') # label encoding lab_enc = preprocessing.LabelEncoder() labels_new = lab_enc.fit_transform(classes_df) # vectorize training data train_as_dicts = [dict(r.iteritems()) for _, r in data_df.iterrows()] train_new = DictVectorizer(sparse=False).fit_transform(train_as_dicts) clf = svm.SVC(gamma=0.001, C=100) clf.fit(train_new, labels_new)

这是我使用的示例数据:LabelEncoder

使用完全相同的数据,以下工作正常:

len(data_df['Description'][0])

982

这很好用。

希望这有帮助

修改

我在互联网上使用以下文字作为 data.csv中的一项功能。

以下是Description列的第一个元素。

但在第一次报告发布后不久,最初的陈述就是误导性的。据“泰晤士报”报道,小特朗普接受了这次会议,希望它会产生有关希拉里克林顿的破坏性信息,小特朗普说它没有。在纽约时报获得了一个熟人的电子邮件链后,Rob Goldstone向特朗普提供了一次会议,在那里他可以获得信息,作为俄罗斯政府努力帮助他父亲的活动的一部分,小特朗普在网上发布了这些电子邮件。但在第一份报告发布后不久,最初的声明就被误导了。据“泰晤士报”报道,小特朗普接受了这次会议,希望它会产生有关希拉里克林顿的破坏性信息,小特朗普说它没有。在纽约时报获得了一个熟人的电子邮件链后,Rob Goldstone向特朗普提供了一次会议,在那里他可以获得信息,作为俄罗斯政府努力帮助他父亲的活动的一部分,小特朗普在网上发布了这些电子邮件。

长度为:

sklearn.__version__
'0.18.2'

pandas.__version__
u'0.20.3'

代码再次正常运行。

编辑2

我正在使用:

-v