为啥 fit_transform() 总是给我零?

Posted

技术标签:

【中文标题】为啥 fit_transform() 总是给我零?【英文标题】:Why does fit_transform() always give me zeros?为什么 fit_transform() 总是给我零? 【发布时间】:2021-09-13 00:16:36 【问题描述】:

我想知道为什么会这样:

sklearn.preprocessing.StandardScaler().fit_transform([[58,144000]])

给出这个结果:

array([[0., 0.]])

我正在做一个逻辑回归,我在上面的值数组(实际数据文件)上运行fit_transform()。然而,这种转变似乎运作良好。但是,当我尝试执行如上所示的一对值 ([[58,144000]]) 时,我得到了零。

对于使用“新”输入的预测,我需要像缩放测试/训练数据一样缩放新值,这样我的机器学习预测才会起作用。

感谢您的建议。

谢谢!

【问题讨论】:

请提供预期的minimal, reproducible example (MRE)。我们应该能够复制和粘贴您的代码的连续块,执行该文件,并重现您的问题以及跟踪问题点的输出。这让我们可以根据您的测试数据和所需的输出来测试我们的建议。 我不确定这是否能回答您的问题,但如果您已经将 standard_scaler=StandardScaler() 对象适合您的训练数据并且您想要转换您的新数据,那么您应该使用 standard_scaler.transform 而不是StandardScaler().fit_transform. 【参考方案1】:

如果您阅读docs,您可能想知道,为什么它需要一个二维数组?您可以计算向量的平均值和标准差,向量是一维数组,因为您将其反映在您的问题上。答案是,它需要(样本、特征)数据。

因此,如果您传递 [[58,144000]] 之类的数据,它是一个 (1,2) 数组,这意味着 1 个样本具有 2 个特征。然后它将适合变换每个特征,这是一个单一的数字。标准化每个特征会给你一个零:[[0., 0.]]

另一方面,如果你传递[[58],[144000]]这样的数据,那么它将是(2,1),这意味着2个样本和1个特征。然后它对每个功能进行扩展和标准化,并为您提供您可能期望的结果,例如:[[-1],[1]]

x = [58,144000]
mu = np.mean(x)
sigma = np.std(x)
print([((58 - mu) / sigma),((144000 - mu) / sigma)]) # [-1.0, 1.0]

from sklearn.preprocessing import StandardScaler
print(StandardScaler().fit_transform([[58],[144000]])) # [[-1.] [ 1.]]

【讨论】:

我遇到的问题之一是这段代码: from sklearn.preprocessing import StandardScaler sc = StandardScalar() 给我错误“未定义名称'StandardScalar'” 它不是 StandardScalar(),它的 StandardScaler()。标量错误,标量er 没问题。 谢谢,部分有效,但结果错误。从 AZ 机器学习类,从 sklearn.preprocessing import StandardScaler sc = StandardScaler() print(classifier.predict(sc.fit_transform([[49, 28000]]))) -> 是零,什么时候应该是一。 你看过我的回答吗?我告诉过,如果你传递这样的数组 [[49, 28000]],它会将这视为 1 个样本的两个特征。那么它们在转换中都将为零。应该是 [[49], [28000]] 是的,我读过,但您的建议无效。使用您的建议,我得到:“ X 每个样本有 1 个特征;期望 2”

以上是关于为啥 fit_transform() 总是给我零?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“cout”总是给我错误 C1083?

为啥 DTrace 有时但并非总是给我无效地址错误?

为啥 SimpleImputer 的 fit_transform 不适用于 google colab 中的数据框?

在openfire中获取xmpp ios中的所有注册用户

为啥它给我一个返回丢失错误?

为啥 RSA 加密文本给我相同文本的不同结果