我有一些数据,大约4亿行,一些特征是分类的。我应用pandas.get_dummies
进行独热编码,并且我必须使用sparse=True
选项,因为数据有点大(否则会引发异常/错误)。
result = result.drop(["time", "Ds"], 1)
result_encoded = pd.get_dummies(result, columns=["id1", "id2", "id3", "id4"], sparse=True)
然后,我得到一个包含 9000 个特征的稀疏数据帧(result_encoded)。之后,我想对数据运行岭回归。起初,我试图将dataframe.value
输入 sklearn,
train_data = result_encoded.drop(['count'].values)
但提出了错误:"阵列太大"。然后,我只是将稀疏数据帧提供给 sklearn,类似的错误消息再次出现。
train_data = result_encoded.drop(['count'])
我是否需要考虑不同的方法或数据准备,以便 sklearn 可以直接使用它?
你应该能够通过以下方式在熊猫 [1] 中使用实验性.to_coo()
方法:
result_encoded, idx_rows, idx_cols = result_encoded.stack().to_sparse().to_coo()
result_encoded = result_encoded.tocsr()
这种方法不是采用DataFrame
(行/列),而是采用MultiIndex
中行和列的Series
(这就是您需要.stack()
方法的原因)。这个MultiIndex
Series
需要是一个SparseSeries
,即使你的输入是SparseDataFrame
,.stack()
也会返回一个正Series
。因此,您需要在调用.to_coo()
之前使用 .to_sparse()
方法。
.stack()
返回的Series
,即使它不是SparseSeries
也只包含非空的元素,因此它不应该比稀疏版本占用更多的内存(至少在类型为np.float
时np.nan
)。
通常,您需要为稀疏 scipy 数组使用更有效的CSR
或CCR
格式,而不是更简单的COO
,因此您可以使用 .tocsr()
方法对其进行转换。
- http://pandas.pydata.org/pandas-docs/stable/sparse.html#interaction-with-scipy-sparse