sklearn 中的 ColumnTransformer 实现没有定义 fit 方法,它只是自动调用 fit_transform?



当我应用滑动窗口算法时,我的数据增长到太大,无法在内存中处理,但它足够小,我可以毫无问题地调用ColumnTransformer的fit方法。因此,我想要的工作流程是:

  1. MinMaxScaler()拟合整个数据
  2. 转换SlidingWindowAlgorithm()的数据批次

问题是,在ColumnTransformer中似乎不存在拟合方法,查看源代码显示:

def fit(self, X, y=None):
# we use fit_transform to make sure to set sparse_output_ (for which we
# need the transformed data) to have consistent output type in predict
self.fit_transform(X, y=y)
return self

我不理解他们的推理(不知道sparse_output_的目的(。

有没有一种方法可以在不进行转换的情况下调整我的数据?我并没有使用稀疏矩阵,只是使用了一个正则的numpy矩阵。

这是我的代码,data_in设置为提供500MB的RAM。当你增加window_size的值时,RAM中会检测到一个令人难以置信的尖峰。(我需要window_size达到60(。

## Part 0: Starting
import numpy as np
import pandas as pd
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
data_in = np.random.rand(10*10**6,7) # This will take 500MB of RAM
window_size = 1 # Change this value!
## Part 1: Creating Transformers!
class SlidingWindowX(BaseEstimator, TransformerMixin):
def __init__(self, window_size):
self.window_size = window_size
def fit(self, X, y=None):
return self
def transform(self, X, y=None):
'''
Creates a sliding window over an input that has the shape of
(rows, features) for X
'''
if X.ndim == 1:
X = X.reshape(-1, 1)
row_size = X.shape[0]
X_out = np.zeros((row_size-2*self.window_size, 1))
for j in range(X.shape[1]):
for i in range(self.window_size):
idx1 = i
idx2 = row_size-2*self.window_size+i
X_out = np.concatenate((X_out, X[idx1:idx2, j].reshape(-1, 1)), axis=1)
return X_out[:, 1:]
## Part 2: Making pipelines!
attribs_elec = np.arange(0, 7)

pipe_elec = Pipeline([
('min-max', MinMaxScaler()),
('window', SlidingWindowX(window_size))
])

pipe_full = ColumnTransformer([
("elec", pipe_elec, attribs_elec),
])
pipe_full.fit(data_in)

回答您的问题

有没有一种方法可以在不进行转换的情况下调整数据?

是的,您可以使用数据调用fit_transform()方法,它将适合ColumnTransformer。您的数据不会被转换,因为输入数据保持不变,转换后的数据只通过输出返回(不必保存(。

由于您的代码不能像您提到的那样运行(缺少数据(,我在文档中有这个例子:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import Normalizer
ct = ColumnTransformer(
[("norm1", Normalizer(norm='l1'), [0, 1]),
("norm2", Normalizer(norm='l1'), slice(2, 4))])
X = np.array([[0., 1., 2., 2.],
[1., 1., 0., 1.]])

现在您可以调用fit_transform():

ct.fit_transform(X)

返回转换后的数据:

array([[0. , 1. , 0.5, 0.5],
[0.5, 0.5, 0. , 1. ]])

但这并没有被存储,因此数据(X(保持不变:

X

输出:

array([[0., 1., 2., 2.],
[1., 1., 0., 1.]])

相关内容

最新更新