Amazon SageMaker kMeans 不会将稀疏矩阵 (csr_matrix) 作为输入,在使用密集矩阵之前还有其他选择吗?

Amazon SageMaker kMeans won't take sparse matrix (csr_matrix) as input, any alternatives before using a dense matrix?

我想将 sagemaker 的 kMeans 算法应用于稀疏矩阵,该矩阵是使用 sklearn 库中的 TfidfVectorizer 获得的。

理想情况下,我想将输入数据作为稀疏矩阵 scipy.sparse.csr.csr_matrix 提供给 Sagemaker 的 kMeans 实现,但是当我这样做时 (kmeans.fit(kmeans.record_set(train_data))) 我收到以下错误:

TypeError: must be real number, not csr_matrix

当然,如果我传递一个密集矩阵,该算法将起作用 (train_data.toarray()),但它需要的内存量是巨大的。在我开始使用超大型亚马逊实例之前,还有其他可能的选择吗?

密钥在 SageMaker python SDK 中。在那里你可以找到一个将 scipy 稀疏矩阵转换为稀疏张量 (write_spmatrix_to_sparse_tensor) 的函数。

解决问题的完整代码如下:

from sagemaker.amazon.common import write_spmatrix_to_sparse_tensor

tfidf_matrix = tfidf_vectorizer.fit_transform('your_train_data') # output: sparse scipy matrix
sagemaker_bucket = 'your-bucket' 
data_key = 'kmeans_lowlevel/data'
data_location = f"s3://{sagemaker_bucket}/{data_key}"
buf = io.BytesIO()
write_spmatrix_to_sparse_tensor(buf, tfidf_matrix)
buf.seek(0)
boto3.resource('s3').Bucket(sagemaker_bucket).Object(data_key).upload_fileobj(buf)

执行此操作后,在 create_training_params 配置中,您必须向 S3Uri 字段提供您提供的用于在 S3 中存储稀疏矩阵的数据位置:

create_training_params = \
{
    ... # all other params

    "InputDataConfig": [
        {
            "ChannelName": "train",
            "DataSource": {
                "S3DataSource": {
                    "S3DataType": "S3Prefix",
                    "S3Uri": data_location, # YOUR_DATA_LOCATION_GOES_HERE
                    "S3DataDistributionType": "FullyReplicated"
                }
            },
            "CompressionType": "None",
            "RecordWrapperType": "None"
        }
    ]
}