为啥 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() 总是给我零?的主要内容,如果未能解决你的问题,请参考以下文章