如何用sklearn标准化大型numpy矩阵? (批处理)

时间:2016-07-23 05:07:37

标签: python numpy scipy scikit-learn

我正在使用梯度增强进行分类问题。像往常一样,在分类之前,我想扩展我的特征矩阵(878049, 3208)。

A = LabelEncoder().fit_transform(training_data['col1'].values.reshape(-1, 1).ravel())
B = LabelEncoder().fit_transform(training_data['col2'].values.reshape(-1, 1).ravel())
C = LabelEncoder().fit_transform(training_data['col3'].values.reshape(-1, 1).ravel())

然后:

A_1 = OneHotEncoder().fit_transform(A.reshape(-1, 1)).A
B_2 = OneHotEncoder().fit_transform(B.reshape(-1, 1)).A
C_3 = OneHotEncoder().fit_transform(C.reshape(-1, 1)).A
D_4 = CountVectorizer().fit_transform(training_data['Col_4'].values)

然后:

print(A_1.shape, B_2.shape, C_3.shape, D_4.shape)
>>> (878049, 10) (878049, 2249) (878049, 7) (878049, 942)


X =  np.column_stack((A_1.A, B_2, C_3, D_4))

这是一切都冻结的时候:

scaler = StandardScaler()
X_new = scaler.partial_fit(X)

然而,虽然我尝试partial_fit()功能,但我的整个计算机都冻结了。因此,在这种情况下我能做些什么?。

我还尝试在坚持阵列之前缩放每个功能。然而,我相信这实际上是错误的。有什么建议吗?。

更新 我还试图在缩放之前选择特征。但是,我认为这是错误的。

1 个答案:

答案 0 :(得分:2)

partial_fit的{​​{3}}解释了正在发生的事情。以下是相关部分:

  

partial_fit(X,y =无)

     

所有X都作为单个批次进行处理

所以你的任务是使用部分数据多次调用partial_fit (而不是像你一样用你的所有数据调用它一次)。

尝试这样的事情(未经测试的代码;只是为了给你一个想法):

scaler = StandardScaler()

n = X.shape[0]  # number of rows
batch_size = 1000  # number of rows in each call to partial_fit
index = 0  # helper-var

while index < n:
    partial_size = min(batch_size, n - index)  # needed because last loop is possibly incomplete
    partial_x = X[index:index+partial_size]
    scaler.partial_fit(partial_x)
    index += partial_size

说明

  • partial_fit返回None(在您的代码中也使用错误)
  • 在循环中使用partial_fit后,您可以使用scaler.transform来获取重新调整后的数据:也许您需要在循环中使用