在 Scikit Learn OneHotEncoder 中设置 sparse=True 不会减少内存使用量

数据挖掘 机器学习 Python scikit-学习 一热编码
2022-03-13 08:09:11

我有一个由 85 个特征列和 13195 行组成的数据集。其中大约 50 个特征是我使用 OneHotEncoder 编码的分类特征。我正在阅读有关稀疏数据集的这篇文章,并且很想知道在定义 OneHotEncoder 对象时更改稀疏参数的值如何减少我的数据集的内存使用量。

在将 OneHotEncoding 应用于我的数据集中的分类特征之前,我的内存使用量为 9.394 MB我通过运行以下代码发现了这一点:

    BYTES_TO_MB_DIV = 0.000001
    def print_memory_usage_of_data_frame(df):
        mem = round(df.memory_usage().sum() * BYTES_TO_MB_DIV, 3) 
        print("Memory usage is " + str(mem) + " MB")
        
    print_memory_usage_of_data_frame(dataset)

设置 OneHotEncoder 备用 = True:

    from sklearn.compose import ColumnTransformer
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.impute import SimpleImputer
    from sklearn.pipeline import Pipeline
    
    
    numeric_transformer = Pipeline(steps=[
        ('knnImputer', KNNImputer(n_neighbors=2, weights="uniform")),
        ('scaler', StandardScaler())])
    
    categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
        ('onehot', OneHotEncoder(handle_unknown='ignore', sparse=True))])
    
    preprocessor = ColumnTransformer(transformers=[
        ('num', numeric_transformer, selector(dtype_exclude="object")),
        ('cat', categorical_transformer, selector(dtype_include="object"))
    ])
    
      
    Z = pd.DataFrame(preprocessor.fit_transform(X))
    print_memory_usage_of_data_frame(Z)

内存使用量为 25.755 MB

然后运行上面相同的代码,但像这样设置备用=假:

    OneHotEncoder(handle_unknown='ignore', sparse=False)

内存使用量为 25.755 MB

根据链接文章,它在 pandas get_dummies 中使用了 sparse 选项,这应该会导致内存存储减少,这对于 Scikit Learn 的 OneHotEncoder 不一样吗?

1个回答

根据@BenReiniger 的评论,我从 ColumnTransformer 中删除了数字部分并运行了以下代码:


    from sklearn.compose import ColumnTransformer
    from sklearn.preprocessing import OneHotEncoder
    from sklearn.impute import SimpleImputer
    from sklearn.pipeline import Pipeline
    
    
    categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
        ('onehot', OneHotEncoder(handle_unknown='ignore', sparse=True))])
    
    preprocessor = ColumnTransformer(transformers=[
        ('cat', categorical_transformer, selector(dtype_include="object"))
    ])
    
      
    X = pd.DataFrame(preprocessor.fit_transform(X))
    
    print_memory_usage_of_data_frame(X)

结果是内存使用量为 0.106 MB

运行上面相同的代码,但将 sparse 选项设置为 False:

    OneHotEncoder(handle_unknown='ignore', sparse=False) 

导致内存使用量为 20.688 MB

所以很明显,改变 OneHotEncoder 中的 sparse 参数确实会减少内存使用。