字符串列表上的 Kfold 交叉验证和 SVM python

Kfold cross-validation and SVM on list of strings python

目标: 我正在尝试 运行 对字符串列表进行 kfold 交叉验证 X, y 并使用以下代码获得交叉验证分数:

import numpy as np
from sklearn import svm
from sklearn import cross_validation
from sklearn.model_selection import StratifiedKFold 

X = ["hey", "join now", "hello", "join today"]
y = ["n", "y", "n", "y"]
skf = StratifiedKFold(n_splits=2)

for train, test in skf.split(X,y): 
    print("%s %s" % (train,test)) 

clf = svm.SVC(kernel='linear', C=1)

scores = cross_validation.cross_val_score(clf, X, y, cv=2)

但是我得到一个错误:

ValueError: could not convert string to float 

问题:是否可以运行对字符串列表进行kfold交叉验证和svm?或者我需要不同的程序吗?

我是 sklearn 的新手,我已经阅读了很多教程,包括这个 http://ogrisel.github.io/scikit-learn.org/sklearn-tutorial/modules/cross_validation.html 但我仍然不确定我是否正确地这样做了。

这里的问题不是交叉验证,而是您的输入数据。正如@VivekKumar 指出的那样,您需要将数据转换为某种数字格式。 Scikit 在 sklearn.feature_extraction.text 模块中有用于转换文本的工具。我不会在这里详细介绍每个人的作用,但使用 TFIDF 的建议通常很合理。

简而言之,TFIDF 是一种根据整个文档语料库为每个词分配一个值的方法,该值与该词对文档的重要性有关。我要指出的是,矢量化 strings/documents 背后的科学非常深奥,您真的应该花时间至少熟悉词干提取和词形还原、标记化和 n-gram 等内容。

在这种情况下,最简单的示例是在训练模型之前使用 sklearn 中开箱即用的 TfidfVectorizer 来处理字符串。

from sklean.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
X_vec = tfidf.fit_transform(X)
X_vec.toarray()
array([[ 0.        ,  1.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.6191303 ,  0.78528828,  0.        ],
       [ 1.        ,  0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.6191303 ,  0.        ,  0.78528828]])
cross_validation.cross_val_score(clf, X_vec, y, cv=2)
array([ 0.5,  0.5])

这应该让你开始了,但我想再次指出,在 NLP 中调整你的文本处理步骤与调整你的模型超参数一样重要,甚至更重要。