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的主要内容,如果未能解决你的问题,请参考以下文章