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

时间:2018-01-15 23:33:17

标签: python machine-learning scikit-learn svm cross-validation

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

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,但我仍然不确定我是否正确地执行此操作。

1 个答案:

答案 0 :(得分:0)

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

简而言之,TFIDF是一种为每个单词指定一个值的方法,该值与该单词基于整个文档集合对文档的重要程度有关。我将指出,矢量化字符串/文档背后的科学是非常深刻的,你应该花时间至少熟悉诸如词干和词形还原,标记化和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调整中,文本处理步骤与调整模型超参数一样重要。