字符串python列表上的Kfold交叉验证和SVM
Posted
技术标签:
【中文标题】字符串python列表上的Kfold交叉验证和SVM【英文标题】:Kfold cross-validation and SVM on list of strings python 【发布时间】:2018-06-24 14:59:43 【问题描述】:目标:我正在尝试对字符串列表 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,但我仍然不确定我是否正确地做到了这一点。
【问题讨论】:
没有。y
(标签或目标)可以是字符串,但不能是 X(样本特征)。您需要以某种方式将它们转换为浮动。也许得到单词的 tfidf 或频率。见text processing
【参考方案1】:
这里的问题不是交叉验证,而是您的输入数据。正如@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 中,调整文本处理步骤与调整模型超参数一样重要。
【讨论】:
以上是关于字符串python列表上的Kfold交叉验证和SVM的主要内容,如果未能解决你的问题,请参考以下文章
如何在python中从头开始获取kfold拆分以进行交叉验证?
在 KFold 交叉验证的情况下如何显示平均分类报告和混淆矩阵
如何使用 KFold 交叉验证输出作为 CNN 输入进行图像处理?