处理文字数据以输入 Scikit-Learn 的 SVC 算法

Processing Word Data For Input into Scikit-Learn's SVC Algorithm

假设人们通过电子邮件向我发送他们在使用某个程序时遇到的问题。我想教机器根据每封电子邮件中使用的单词 class将这些电子邮件变成 "issue type" classes。

我创建了两个 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",说明 "could not convert string to float",然后是 "data.csv" 文件中第一封电子邮件的内容.我是否需要将这些电子邮件内容转换为浮点数以便将它们提供给 SVC 算法?如果是这样,我将如何去做呢?

我一直在 http://scikit-learn.org/stable/datasets/index.html#external-datasets 阅读,上面写着

Categorical (or nominal) features stored as strings (common in pandas DataFrames) will need converting to integers, and integer categorical variables may be best exploited when encoded as one-hot variables

然后我找到了他们关于预处理数据的文档,但恐怕我对下一步该去哪里有点迷茫了。我不完全确定我需要对我的电子邮件内容做些什么才能使其与 SVC 算法一起工作。

如果有人能就如何解决这个问题提供任何见解,我将不胜感激。

是的,您需要对分类特征进行编码,然后将它们用于 SVC。

您可以使用 DictVectorizer for the data_df features and then LabelEncoder 作为 classes_df

这是我使用的示例数据:https://www.dropbox.com/sh/kne5wopgzeuah0u/AABKTuc3_1czzI0hIpZWPkLwa?dl=0

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

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)

这很好用。

希望对您有所帮助

编辑

我在 data.csv.

中使用了在互联网上找到的以下文本作为功能

以下是描述栏的第一个元素。

但在第一份报告发布后不久,就表明最初的陈述具有误导性。 《泰晤士报》报道说,小特朗普接受了这次会面,希望这会产生有关希拉里克林顿的破坏性信息,而小特朗普表示没有。在《纽约时报》获得一个电子邮件链后,显示一位熟人 Rob Goldstone 为小特朗普提供了一次会面,作为俄罗斯政府帮助其父亲竞选活动的一部分,他可以获得信息,小特朗普很快发布了这些电子邮件 online.But在第一份报告之后,显示最初的陈述具有误导性。 《泰晤士报》报道说,小特朗普接受了这次会面,希望这会产生有关希拉里克林顿的破坏性信息,而小特朗普表示没有。 《纽约时报》获得了一个电子邮件链,其中显示一位熟人 Rob Goldstone 为小特朗普提供了一次会面,作为俄罗斯政府帮助其父亲竞选活动的一部分,他可以获得信息,小特朗普在网上发布了这些电子邮件。

长度为:

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

982

代码再次运行良好。

编辑 2

我正在使用:

sklearn.__version__
'0.18.2'

pandas.__version__
u'0.20.3'