[Spark] 스파크 ML 패키지
최상단 레벨에서 패키지는 세 개의 추상 클래스를 가지고 있습니다(트랜스포머, 에스티메이터, 파이프라인) 이 각각 클래스에 대해서 간단하게 설명하겠습니다.
트랜스포머(Transformer)
트랜스포머를 하이레벨 뷰 관점에서 생각해보면, 트랜스포머의 추상 클래스로부터 상속될 때 각각의 모든 트랜스포머는 transform() 함수를 구현해야 합니다. 이 함수는 변형될 데이터프레임을 첫번째 파라미터로 받습니다. 이는 필수 파라미터로, ML 패키지의 함수마다 다릅니다. 다른 중요한 파라미터로는 inputCol과 outputCol이 있고 특정 디폴트 값을 가지고 있습니다.
- Binarizer: 이 함수는 주어진 임계치를 기준으로 연속적인 변수를 이진 변수로 변환합니다.
- Bucketizer: Binarizer와 비슷하게, 이 함수는 연속적인 변수를 주어진 임계치의 리스트를 기반으로 쪼개어 몇 개의 범위로 변환합니다.
- ChiSqSelector: 이 함수는 모든 카테고리 변수들 중에서 파라미터로 주어진 numTopFeatures 개의 카테고리 변수들을 선택합니다. 여기서 선택된 변수들은 타깃의 분산을 가장 잘 나타내는 변수들입니다. 함수명에서 추측할 수 있듯이, 이는 차이-스퀘어 테스트를 통해 가능합니다. 차이-스퀘어 테스트는 두 단계를 거칩니다. 우선 이 함수가 차이-스퀘어 테스트 값을 계산할 수 있도록 데이터에 대해 fit() 함수를 수행해야 합니다. fit() 함수는 ChiSqSelectorModel 객체를 리턴하는데, 이 객체는 transform() 함수로 데이터프레임을 변형하는데 쓰입니다.
- CountVectorizer: 이 함수는 [['Learning', 'PySpark', 'with', 'us'],['us', 'us', 'us', 'us']]와 같은 분리된 텍스트에 유용합니다. 이 함수도 두 단계를 거쳐 수행됩니다. 우선 fit()을 수행해 데이터셋의 패턴을 학습하고 그 결과를 CountVectorizerModel로 변형합니다. 위의 분리된 텍스트에 대한 이 트랜스포머의 결과는 [(4, [0, 1, 2, 3], [1.0, 1.0, 1.0, 1.0]),(4, [3], [3.0])]와 같습니다.
- DCT(Discrete Cosine Transform): 이 함수는 실수로 이뤄진 벡터를 입력받고, 다른 빈도로 진동하는 같은 길이의 벡터를 리턴합니다. 이러한 트랜스포메이션은 데이터셋에서의 기본 빈도를 추출하거나 데이터를 압축할 때 유용합니다.
- ElementwiseProduct: 이 함수는 이 함수에 전달된 벡터와 scalingVec 파라미터를 곱한 것을 리턴하는 함수입니다. 예를 들어 [10.0, 3.0, 15.0]을 벡터로 전달하고 scalingVec 파라미터가 [0.99, 3.30, 0.66]이면 [9.9, 9.9, 9.9]를 리턴합니다.
- HashingTF: 이 함수는 분리된 텍스트를 리스트로 받아서 카운트 벡터를 리턴하는 해싱 트릭 트랜스포머입니다. 파이스파크 문서에 다음과 같이 적혀있습니다.
"간단한 모듈은 해시 함수를 칼럼 인덱스로 변형하는 데 쓰이기 때문에 numFeatures 파라미터를 2의 거듭제곱으로 설정하는 것을 추천한다. 그렇지 않으면 피처들이 열에 균등하게 매핑되지 않을 것이다."
- IDF(Inverse Document Frequency): 이 함수는 주어진 Document 리스트에 대한 IDF 값을 구합니다. 이때 Document는 HashingTF나 CountVectorizer를 이용해 미리 벡터로 표현돼 있어야 합니다.
- IndexToString: 이 함수는 StringIndexer 함수에 대한 보완입니다. 이 함수는 스트링 인덱스를 원본 값으로 역정렬하기 위해 StringIndexerModel 객체로부터 인코딩을 수행합니다. 이 함수는 가끔 제대로 작동하지 않기도 하고, StringIndexer로부터 값을 명시해야 한다는 것을 알아둬야 합니다.
- MaxAbsScaler: 데이터를 [-1.0, 1.0] 범위 사이로 재조정합니다.(따라서 데이터의 센터가 변하지 않는다)
- MinMaxScaler: 이는 [0.0, 1.0] 범위 사이로 재조정한다는 거을 제외하고는 MaxAbsScaler와 같습니다.
- NGram: 이는 분리된 텍스트를 입력으로 받아서 n-gram을(쌍, 트리플, 다음 n개의 단어) 리턴합니다. 예를 들어, ['good', 'morning', 'Robin', 'Williams'] 벡터에 대해 ['good morning', 'morning Robin', 'Robin Williams']를 리턴할 것입니다.
- Normalizer: 이 함수는 p-norm 값을 이용해 데이터를 단위 크기로 조정합니다(기본값으로 p를 2로 설정해 L2를 사용합니다)
- OneHotEncoder: 이 함수는 카테고리 칼럼을 이진 벡터 칼럼으로 인코딩합니다.
- PCA(principal component analysis): 이 함수는 데이터 축소를 수행합니다.
- PolynominalExpansion: 이 함수는 한 벡터에 대해 다항 확장을 수행합니다. [x, y, z]와 같은 벡터를 가지고 있을 경우, [x, x*x, y, x*y, y*y, z, x*z, y*z, z*z]를 리턴합니다.
- QuantileDiscretizer: Bucketizer 함수와 비슷하나 splits 파라미터를 전달하는 대신에 numBuckets라는 파라미터를 전달합니다. 이 함수는 대략적인 데이터의 양을 계산해 어느 정도로 나눌 것인지를 정합니다.
- RegexTokenizer: 이 함수는 정규 표현식을 이용한 스트링 분리기입니다.
- RFormula: R을 사용하는 사람들을 위한, vec ~ alpha * 3 + beta와 같은 공식을 입력으로 받는 함수입니다. 이 함수는 주어진 표현에 대해 vec 컬럼을 생성할 것입니다.
- SQLTransformer: 이전과 비슷하게 R 대신에 SQL 문법을 사용할 수도 있습니다. 데이터프레임에 접근하려면, FROM _THIS_로 데이터를 읽어들여야 합니다. 예를 들면 SELECT alpha*3 + beta AS vec FROM _THIS_와 같습니다.
- StandardScaler: 칼럼이 평균 0, 표준 편차 1인 표준 정규 분포를 갖도록 합니다.
- StopWordsRemover: 분리된 텍스트로부터 스탑 워드를 제거합니다. 스탑 워드는 'the'나 'a'와 같은 단어들입니다.
- StringIndexer: 한 컬럼에 주어진 모든 워드 리스트에 대해 이 함수는 인덱스 벡터를 생성합니다.
- Tokenizer: 이 함수는 스트링을 소문자로 변환하고 스페이스를 기준으로 분리하는 디폴트 분리 함수입니다.
- VectorAssembler: 이 함수는 여러 개의 숫자 칼럼을 벡터 형태의 한 컬럼으로 변환해주는 아주 유용한 트랜스포머입니다. 예를 들어 데이터 프레임에 다음과 같은 세 칼럼이 있는 경우를 생각해보겠습니다.
df = spark.createDataFrame( [(12, 10, 3), (1, 4, 2)], ['a', 'b', 'c'] )
이 함수의 출력은 다음과 같습니다.
ft.VectorAssembler(inputCols=['a', 'b', 'c'], outputCol='features')\ .transform(df)\ .select('features')\ .collect()
이는 다음과 같이 보일 것입니다.
Row(features=DenseVector([1.0, 4.0, 2.0]))]
- VectorIndexer: 이 함수는 카테고리 칼럼을 벡터 인덱스로 변환하는데 쓰입니다. 이는 각 칼럼마다 동작하며, 각 칼럼에서의 고유 값을 선택하고 정렬해 원래의 값이 아닌 맵으로부터 인덱스 값을 리턴합니다.
- VectorSlicer: 이 함수는 dense든 sparse든 관계없이 피처 벡터에 대해 동작합니다. 주어진 인덱스 리스트에 대해 피처 벡터의 값을 추출합니다.
- Word2Vec: 이 함수는 스트링 문장을 입력으로 취해 {스트링, 벡터} 형태로 변형합니다. 이러한 표현은 자연어 처리 분야에서 유용합니다.
에스티메이터(Estimator)
에스티메이터는 관찰된 데이터들에 대해 예측이나 분류를 수행하는 데 필요한 통계 모델이라고 할 수 있습니다. 추상 에스티메이터 클래스로부터 상속받으려면, 새로운 모델은 데이터프레임에 있는 데이터와 디폴트 또는 사용자가 제공해야 하는 파라미터를 기반으로 모델을 학습하는 fit() 함수를 구현해야 합니다.
* 분류 모델
ML 패키지는 간단한 것부터 복잡한 것까지 일곱 개의 분류 모델을 제공합니다.
- LogisticRegression: 분류 모델에 대한 벤치마크 모델입니다. 로지스틱 회귀는 데이터가 특정 클래스로 속하는 확률을 구하기 위해 로지스틱 함수를 사용합니다. 현재의 파이스파크 ML은 이진 분류만을 지원합니다.
- DecisionTreeClassifier: 관찰된 데이터에 대한 클래스를 예측하는 결정 트리 모델을 생성합니다. maxDepth 파라미터를 명시함으로써 트리가 자라나는 깊이를 제한합니다. minInstancePerNode는 추가적으로 가지가 뻗어나가기 위한 최소한의 데이터 개수입니다. maxBins 파라미터는 연속 변수들이 나눠질 bins의 최대치를 의미합니다. impurity 파라미터는 나눠지는 기준에 대한 정보이득을 계산하는 함수와 방법을 명시합니다.
- GBTClassifier: GBT(Gradient Boosted Tree) 모델입니다. 이 모델은 여러 개의 약한 모델들을 뭉쳐서 강한 모델을 만들어내는 앙상블 모델 그룹에 속해있습니다. 현재 GBTClassifier 모델은 이진 레이블, 연속 혹은 카테고리 피처들을 지원합니다.
- RandomForestClassifier: 이 모델은 여러 개의 결정 트리를 만들고(따라서 Forest), 그 결정 트리들의 결과들을 예측 값으로 사용합니다. 이 모델은 이진 혹은 다수의 레이블에 대한 예측을 지원합니다.
- NaiveBayes: 베이즈 이론에 기반해서, 이 모델은 데이터를 분류하기 위해 조건부 확률을 사용합니다. 스파크의 NaiveBayes 모델은 이진 혹은 다수의 레이블에 대한 예측을 지원합니다.
- MultilayerPerceptronClassifier: 이 분류 모델은 인간의 뇌를 따라 만든 것입니다. 인공신경망 모델에 깊게 뿌리를 둔 이 모델은 모델 내부의 파라미터를 해석하기가 쉽지 않습니다. 이 모델은 최소한 세 개의 완벽하게 연결된 인공신경망(모델 객체를 생성할 때 명시해줘야 하는 파라미터)을 가지고 있습니다. 이 인공신경망은 하나의 입력층과(데이터셋에서 피처 개수와 같은 수의 신경 수를 가져야 함) 여러 개의 은닉층(최소 한 개), 그리고 가능한 레이블 개수와 같은 수의 신경 수를 가진 출력층을 가지고 있습니다. 입력층과 은닉층에 있는 모든 신경은 시그모이드(sigmoid) 활성 함수를 사용하고, 출력층에서의 활성 함수는 소프트맥스(softmax) 함수입니다.
- OneVsRest: 여러 클래스에 대한 분류를 이진 분류로 축소합니다. 예를 들어, 여러 개의 레이블을 가지는 데이터셋의 경우, 이 모델은 여러 개의 이진 로지스틱 회귀모델을 학습할 수 있습니다. 가령 label이 2일 경우, 레이블이 2인 데이터는 모두 1로 하고 나머지는 모두 0으로 해서 로지스틱 회귀 모델을 학습할 것입니다. 그리고 모든 모델이 평가되고 가장 높은 확률을 가진 것을 고릅니다.
* 회귀 모델
파이스파크 ML 패키지에는 일곱 개의 회귀 모델이 있습니다. 분류 모델과 마찬가지로 회귀 모델 역시 기본적인 모델부터 복잡한 모델까지 여러 개가 있습니다.
- AFTSurvivalRegression: AFT(Accekerated Failure Time) 모델을 학습합니다. 이는 한 피처의 작고 미미한 효과가 기대 수명을 증가시키거나 감소시킬 수 있다는 것을 가정한 매개 변수 모델입니다. 이 모델은 단계가 잘 정의된 프로세스에 대해 아주 유용하게 적용될 수 있습니다.
- DecisionTreeRegressor: 결정 트리 분류 모델과 비슷하나 레이블이 이진 데이터가 아니라 연속적인 데이터이거나 여러 개의 레이블을 가지는 데이터입니다.
- GBTRegressor: DecisionTreeRegressor에서처럼 레이블 타입만 다릅니다.
- GeneralizedLinearRegression: 다른 커널 함수를 사용하는 선형 모델입니다. 오차의 정규화를 가정하는 선형 회구 모델과는 달리, GLM은 오차가 다른 여러 가지 분포를 나타낼 수 있음을 가정합니다. 파이스파크의 ML 패키지에서 GeneralizedLinearRegression 모델은 여러 연결 함수로 가우시안, 이진, 감마, 푸아송 분포에 대한 오차 분포를 지원합니다.
- IsotonicRegression: 감소하지 않는 자유로운 형태의 데이터에 대한 회귀 모델입니다. 모통 정렬되고 증가하는 형태의 데이터셋에 대해 유용합니다.
- LinearRegression: 가장 간단한 회귀 모델입니다. 이는 피처들 사이의 관계가 선형이고 레이블이 연속적인 값이며 오차가 정규 분포를 띈다는 것을 가정한 모델입니다.
- RandomForestRegerssor: DecisionTreRegressor나 GBRRegressor와 비슷하게 RandomFrestRegressor는 분리된 값이 아닌 연속적인 값들에 대해 학습합니다.
* 군집화 모델
군집화는 데이터셋에서 발견할 수 있는 패턴을 찾아내는 데 사용하는 비지도 학습 모델입니다. 팡이스파크 ML 패키지는 가장 유명한 네 개의 모델을 지원하고 있습니다.
- BisectingKMeans: 계층적 군집화와 K-평균 군집화 알고리즘의 조합입니다. 이 알고리즘은 모든 데이터를 하나의 군집으로 놓고 시작하며 반복적으로 k개의 군집으로 나눕니다.
- KMeans: 이 모델은 각각의 데이터와 군집 사이 거리 제곱의 합을 최소화하는 중심을 반복적으로 계산하면서 가장 최적화된 K개의 중심을 찾아가는 모델입니다.
- GaussianMixture: 이 함수는 데이터셋을 분석하기 위해 k 가우시안 분포를 알려지지 않은 파라미터와 같이 사용합니다. 가우시안 분포에 대한 파라미터는 최대로 그도우(maximize the log-likelihood)를 계산함으로써 찾을 수 있습니다.
- LDA: 이 모델은 자연어 처리에서 토픽 모델링을 하는 데 사용됩니다.
파이프라인
파이스파크 ML에서의 파이프라인은 엔드 투 엔드 변환-추정 과정에 대한 개념입니다. 이는 원본 데이터를 받아서(데이터프레임) 필요한 데이터 변형을 수행하나 후(트랜스포메이션), 최종적으로 통계 모델을(에스티메이터) 생성합니다. 파이프라인은 순수히 트랜스폼하는 기능만을 가지고 있습니다. 즉, 트랜스포머만으로 구성돼 있습니다.
파이프라인은 여러 분리된 단계에 대한 연결된 고리로 생각하면 됩니다. fit() 함수가 파이프라인 객체에서 수행될 때, 모든 단계는 states 파라미터에서 명시된 순서대로 수행됩니다. stage 파라미터는 트랜스포머와 에스티메이터 객체로 이뤄진 리스트입니다. 파이프라인 객체의 fit() 함수는 트랜스포머에 대해 transform() 함수를 수행하고 에스티메이터에 대해 fit() 함수를 수행합니다.
트랜스포머나 에스티메이터 추상 클래스로부터 상속될 때, 각각의 것들은 outputCol 파라미터의 값을 리턴하는 getOutputCol() 함수를 구현해야 합니다. outputCol 파라미터는 파이프라인 객체 생성 시 명시해야 합니다.
출처: https://12bme.tistory.com/310?category=737765 [길은 가면, 뒤에 있다.]
'Big Data > 빅데이터' 카테고리의 다른 글
[ELK] 엘라스틱서치 배우기 (0) | 2020.08.03 |
---|---|
[ELK] 키바나 5.0 배우기 (0) | 2020.08.03 |
[R] 데이터 개념 이해하기 (0) | 2020.08.03 |
[빅데이터] 검색시스템 간단 요약 (0) | 2020.08.03 |
[Spark] 데이터 모델링 준비하기 (0) | 2020.08.03 |
[Spark] 데이터프레임 (0) | 2020.08.03 |
[Spark] 스파크 RDD란? (0) | 2020.08.03 |
[Spark] 스파크 이해하기 (0) | 2020.08.03 |