【问题标题】:Why does fit_transform keep throwing an error?为什么 fit_transform 不断抛出错误?
【发布时间】:2020-11-14 10:08:14
【问题描述】:

我一直在努力理解为什么 fit_transform 不断抛出错误。调试并没有多大帮助,因为它只是将我发送到数组的定义,我不确定我缺少什么。有什么想法吗?

import numpy as np
from sklearn.preprocessing import MinMaxScaler
import pickle

def split_data(inputs, outputs, p_train=0.9, p_test=0.1):
    train_size = int(len(inputs) * p_train)
    test_size = int(len(inputs) * p_test)
    inputs_train, inputs_test = inputs[0:train_size, :], inputs[train_size:, :]
    outputs_train, outputs_test = outputs[0:train_size, :], outputs[train_size:, :]
    return inputs_train, inputs_test, outputs_train, outputs_test

rawinputs = pickle.load(open('rawinputs.pck', 'rb'))  
rawoutputs = pickle.load(open('rawoutputs.pck', 'rb'))  

#split
inputs_train, inputs_test, outputs_train, outputs_test = split_data(rawinputs, rawoutputs, p_train=0.90, p_test=0.10)

#normalize
scaler_inputs = MinMaxScaler()
inputs_train_scaled = scaler_inputs.fit_transform(inputs_train)
inputs_test_scaled = scaler_inputs.transform(inputs_test)
outputs_train = np.asmatrix(outputs_train)

在使用 fit_transform 的第一行抛出错误:

inputs_train_scaled = scaler_inputs.fit_transform(inputs_train)

例如。一行原始输入数据:

['28,7170876207375' '339,050018316624' '0,173448071160097' '158,211319524893']

抛出错误:

File "C:\****\venv\lib\site-packages\sklearn\base.py", line 690, in fit_transform return self.fit(X, **fit_params).transform(X)

【问题讨论】:

  • 您好,欢迎来到 SO。如果您还可以发布您获得的完整错误和回溯,那将会很有帮助。另外,您正在使用的数据示例。
  • 原始输入数据中的值看起来很奇怪:首先它们是字符串。其次,它们看起来像使用逗号作为小数分隔符的浮点数(德国数据源?)。第三,列表表达式缺少逗号作为元素分隔符。可能是你的错字?
  • 这些值来自一个 csv 文件,该文件直接来自我创建的模型,格式有点偏离,因为我从 Pycharm 打印了数组,但数据应该是由 4 个组成的通用二维数组在指定的时间步数内重复的浮点变量

标签: python scikit-learn pycharm normalize


【解决方案1】:

关键是inputs_train变量必须是二维数组。

这里给你一个简单的例子:

from sklearn.datasets import fetch_olivetti_faces

我们会将MinMaxScaler 应用于人脸数据集。

from sklearn.datasets import fetch_olivetti_faces

olivetti = fetch_olivetti_faces()

X = olivetti.images
y = olivetti.target

X 是人脸图像,其中 y 是每个人脸的标签。

接下来我们将数据集分为训练集和测试集。

类似于您的split_data 方法。

from sklearn.datasets import fetch_olivetti_faces
from sklearn.model_selection import train_test_split

olivetti = fetch_olivetti_faces()

X = olivetti.images
y = olivetti.target

x_train, x_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.2,
                                                    random_state=42)

random_state 变量将帮助我们在每次运行代码时生成相同的训练集和测试集。

现在,如果我们查看 x_train 变量:

print(x_train.shape)

共有 320 张火车图像,每张图像为 64 x 64 像素。我们必须重塑才能使用MinMaxScaler

x_train = x_train.reshape(x_train.shape[0], x_train.shape[1] * x_train.shape[2])

现在新的图片尺寸:

最终代码:

from sklearn.datasets import fetch_olivetti_faces
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

olivetti = fetch_olivetti_faces()

X = olivetti.images
y = olivetti.target

x_train, x_test, y_train, y_test = train_test_split(X,
                                                    y,
                                                    test_size=0.2,
                                                    random_state=42)

x_train = x_train.reshape(x_train.shape[0], x_train.shape[1] * x_train.shape[2])
x_test = x_test.reshape(x_test.shape[0], x_test.shape[1] * x_test.shape[2])

min_max_obj = MinMaxScaler()

inputs_train_scaled = min_max_obj.fit_transform(X=x_train)
inputs_test_scaled = min_max_obj.transform(X=x_test)

【讨论】:

  • 我正在尝试对燃气轮机进行建模,我使用的输入数据是来自模型的多个值的组合,这些值将用于预测某些输出值。据我了解,我试图 fit_transform 的数组应该已经是二维的。该数组由给定时间步长的 4 个值组成,具有多个时间步长,例如。 [[20,3,15,5],[15,4,14,7]...] 。您的解释解释了我收到的错误,我只是在努力将其应用于我当前的问题?
  • “数组由给定时间步长的 4 个值组成”。对于给定的时间步,输入大小为 1 x 4。如果您查看我的示例,输入大小应为 1 x 2。正如我在示例中提到的,我已转换 (320, 64, 64) -> (320, 4096)。这就是我应用“MinMaxScaler”的方式因此,对于给定的时间步长,输入大小应该是 1 x 2,例如 [[20, 3], [15, 4]...] 而不是 [[20, 3, 15 , 5], [15, 4, 14, 7]...]。如果您无法操作输入数据,您可以使用其他预处理方法,例如 PCA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2017-11-11
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多