字符串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 输入进行图像处理?

KFold 交叉验证不能修复过度拟合

使用手动 KFold-Cross 验证与 KerasClassifier-KFold 交叉验证时的不同结果

sklearn中的Kfold交叉验证每次都会给出不同的折叠