无论在 scikit-learn 中使用列表还是 numpy 数组,结果都不同

Posted

技术标签:

【中文标题】无论在 scikit-learn 中使用列表还是 numpy 数组,结果都不同【英文标题】:Results differ whether using a list or a numpy array in scikit-learn 【发布时间】:2013-07-14 12:21:15 【问题描述】:

我有一个数据集 data 和一个标记数组 target,我用它在 scikit-learn 中使用 k-最近邻算法构建了一个监督模型。

neigh = KNeighborsClassifier()
neigh.fit(data, target)

我现在可以使用这个模型对我的学习集进行分类。获取分类分数:

neigh.score(data, target)

现在我的问题是这个分数取决于target 对象的类型。

如果是python列表,即使用list()创建并填写target.append(),则score方法返回0.68。 如果是numpy数组,使用target = np.empty(shape=(length,1), dtype="S36")创建(只包含36个字符的字符串),填入target[k] = value,score方法返回0.008。

为了确定结果是否真的不同,我创建了列出结果的文本文件

for k in data:
    neigh.predict(k)

在每种情况下。结果是一样的。 什么可以解释分数差异?

【问题讨论】:

如果只将数组的形状指定为(长度)会怎样?那么它的形状将是(长度,)而不是(长度,1)? @Harel,谢谢!这解决了问题。但我真的不明白为什么,你是怎么想的? 没有什么比经验... 一维大小 = 1 的二维数组和一维数组之间的 numpy 存在差异。虽然它们经常可以互换使用,但它们并不相同,在这种情况下,这种细微的差异会产生问题。要求对我的原始评论投赞成票是否合乎道德? :) @Harel,很愿意,但没有足够的声誉来投票......! 【参考方案1】:

@Harel 发现了问题,下面是解释:

np.empty(shape=(length, 1), dtype="S36")

创建一个形状错误的数组。 scikit-learn 估计器几乎总是需要一维数组,即shape=length。这不会引发异常这一事实是一种疏忽。

【讨论】:

以上是关于无论在 scikit-learn 中使用列表还是 numpy 数组,结果都不同的主要内容,如果未能解决你的问题,请参考以下文章

机器学习:SVM(scikit-learn 中的 SVM:LinearSVC)

如何告诉 scikit-learn 为哪个标签给出了 F-1/precision/recall 分数(在二进制分类中)?

scikits 机器学习中的缺失值

需要标准化/标准化的scikit-learn算法列表

将单词添加到 scikit-learn CountVectorizer 停止列表

Python 元组和列表操作(作为 scikit-learn 中 SVM 模型的输入)