无论在 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
对象的类型。
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 分数(在二进制分类中)?