Scikit-learn labelencoder:如何保留批次之间的映射?

时间:2017-05-15 02:45:30

标签: python-2.7 scikit-learn

我有1.85亿个样本,每个样本大约3.8 MB。为了准备我的数据集,我需要对其中的许多功能进行单热编码,之后我将获得超过15,000个功能。

但是我需要批量准备数据集,因为当一个热编码仅使用300万个样本时,内存占用空间超过100 GB仅用于单独的功能。

问题是如何保留批次之间的编码/映射/标签? 批次不一定具有所有级别的类别。也就是说,第1批可能有:巴黎,东京,罗马 第2批可能有巴黎,伦敦。 但最终我需要将巴黎,东京,罗马,伦敦全部映射到一个编码。

假设我无法一次性确定我的“城市”栏目的水平为1.85亿,因为它不适合RAM,我该怎么办? 如果我将相同的Labelencoder实例应用于不同的批次,那么映射是否保持不变? 我还需要使用scikitlearn或Keras' np_utilities_to_categorical也是在此之后批量生产的。同样的问题:如何批量使用这三种方法或一次将它们应用于存储在磁盘上的文件格式?

1 个答案:

答案 0 :(得分:1)

我建议使用熊猫' get_dummies()为此,因为sklearn的OneHotEncoder()需要在.fit()时查看所有可能的分类值,否则在.transform()遇到新值时会抛出错误}。

# Create toy dataset and split to batches
data_column = pd.Series(['Paris', 'Tokyo', 'Rome', 'London', 'Chicago', 'Paris'])
batch_1 = data_column[:3]
batch_2 = data_column[3:]

# Convert categorical feature column to matrix of dummy variables
batch_1_encoded = pd.get_dummies(batch_1, prefix='City')
batch_2_encoded = pd.get_dummies(batch_2, prefix='City')

# Row-bind (append) Encoded Data Back Together
final_encoded = pd.concat([batch_1_encoded, batch_2_encoded], axis=0)

# Final wrap-up. Replace nans with 0, and convert flags from float to int
final_encoded = final_encoded.fillna(0)
final_encoded[final_encoded.columns] = final_encoded[final_encoded.columns].astype(int)

final_encoded

输出

   City_Chicago  City_London  City_Paris  City_Rome  City_Tokyo
0             0            0           1          0           0
1             0            0           0          0           1
2             0            0           0          1           0
3             0            1           0          0           0
4             1            0           0          0           0
5             0            0           1          0           0