본문 바로가기
Data Science/Spark MLlib

스파크 MLlib + 선형회귀법, Spark MLlib + Linear Regression - (1) 기초

by 알파해커 2017. 12. 4.
반응형

0.


스파크 MLlib을 이용해서, 선형회귀(Linear regression)를 구현해보자.

우선은, 선형회귀에 대한 기본적인 이해는 되어있다는 것으로 전제한다.

만약에 안되어 있다면 이곳을 참고하자.




1.


스파크 MLlib의 디자인과 철학은 단순하다.

"모든 데이터가 RDD로 표현된 분산 데이터셋에서 다양한 알고리즘을 가져다 쓸수 있게 해주는 것"


가령, 스팸 메일 분류를 위해 MLlib을 쓴다고 하면 다음과 같은 과정이 있을 것이다.

  1. 메일 메세지를 표현하는 문자열들이 담긴 RDD를 준비한다.
  2. MLlib의 feature 추출 알고리즘들 중 하나를 써서 문자열을 수치화된 특성으로 변환한다 (머신러닝에 적합하도록). 이는 벡터들의 RDD를 되돌려 줄 것이다.
  3. 벡터의 RDD에 분류 알고리즘을 호출한다(예: 선형 회귀(linear regression)). 이는 새 점들을 분류하는 데 쓰일 모델 객체를 되돌려 준다.
  4. MLlib의 평가함수들 중 하나를 써서 테스트 데이터셋에 모델을 적용, 평가한다.


쉽게 말해서, 1. 데이터 모으고, 2. feature 추출하고, 3. 머신러닝 알고리즘 돌려보고, 4.평가 한다.

그리고 이것을 반복하는 과정이다.


그리고, 이를 파이프라인(Pipeline)이라고 부른다.

(물론 스파크에서 말하는 파이프라인 이라는 개념은 뒤에서 좀 다르게 쓰이기도 하는데, 그건 다른 포스팅에서 추후에 더 자세히 알아보도록 하고. 여기서 말하는 파이프라인은 데이터 수집에서부터 머신러닝까지 이어지는 과정을 의미하는 것이다.)


추가로,

MLlib에 대해 중요한 사항 중 하나는 클러스터에서 잘 돌아가는 병렬 알고리즘들만을 가지고 있다는 것이다. (RF(Distributed Random Forests), K-means, ALS(Alternating Least Squares) 등. 이것은 MLlib이 큰 데이터셋을 돌려보는데 적합하도록 만들어져 있다는 것을 의미하기도 한다.




2.


일단은 첫번째 단계인 데이터 수집은 되었다고 가정한다. 그럼 두번째 단계인 feature 추출에 대해서 이야기 해보자.


모든 머신러닝 알고리즘 (학습 알고리즘)은 학습 함수에 공급할 각 아이템의 특성 feature를 정의할 필요가 있다. 여기서 대부분 서적이나 자료에서 "특성" 이라는 단어와 "feature"라는 단어를 혼용해서 헷갈릴 수도 있지만, 여기서는 feature라는 말로 통일하겠다.


 feature는 어떤 결과에 대한 원인을 말하는 것이다.


더 쉽게 얘기하면 x-y 축이 있는 그래프가 있을때, x에 해당하는 것을 feature라고 할 수 있으며,


"온도가 올라가면 -> 아이스크림 판매량이 올라간다" 라는 명제에서, 원인에 해당하는 "온도"가 feature가 되는 것이다. 즉, feature는 관찰하고자하는 결과의 원인에 해당하는 모든 특징을 의미한다.


대부분의 경우, 온도-아이스크림 판매량 간의 상관관계처럼, 원인의 요소가 하나 밖에 없는 경우는 잘 없다. 보통 여러 요소들이 원인을 형성한다. 그래서 feature 벡터로 표현해서 여러 요인들이 적용될 수 있게 하는데, 그것을 feature vector라고 한다.


대단한건 아니고, [x1, x2, x3, ..., xn] 이런식으로 각 원인 요소 (x1, x2, x3, ..., xn)를 묶어서 하나의 벡터로 표현했다는 것이다.


어쨌든 우리가 해야할 일은 이 feature vector를 만들어내야 하는데, 이러한 과정을 feature extraction 이라고 부른다. 


그러면, 이제 그 feature extraction을 어떻게 할것인가?


일단은 feature가 날씨라고 해보자. 그리고 그 날씨에는 '맑음, 흐림, 비옴'이 있다고 가정해보자.

저 날씨라는 말 자체는 정량적인 것이 아니고, 대부분의 알고리즘은 수치적인 feature만을 정의하므로 저것을 수치적인 feature 값으로 변환해줘야 한다.


그 수치적인 값이 숫자 자체로 의미를 가지지 않으며, 동등한 레벨의 의미를 갖게 하기 위해서

  • 맑음: [1, 0, 0]
  • 흐림: [0, 1, 0]
  • 비옴: [0, 0, 1]
이런식으로 나타낼 수 있을 것이다. 다른 feature들도 이런 방식으로 나타낼 수 있다.
그러나, 문제는 feature를 저런식으로 일일이 만들어주기엔 너무 복잡한 상황일땐 어떻게 해야할까?

예를 들어, 스팸 메일처러 문자열을 분류한다면, 각 단어의 빈도수를 측정하여 feature를 만들텐데, 그런 일을 우리가 일일이 다 해주긴 쉽지 않을 것이다. 그래서 스파크에서는 '친절하게도' TF-IDF라는 feature extraction 기법을 제공해준다. 우리는 이것을 이용하여, feature vector를 만들 수 있다. (물론 스파크는 이것 이외에도 몇가지 기법을 더 제공한다.)




3.


데이터가 feature vector로 표현되고 나면, 대부분의 머신 러닝 알고리즘은 이 vector들에 기반해 잘 정의된 머신러닝 함수로 최적화 한다. 그리고 알고리즘이 학습을 통해 최종 결정한 것을 표현하는 모델을 (ex: 최종 선택된 기준선)을 리턴할 것이다. 


이것이 앞에서 말했던, "새 점들을 분류하는 데 쓰일 모델 객체를 되돌려 준다."에 해당하는 것인데, 이 모델은 이제 새로운 점을 예측하는데 사용될수있다. 즉, 그 모델을 이용하여 새로운 x값에 대한 y값을 예측할 수 있다.






4.


마지막으로 대부분의 학습 알고리즘은 결과에 영향을 미치는 여러 가지 인자를 받아들이므로 실제 업무 환경의 파이프라인에서는 모델의 다양한 버전을 훈련시키고 각각을 평가한다. 이를 위해서는 입력 데이터를 "훈련용"과 "테스트용"으로 구분하는 것이 일반적이며, 전자만 훈련에 사용하고 테스트 데이터는 모델이 훈련 데이터에 적합한지를 테스트하는데 쓴다.


MLlib은 모델 평가를 위한 알고리즘도 여럿 제공한다.





마치며.


이어지는 포스팅에서 각 단계에 대한 조금 더 깊은 이야기를 해보도록 하겠다.




출처.


[1] https://www.slideshare.net/JunKim22/spark-zeppelin

[2] https://www.cs.princeton.edu/courses/archive/fall08/cos436/Duda/PR_model/f_vecs.htm

[3] http://hyunje.com/data%20analysis/2015/09/09/advanced-analytics-with-spark-ch4/

[4] http://thinkingdino.tistory.com/46

[5] 러닝 스파크 (책)



반응형

댓글