【问题标题】:Scikit-learn labelencoder: how to preserve mappings between batches?Scikit-learn labelencoder:如何保留批次之间的映射?
【发布时间】:2017-10-13 17:32:47
【问题描述】:

我有 1.85 亿个样本,每个样本大约 3.8 MB。为了准备我的数据集,我需要对许多特征进行一次热编码,然后最终得到超过 15,000 个特征。

但是我需要分批准备数据集,因为当一次热编码仅使用 300 万个样本时,仅针对特征的内存占用就超过 100 GB。

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

假设我无法一次确定我的 1.85 亿城市列的级别,因为它不适合 RAM,我该怎么办? 如果我将相同的 Labelencoder 实例应用于不同的批次,映射会保持不变吗? 在此之后,我还需要批量使用 scikitlearn 或 Keras 的 np_utilities_to_categorical 的一种热编码。所以同样的问题:如何基本上批量使用这三种方法或一次将它们应用于存储在磁盘上的文件格式?

【问题讨论】:

    标签: python-2.7 scikit-learn


    【解决方案1】:

    我建议使用Pandas的@​​987654321@,因为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
    

    【讨论】:

    • get_dummies 和 one-hot 编码是一回事吗?我读过相互矛盾的答案。我认为它们是一回事,但只是想确定一下。
    • 是的,one-hot-encoding 是将分类变量转换为虚拟变量的稀疏矩阵。 Scikit-learn 使用实现 fit() 和 predict() 的转换器以 scikit-learn 的方式执行此操作,pandas 有 get_dummies()
    猜你喜欢
    • 2019-06-28
    • 2016-11-24
    • 2018-08-02
    • 2019-04-30
    • 2017-01-22
    • 2019-07-03
    • 2021-05-28
    • 2015-07-09
    • 2017-09-18
    相关资源
    最近更新 更多