稀疏的含义=使用OneHotEncoder对数据进行错误预处理



我发现了使用OneHotEncoder设置sparse=False预处理数据的含义。我做到了:

ct = ColumnTransformer([
("scaling", StandardScaler(), sca_col), #sca_col containing 3 columns
("onehot", OneHotEncoder(sparse=False, handle_unknown='ignore'), ohe_col)]) #ohe_col containing 15 columns

然后我用训练我的模型

feat = df.drop("label", axis=1)
X_train, X_test, y_train, y_test = train_test_split(feat, df.label, random_state=0)
ct.fit(X_train)

我得到错误

[...]
MemoryError: Unable to allocate 151. GiB for an array with shape (239076, 84497) and data type float64

根据我的数据和列使用正确的形状,但显然不适合我的RAM。

如果我设置sparse=True,这是默认的,它可以工作。

在哪种情况下,你需要设置sparse=False,我几周前出于没有明显原因而这样做了?

通过设置此标志,您可以选择以稀疏格式表示数据。当您有一个大多数元素为零的数组时,这样可以节省大量内存。

从Scikit学习ColumTransformer文档:

sparse_thresholdfloat,默认值=0.3

如果不同transformer包含稀疏矩阵,这些矩阵将作为稀疏矩阵,如果总密度低于该值。使用spare_threshold=0以始终返回稠密。当变换后的输出由所有密集的数据组成,叠加的结果将是密集的,并且关键字将被忽略。

是否使用稀疏矩阵取决于矩阵的稀疏性,即值为零的百分比。在你的情况下,如果使用稀疏矩阵解决了你的内存限制,那么这就是你的选择。如果你的矩阵不够稀疏,如果使用为稀疏矩阵设计的算法,你就不会在节省内存或提高计算速度方面有任何好处。

在哪种情况下需要设置sparse=False。。。?

有些算法并不是为了在稀疏矩阵上操作而编写的,因此,尽管需要额外使用内存,但还是需要强制OneHotEncoder生成密集输出。(最近的例子请参阅这个问题。(查看密集矩阵的输出也更容易。

如果您的矩阵是say<64KB列/行,则可以使用非常快速BLAS例程,该例程使用超高度优化的低级c和/或fortran矩阵基元的组合。需要相当高的稀疏度来";追赶";到在密集矩阵计算中使用这些库的速度。

最新更新