sklearn cross_validation ValueError:无法将字符串转换为浮点数

Posted

技术标签:

【中文标题】sklearn cross_validation ValueError:无法将字符串转换为浮点数【英文标题】:sklearn cross_validation ValueError: could not convert string to float 【发布时间】:2018-09-20 14:15:03 【问题描述】:

我正在学习 sklearn 并试图了解交叉验证方法。我已经加载了我的数据集,该数据集是与每个类别相关的子目录的目录,包含它们对应的文件。

category_data = load_files('Datasets/Data/reviews_6_cat',
    shuffle=True, random_state=1, load_content = True,
    encoding='latin1', decode_error='strict')

我现在正在尝试检索此分类器的交叉验证分数:

clf = svm.SVC(kernel='linear', C=100)
scores = cross_validation.cross_val_score(clf, category_data.data, category_data.target, cv=5)

但我收到错误“ValueError: could not convert string to float...”

我认为我的数据集加载方式可能存在问题,因为我无法检索数据的形状:

category_data.data.shape

给我错误:“'list' 对象没有属性 'shape'”

我尝试使用 numpy.array 对其进行转换,但它只是给了我一个一维数组,考虑到有 6 个类别,我认为它不正确。

如何加载我的数据,以便它可以在 cross_validation 方法中工作?

【问题讨论】:

您是否检查了所有项目的数据类型?看来您的数据中有str 我的数据集由字符串组成,我正在尝试进行文本分类 我认为您需要将字符串更改为 onehot 或 cat 我刚刚意识到我的问题,我还没有使用矢量化器对其进行转换!愚蠢的错误对不起 那么,应该如何使用作为单词的分类值运行交叉验证? 【参考方案1】:

在传入方法之前忘记使用 TfidfVectorizer 转换数据:

tfidf = TfidfVectorizer()

vect_data = tfidf.fit_transform(category_data.data)

clf = svm.SVC(kernel='linear', C=100) 
scores = cross_validation.cross_val_score(clf, vect_data, category_data.target, cv=10)

print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() / 2))

【讨论】:

首先,您使用的是已弃用的旧版cross_val_score。请改用model_selection.cross_val_score 其次,这个版本的代码可能(很可能)给你的结果比实际模型应该给出的结果略高,因为交叉验证折叠会导致在整个数据上运行 TfidfVectorizer 导致数据泄漏。您应该先拆分数据,然后将它们矢量化。

以上是关于sklearn cross_validation ValueError:无法将字符串转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

如何删除此错误“ModuleNotFoundError: No module named 'sklearn.cross_validation'”

sklearn.cross_validation找不到

是否从 sklearn 中删除了 cross_validation 模块?如果是,从哪个版本开始?

成功解决(机器学习分割数据问题):ModuleNotFoundError: No module named ‘sklearn.cross_validation‘

E-04No module named 'sklearn.cross_validation'解决方法

管道中的自定义 sklearn 转换器为 cross_validate 抛出 IndexError 但在使用 GridSearchCV 时不会