BLOG
이번 블로그 게시물에서는 고차원 데이터세트에 Amazon SageMaker, Spark ML 및 Scikit-Learn를 사용하여 PCA에 대한 성능 비교를 할 것입니다. SageMaker는 지속적으로 더 빠른 계산 성능을 보여 주었습니다. 속도 개선을 확인하려면 하단의 그림 (1) 및 (2)를 참조하세요.
주성분 분석
주성분 분석 (Principal Component Analysis, PCA)은 가능한 한 많은 정보를 유지하면서 데이터세트 내의 차원성 (예 :기능의 갯수)를 줄이려고 시도하는 자율 학습 알고리즘입니다. PCA는 데이터 행렬을 직교 공간으로 선형 변환합니다. 여기에서 열은 서로 독립적이며 각 열은 데이터에서 알려진 비율의 분산을 설명 할 수 있습니다. 즉, 구성 요소라는 새로운 기능 집합을 찾습니다. 구성 요소는 원래 기능의 합성물이므로 서로 관련성이 없습니다. 또한 첫 번째 구성 요소는 데이터의 가능한 최대 변동성, 두 번째 구성 요소는 두 번째로 큰 변동성 등을 고려하여 제한됩니다.
보다 포괄적인 설명은 https://docs.aws.amazon.com/sagemaker/latest/dg/how-pca-works.html 을 참조하십시오.
PCA는 탐색 데이터 분석(EDA)를 위한 도구와 기계 학습 (ML)을 위한 알고리즘 모두로서 강력한 툴입니다. EDA의 경우, PCA는 차원 문제를 줄이고 데이터 문제의 다중 공선 성을 줄이는 데 최적입니다. ML 방법론으로, PCA는 비정상 탐지 (예 : 네트워크의 트래픽 식별), 견고한 예측 (예 : 양적 재정) 및 분류 (예 : 크레딧 득점)의 효과를 향상시키기 위해 다른 ML 방법과 결합합니다.
기술 발전으로 인해 데이터 수집 능력이 향상되어 더 큰 크기의 데이터 집합과 세분화된 디테일한 수준의 데이터 집합으로 이어졌습니다. PCA는 대용량 데이터 분석을 위해 아주 유용한 ML 도구입니다. 그러나 PCA는 쉽게 병렬화 할 수 없으며 Amazon SageMaker가 대용량 데이터 응용 프로그램에서 실제로 사용할 수 있을 만큼 확장되지 않았습니다.
이 블로그 게시물에서는 Amazon SageMaker PCA 기능의 속도와 확장성을 보여줍니다. 크기가 커지는 행렬에 대해서는 Spark ML 및 Scikit-Learn의 PCA 기능과 비교하여 Amazon SageMaker PCA 런타임을 측정합니다.
Amazon SageMaker
Amazon SageMaker는 AWS의 완전 관리형 플랫폼으로, 개발자 및 데이터 과학자가 모든 규모의 기계 학습 모델을 빠르고 쉽게 구축, 교육 및 배포 할 수 있습니다. Amazon SageMaker는 일반적으로 기계 학습을 사용하려는 개발자의 속도를 저해하는 장벽을 제거합니다. Amazon SageMaker에는 선형 학습자, k-means, DeepAR, PCA 등의 내장 알고리즘이 있습니다.
데이터세트
Amazon SageMaker PCA의 확장성을 입증하기 위해 대규모의 실제 데이터 세트를 선택했으며 심지어 더 큰 데이터 세트도 실제 데이터 세트로서의 관측치 수의 4배, 기능의 2배까지 시뮬레이션했습니다.
실제 데이터 세트: NIPS Bag of Words
이 데이터 세트는 1987 년부터 2015 년까지 출판된 NIPS 회의 논문의 전체 텍스트에서 단어 수의 11,463 x 5,812 행렬 형태로 분포되어있습니다 [Perrone et al., 2016]. 각 열은 해당 NIPS 논문을 나타내며 그 논문에 11,463 단어가 각각 나타난 횟수를 포함합니다. 열의 이름은 PublicationYear_PaperID 형식으로 해당 NIPS 문서를 식별하며 총 5,812 개의 문서를 나타냅니다. 이 데이터 세트는 https://archive.ics.uci.edu/ml/datasets/NIPS+Conference+Papers+1987-2015# 에서 공개적으로 사용할 수 있습니다.
예를 들어, 이러한 데이터 세트에 대한 분석을 통해 어떤 키워드가 게시 가능성을 높이거나 더 많은 인용 횟수로 이어질지에 대한 통찰력을 얻을 수 있습니다.
시뮬레이션 된 데이터 세트
시뮬레이션 된 데이터 세트는 20k 관측으로 구성되며 각각 5k, 10k, 15k 및 20k 특징으로 구성됩니다.
코드 : Amazon SageMaker를 사용한 PCA 구현
Conda MXNet 커널과 함께 ml.m4.xlarge SageMaker 노트북 인스턴스를 만들었습니다. 구현의 재현성을 위해 각 단계에 해당하는 코드의 행 번호가 포함됩니다. 우리의 코드는 여기에서 다운로드 할 수 있는 자체 포함 작업 Sage-Maker 노트북입니다.
NIPS 데이터 세트를 다운로드 하십시오. 우리는 행렬을 변환하여 열이 단어를 나타내고 행이 문서를 나타냅니다. 결과적으로 5812 x 11463 행렬이 생성됩니다. 인덱스, 즉 문서 ID의 문자열이 불필요한 열로 포함되지 않았는지 확인하세요. 매트릭스를 바이너리 스트림 파일 객체로 처리합니다.
# Download NIPS data set and transpose matrix.
import sys
!wget https://archive.ics.uci.edu/ml/machine-learning-databases/00371/NIPS_1987-2015.csv
filename = ‘NIPS_1987-2015.csv’
import pandas as pd
data = pd.read_csv(‘NIPS_1987-2015.csv’, index_col=0)
# Convert data to binary stream.
matrx = data.transpose().apply(lambda x: (x-x.mean())/x.std()).as_matrix()
import io
import sagemaker.amazon.common as smac
buf = io.BytesIO()
smac.write_numpy_to_dense_tensor(buf, matrx)
buf.seek(0)
이제 Amazon S3 버킷에 파일 객체를 업로드 할 준비가 되었습니다. 업로드 된 행렬이 상주할 곳과 Amazon SageMaker가 출력을 작성하는 곳 중 하나에 두 경로를 지정합니다. Amazon SageMaker는 이미 존재하지 않는 경로 내에 폴더를 생성할 것입니다.
# Specify S3 file paths for training data and for output location. Upload data to S3.
import boto3
bucket = ‘<your-bucket-name>’
prefix = ‘sagemaker/pca-nips’
key = ‘NIPS-bytes-data’
import os
s3_train_data = ‘s3://{}/{}/train/{}’.format(bucket, prefix, key)
boto3.resource(‘s3’).Bucket(bucket).Object(os.path.join(prefix, ‘train’, key)).upload_fileobj(buf)
print(‘uploaded training data location: {}’.format(s3_train_data))
output_location = ‘s3://{}/{}/output’.format(bucket, prefix)
print(‘training artifacts will be uploaded to: {}’.format(output_location))
Amazon SageMaker의 PCA 세션을 인스턴스화하려면 여섯 가지 사항이 필요합니다. 첫 번째는 SageMaker 노트북이 있는 지역에 해당하는 컨테이너 주소입니다. 예 : us-east-1에는 컨테이너 382416733822.dkr.ecr.us-east-1.amazonaws.com/pca:latest가 있습니다. 두 번째는 Amazon SageMaker IAM 역할이며 노트북의 생성과 함께 작성되었습니다. 세 번째와 네 번째 인수의 경우 train_instance_type ml.c4.8xlarge의 train_instance_count를 PCA를 실행하는 가상 환경으로 지정합니다. 실제로 ml.p2.xlarge 또는 ml.p3.xlarge와 같은 GPU 시스템을 권장합니다. 예를 들어 ml.p2.xlarge가 ml.c4.8xlarge보다 저렴하고 더 짧은 시간에 작업을 마칠 수 있기 때문입니다. 여기서 우리는 많은 수의 코어와 높은 메모리에 대해 ml.c4.8xlarge 인스턴스를 선택했으며 공정성을 위해 실험 전반에 걸쳐 이 동일한 머신 유형을 사용합니다. 다섯 번째 인수는 앞서 출력을 작성하기 위해 정의한 경로입니다. 마지막으로 Amazon SageMaker 세션을 통과하십시오.
# Lookup container address per AWS region.
containers = {‘us-west-2’: ‘174872318107.dkr.ecr.us-west-2.amazonaws.com/pca:latest’,
‘us-east-1’: ‘382416733822.dkr.ecr.us-east-1.amazonaws.com/pca:latest’,
‘us-east-2’: ‘404615174143.dkr.ecr.us-east-2.amazonaws.com/pca:latest’,
‘eu-west-1’: ‘438346466558.dkr.ecr.eu-west-1.amazonaws.com/pca:latest’}
# Get SageMaker IAM execution role.
from sagemaker import get_execution_role
role = get_execution_role()
# Create SageMaker session.
import sagemaker
sess = sagemaker.Session()
# Instantiate SageMaker PCA with six arguments.
pca = sagemaker.estimator.Estimator(containers[boto3.Session().region_name],
role,
train_instance_count=2,
train_instance_type=’ml.c4.8xlarge’,
output_path=output_location,
sagemaker_session=sess)
지금까지 Amazon SageMaker 교육 인스턴스 매개 변수를 지정했습니다. 우리는 여전히 PCA 알고리즘에 하이퍼-파라미터를 지정하려고 합니다. 하이퍼-파라미터는 기능의 수, 반환할 주성분의 수, 행렬 분해 이전의 각 열의 평균을 감산하는 부울 (Boolean), ‘일반’또는 ‘무작위’ PCA를 수행할지 여부, 그리고 마지막으로, 배치 크기 등을 말합니다.
# Specify PCA hyper-parameters
import numpy as np
pca.set_hyperparameters(feature_dim=np.shape(matrx)[1],
num_components= np.shape(matrx)[1]-1,
subtract_mean=True,
algorithm_mode=’regular’,
mini_batch_size=200)
이제 우리는 입력으로 통과된 Amazon S3 데이터 경로를 사용하여 PCA 피팅을 시작하면 됩니다. Amazon SageMaker는 각 작업에 대한 로그 파일을 다음 형식의 S3 위치에 씁니다.
https://console.aws.amazon.com/cloudwatch/home?region=<region> #logEventViewer:group=/aws/sagemaker/TrainingJobs;stream=<algo-YYYY-MM-DD-hh-mm-ss-SSS>/algo-<int>-<timestamp>
로그는 인스턴스가 회전하는 데 걸리는 시간과 PCA가 걸리는 시간을 식별합니다. 사내 구축형 시스템을 사용하는 경우와 달리, 프로비저닝 시간이 아닌 소비를 위해서만 지불하면 됩니다. 지정된 인스턴스가 프로비저닝되기까지 약 7 분이 걸렸습니다. 인스턴스가 준비되면 PCA가 적합해지고 출력이 압축된 tar 파일로 지정된 S3 위치에 기록됩니다.
# Kick-off PCA fitting.
import time
pca.fit({‘train’: s3_train_data})
타르(tarred)된 출력을 다운로드하십시오. 그 내용은 MXNet ndarray로 읽을 수 있습니다. ndarray는 세 가지 속성을 가지고 있습니다: 평균, 열 수단의 배열; s, 특이 값의 ndarray; 및 v는 주성분 벡터의 ndarray입니다.
# Download and unpack returned PCA model artifact.
job_name = pca.latest_training_job.name
os.system(‘aws s3 cp {}/{}/output/model.tar.gz ./’.format(output_location, job_name))
!tar xzvf model.tar.gz
import mxnet as mx
pca_model = mx.ndarray.load(‘model_algo-1’)
mean = pca_model[‘mean’]
singular_values = np.sort(pca_model[‘s’].asnumpy())[::-1]
pc_vectors = pca_model[‘v’]
다른 도구에 대한 성능 평가: SparkML 및 Scikit-Learn
Spark ML과 Scikit-Learn는 현재 대규모 PCA를 다루기 위해 시도하고 있는 상위 2 개의 오픈 소스 라이브러리입니다.
Spark은 일반적인 통계 알고리즘을 갖춘 분산형 기계 학습 라이브러리가 있는 클러스터 컴퓨팅 프레임워크이며 디스크 기반 구현보다 9 배 빠른 속도로 벤치 마크되었습니다 [Rocha et al., 2017]. Scikit-Learn는 Python 프로그래밍 언어용으로 개발된 기계 학습 라이브러리입니다. 처음에는 단일 기계용으로 설계되었지만 PCA의 특정 구현이 병렬화되었습니다 [Pedregosa et al., 2011].
실제 환경의 NIPS 데이터와 시뮬레이트된 데이터 모두에서 각 환경에 대해 동일한 c4.8xlarge 인스턴스를 생성하고 규모 증가를 위한 PCA 런타임을 기록하기 시작했습니다.
결과
그림 1은 최대 1000 개 기능의 행렬에 대해 Spark ML이 Amazon SageMaker보다 약 90 배 더 느리게 PCA를 수행함을 보여줍니다. 5000 개 이상의 기능인 Spark ML은 시간이 많이 소요되므로 이 블로그 게시물의 고차원 비교에서 제외되었습니다.
Table1: PCA 테스트 케이스별 매트릭스 규모
NIPS data: 5811 observations | Simulated data: 20k observations |
First 50 features | 5k features |
First 100 features | 10k features |
First 500 features | 15k features |
First 1k features | 20k features |
First 5k features | |
First 10k features | |
All 11463 features |
저차원 행렬의 경우 Scikit-Learn의 PCA 성능은 Amazon SageMaker의 성능과 유사합니다. 그림 1은 SageMaker가 5000개 형상 행렬에 근접할 때만 Scikit-Learn에 비해 5 배의 이점을 볼 수 있다는 것을 보여줍니다. 그러나 Scikit-Learn은 정사각형이 아닌 행렬에 대해 완전한 PCA를 수행하지 않는다는 점을 유의해야합니다. Scikit-Learn이 반환하는 구성 요소의 최대 수는 min (num_observations; num_features)과 같습니다. 즉, Scikit-Learn은 num_observations가 num_features를 초과하면 남아있는 관측치를 삭제합니다. 따라서 여기에서 보여지는 런타임은 잘린 작은 크기의 행렬에 대한 것입니다.
분석 응용 프로그램에서 Scikit-Learn의 유용성을 제한하는 것 외에도 동시에 시간 판단을 수행하는 능력을 제한합니다. 기능 특징이 샘플 크기를 결코 초과하지 않는 시뮬레이션 데이터 세트로 전환합니다. 그림 2는 Amazon SageMaker PCA가 Scikit-Learn보다 약 5 배 빠릅니다.
그림 1: Amazon SageMaker가 Spark에 대비해 90배의 성능을 제공합니다.
그림 2:Amazon SageMaker는 Scikit-Learn보다 5배 더 뛰어난 성능을 제공합니다.
결론
PCA는 데이터 시각화 및 데이터 무의미화를 위해 저차원 문제들에 있어서 항상 중요한 부분이었습니다. 그러나 현실 세계의 문제가 점차 대형 데이터 세트를 다루고 있으므로 고차원 문제에 대한 확장 가능한 PCA가 그 어느 때보다 중요합니다. 이 블로그 게시물에서는 Amazon SageMaker가 PCA를위한 가장 확장성있는 프레임 워크를 구현할 때 얻는 이점을 보여주었습니다.
여기에 표시된 코드는 완전히 독립적입니다. 시작하려면 SageMaker 노트북을 열고 여기에 나온 NIPS 결과를 복제하기 위해 코드 블록을 복사하여 붙여 넣으십시오. 또는 코드 블록이 미리 채워진 상태로 이 노트북을 다운로드하십시오. 이 서버리스 도구는 기본 플랫폼 및 컴퓨팅 프레임 워크를 처리합니다. 요청된 구성 요소 수를 시험해보고 Amazon SageMaker의 확장성을 확인하십시오. 다양한 관측과 기능을 사용하여 데이터 세트에서 코드를 시험해 볼 수도 있습니다.
원문 URL: https://aws.amazon.com/ko/blogs/machine-learning/perform-a-large-scale-principal-component-analysis-faster-using-amazon-sagemaker/
** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.