我有一些数据,大约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直接使用它?
答案 0 :(得分:2)
您应该能够以下列方式在pandas [1]中使用实验.to_coo()
方法:
result_encoded, idx_rows, idx_cols = result_encoded.stack().to_sparse().to_coo()
result_encoded = result_encoded.tocsr()
此方法不是采用DataFrame
(行/列),而是在Series
中使用MultiIndex
行和列(这就是为什么需要.stack()
} 方法)。这个Series
MultiIndex
需要SparseSeries
,即使您的输入为SparseDataFrame
,.stack()
也会返回常规Series
。因此,您需要在调用.to_sparse()
之前使用.to_coo()
方法。
Series
返回的.stack()
,即使它不是SparseSeries
,也只包含非空的元素,因此它不应占用更多内存比稀疏版本(当类型为np.nan
时至少为np.float
)。
一般情况下,您希望为稀疏的scipy数组提供更高效的CSR
或CCR
格式,而不是更简单的COO
,因此您可以将其转换为.tocsr()
方法。