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"
}
]
}
我想将 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"
}
]
}