如何在MinMaxScaler中对矩阵中的列使用inverse_transform

cyb*_*ric 2 python scikit-learn

我根据其列缩放矩阵,如下所示:

scaler = MinMaxScaler(feature_range=(-1, 1))
data = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])
scaler = scaler.fit(data)
data_scaled = scaler.transform(data)
Run Code Online (Sandbox Code Playgroud)

data_scaled给我的情况如下:

array([[-1. , -1. ],
       [-0.5, -0.5],
       [ 0. ,  0. ],
       [ 1. ,  1. ]])
Run Code Online (Sandbox Code Playgroud)

这是所需的输出。但是,我试图逆转此矩阵第一列的缩放比例,所以我尝试了以下操作(错误显示在每行代码下方):

scaler.inverse_transform(data_scaled[:,1].reshape(1,-1))
Traceback (most recent call last):
  File "c:\anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-38-6316f51586e7>", line 1, in <module>
    scaler.inverse_transform(data_scaled[:,1].reshape(1,-1))
  File "c:\anaconda3\lib\site-packages\sklearn\preprocessing\data.py", line 385, in inverse_transform
    X -= self.min_
ValueError: operands could not be broadcast together with shapes (1,4) (2,) (1,4) 
Run Code Online (Sandbox Code Playgroud)

另外,我尝试了:

scaler.inverse_transform(data_scaled[:,1].reshape(-1,1))
Traceback (most recent call last):
  File "c:\anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-39-397382ddb3fd>", line 1, in <module>
    scaler.inverse_transform(data_scaled[:,1].reshape(-1,1))
  File "c:\anaconda3\lib\site-packages\sklearn\preprocessing\data.py", line 385, in inverse_transform
    X -= self.min_
ValueError: non-broadcastable output operand with shape (4,1) doesn't match the broadcast shape (4,2)
Run Code Online (Sandbox Code Playgroud)

那么,如何重新缩放该矩阵的第一列呢?

小智 14

sklearn.preprocessing.MinMaxScaler 具有 min_ 和 scale_ 等属性

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html#sklearn.preprocessing.MinMaxScaler

您可以将该特定列的这些属性转移到一个新的空 minmaxscaler 来解决您的问题。


例如:对于 [?,4] 数组 在此处输入图片说明

属性转移

在此处输入图片说明


cs9*_*s95 6

scaler 请记住,您将其传递给具有两列的2D输入,并假设传递给它的所有后续数据将具有相同数量的要素/列。

如果仅是您想要的第一列,则仍然需要传递inverse_transform具有相同列数的输入。从结果中获取第一列,并丢弃其余的列。

scaler.inverse_transform(data_scaled)[:, [0]]

array([[-1. ],
       [-0.5],
       [ 0. ],
       [ 1. ]])
Run Code Online (Sandbox Code Playgroud)

这有点浪费,但这是sklearn API的局限性。