目标:我正在尝试在字符串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,但我仍然不确定我是否正确地执行此操作。
答案 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调整中,文本处理步骤与调整模型超参数一样重要。