MinMaxScaler.fit_transform 始终返回/转换为 0

Posted

技术标签:

【中文标题】MinMaxScaler.fit_transform 始终返回/转换为 0【英文标题】:MinMaxScaler.fit_transform always return/transform to 0 【发布时间】:2021-11-05 09:24:18 【问题描述】:

以下是我的代码,其中fit_transform() 始终转换为 0。我在模型训练时使用了相同的验证数据和代码,但是在测试中它的行为有所不同。

以下是我的验证数据:

Date P1 P2
2021-01-04 00:00:13 2.343674 0.000909
2021-01-04 01:00:00 -1.339256 -0.001019
2021-01-04 02:00:00 6.485042 0.001654
2021-01-04 03:00:00 -3.047014 -0.002561
2021-01-04 04:00:00 2.308437 -0.000279

测试数据:

Date P1 P2
2021.01.04 00:00:13 2.343673841 0.0009093321465
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))  

dataset_test = pd.read_csv("filePath.csv",index_col="Date",parse_dates=True)

test_x = np.array(dataset_test)

test_x = sc.fit_transform(test_x)

print("test_x: ", test_x)

以下是输出:

test_x:  [[0. 0.]]

我做错了什么?

【问题讨论】:

MinMaxScaler 转换每一列而不是行。您只有一行,因此每列中的每个值都是最小值并缩放为0.0 我们测试数据上使用fit_transform;只有transform,带有一个已经适合训练数据的缩放器。 【参考方案1】:

您应该始终对测试数据或验证数据集使用转换方法。如果您将 fit_transform 用于测试或验证数据,则会导致数据泄漏,并且您的模型在新数据集上表现不佳。

您可以创建一个 min max scaler 的实例,尝试将 fit_transform 用于训练数据,并使用 transform 方法将相同的实例用于测试数据。

sc = MinMaxScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)

【讨论】:

我没有训练数据,因为我已经训练了模型,现在我想使用该模型进行预测,因此在这种情况下没有 x_train;我尝试了 sc.transform(x_test) 而不是 sc.fit_transform(x_test),但还没有运气。 如果你有一个训练有素的模型,你可以将你的模型与model.predict(test_x)一起使用。如果您正确设置模型,则无需单独转换测试数据。如果预处理不是您的管道的一部分并且您丢失了拟合的变换,那么您的模型将毫无用处。

以上是关于MinMaxScaler.fit_transform 始终返回/转换为 0的主要内容,如果未能解决你的问题,请参考以下文章