Machine learning workflow
machine learning workflow
- 머신러닝 알고리즘을 이용하여 문제를 해결하는 방법론 또는 머신러닝 프로젝트 수행 방법
- 분석 문제 정의 -> 데이터 수집 -> 탐색적 데이터 분석(EDA) -> 피처 엔지니어링 -> 예측 모델 개발 -> 서비스 적용 순서로 진행된다.
- 머신러닝 기술을 사용하는 것을 전제로 하기 때문에, 각 모듈별로 머신러닝을 이용하여 문제를 해결하는 것에 초첨이 맞춰져 있다.
- 모듈 1이 제일 중요하다. = 문제 정의가 제대로 되어있지 않으면 모듈들은 아무 의미가 없다
- 특히 분석 데이터 정의와 머신러닝 문제 정의가 중요하다
분석 문제 정의
- 어떤 문제를 머신러닝 방법론을 이용해서 해결할 것이냐! 머신러닝 방법론을 기준으로 문제를 정의하는 것
이슈 파악 및 문제 도출
- 문제 이해를 위해 예시를 하나 정의합니다.
- 우리는 식물학자입니다.
- Iris(붓꽃)의 생테계에 대해 연구를 해보려고 합니다
- 조사를 한 결과 Iris는 3개의 종(setosa, versicolor, virginica)이 있다는 것을 확인
- 우리는 Iris DB를 구축하려고 합니다
- 이 DB에는 후대에 Iris를 연구하는 연구자들을 위해 Iris data를 입력하면 어떤 종(species)인지 알려주는 프로그램을 작성하려고 함
분석 데이터 정의
- 우리는 이 3개의 종에 대한 특징을 기록(저장)하고 싶습니다.
- 어떤 정보들이 필요할까요?
- 꽃잎의 모양
- 꽃받침
- 줄기 모양
- 뿌리 모양
- 수명
- 어떤 종인지! (target value, label) -> y (=> 제일 중요)
머신러닝 문제 정의
- 정의한 특징들을 기반으로 Iris 데이터를 종별로 나누려고 합니다.
- 어떤 머신러닝 작업(task)들이 있을까
- 분류 : 데이터를 비슷한 부류로 나누는 방법 => 데이터가 어떤 부류로 나뉘는지 이미 알고있는 경우에 사용
- 회귀 : 데이터의 특정 값을 예측하는 방법 => 데이터의 값을 이미 알고 있는 경우에 사용
- 클러스터링 : 데이터를 비슷한 부류로 나누는 방법 => 데이터가 어떤 부류로 나뉘는지 몰라도 사용 가능
- 추천 : 어떤 User에게 어떤 Item을 제안하는 방법 => 주요 과거 이용 기록, 유저의 특징, 아이템의 특징 사용
- 랭킹 : 주어진 평가 기준에 따라 순위를 매기는 방법
- 이 중에서 어떤 task가 우리가 하려는 일에 해당할까
- 둘 중에 어떤 방법이 더 좋을까?
베이스라인 (baseline)선정 -> 기존 사례 조사
- 우리가 하려는 일을 과거에 한 사례가 있다면, 참고한다.
- Linear discriminant Analysis(LDA)를 기준 방법으로 사용해보면 좋을것 같다
데이터 수집
- 정의한 데이터를 실제로 가져와서 Data Mart를 구축하는 작업
- 분석 데이터 정의에 맞는 데이터를 직접 가져옵니다. (수집) -> 직접 수집을 해야하는 경우라면, Web Crawling을 사용
- 데이터가 Data Warehouse에 없는 경우라면, Data Engineer에게 요청을 합니다.
- 어떤 데이터를 가져오느냐에 따라 분석 결과의 품질이 결정됩니다. -> Data Quality
- 정의한 데이터는 실제 저장되어 있는 데이터와 1:1 매칭이 되지 않을 수 있습니다. -> 데이터 정합성 평가
- 다양한 source에 있는 데이터를 가져와서 합쳐야할 수도 있습니다.
- 모든 작업이 끝나면 정의한 분석 도구에 맞게 포멧을 변경해줍니다.
데이터 마트 생성
- 이미 Data Warehouse에 정의가 되어있다면, SQL(이나 다른 BI 솔류션)
- 여러 source들에 있다고 하면, 필요하다고 생각되는 데이터들을 일단 모두 가져옵니다.
- 이 데이터가 원하는 형태로 합쳐지는지 테스트하는 것을 "데이터 정합성 평가"라고 합니다.
- 분석에 필요한 데이터가 어느 기간에 수집된 데이터인지, 어떤 기관에서 수집한 데이터인지, 정의한 특징을 모두 포함하고 있는지를 확인합니다(sanity check)
- Iris dataset으로 Data Mart를 만드려면?
- 만약에, DB에 데이터가 없다면? -> 직접 수집.(나가서 채집, 웹에 있다면 크롤링, .,..)
- 만약에, DB에 데이터가 있다면 -> 앞에서 정의한 특징들이 포함되어 있는지 확인하고, 해당 데이터셋을 가져옵니다.
데이터 적합성 평가
- 데이터를 합칠 때 생기는 이슈들을 체크하는 과정
- 아래 예시를 보고, 이 두 개의 테이블을 합친다면(JOIN operation) 어떤 것들을 체크해야 할까요?
- user_id, time column이 존재하는가 -> O
- row가 정의된 단위(unit)이 일치하는가 -> X : time unit이 다르다 -> 초 단위를 시간(hour) 단위로 합쳐줍니다.
데이터 취합
- 정합성 평가를 통과했다면, 원하는 데이터를 합칩니다.
- JOIN 연산의 결과가 처음 생각했던 것과 맞는지 체크합니다. (sanity check)
데이터 포맷 통일
- 취합한 결과가 table(in DBMS)인데, 분석할 때는 csv file이 필요한 경우에는 변경해줍니다.
- 분석 도구의 input type을 보고 결정합니다.
EDA
- 데이터에서 분석에 필요한 여러가지 통계량을 계산하고, 시각화를 통해서 확인하는 작업
- 탐색적 데이터 분석(Exploratort Data Analysis, EDA)은 데이터와 친해지는 과정
- 분석을 하면서 데이터에서 확인하고 싶은 정보들을 확인하는 과정입니다.
- 정답처럼 규칙처럼 정해진 프로세스가 따로 업소, 분석가들마다 방법론이 조금씩 다릅니다.
- 어떤 데이터를 사용하느냐에 따라서 다양한 방법론이 존재합니다
- 데이터에 대해서 많이 알수록, EDA도 잘할 수 있습니다. (domain knowledge)
- 나만의 EDA process를 만들 수록, Data Scientist로서의 역량이 갖추어 진다고 할 수 있습니다.
데이터 크기 확인
- 주어진 Iris dataset의 크기는 150rows, 6columns 입니다.
- pandas를 기준으로 메모리 사용량은 대략 7.2KB입니다.
데이터 분포 확인
- target distribution
- Petal Length VS petal Width
- Feature Histogram
데이터 시각화
통계량 분석
피처 엔지니어링
- 분석에 사용할 데이터를 feature vector로 가공하는 작업, 머신러닝 모델 성능에 직접적인 영향을 준다.
- 데이터 마트까지 구성된 데이터를 imput vector라고 부릅니다. (row 단위, 정형화된 수치들)
- 이 input vector를 머신러닝 모델에 사용할 feature vecotr로 바꾸는 작업이 feature engineering입니다.
- feature vector란 input vector에서 머신러닝 모델이 봐야할 특징(feature)을 정의한 수치값들입니다.
- feature engineering에 따라 머신러닝 모델의 성능이 굉장히 크게 변할 수 있습니다.
- feature engineering을 할 때 체크해야하는 사항들을 중점적으로 확인을 해야합니다.
- feature vector가 표현되는 공간을 feature space라고 합니다.
차원의 저주
- 차원의 저주 문제는 머신러닝 모델이 고차원 공간에서 데이터의 패턴을 잘 파악하지 못하는 문제를 말합니다.
- feature space의 차원이 큰 경우, 거리 함수가 제대로 작동하지 않는 문제가 발생합니다.
- 공간이 sparse해짐에 따라, 저차원 데이터에서 패턴을 파악하는 것보다 고차원 데이터에서 패턴을 파악하는데 기하급수적으로 더 많은 데이터가 필요합니다.
상관관계 분석
- feature들간의 연관성을 파악하거나, target value와 feature들간의 연관성을 파악하는 것을 말한다.
- 상관계수 p는 -1과 1 사이의 값으로 정의되며, 음수인 경우에 "음의 상관관계"를 양수인 경우에 "양의 상관관계"를 가진다고 말합니다.
- 그림을 보면 +1일 때는 완벽한 양의 선형관계를 의미하고, -1일 때는 완벽한 음의 선형관계를 말합니다.
- 피어슨 상관계수는 두 변수 사이의 선형성(linearity)을 나타내는 지표입니다.
피처 추출
- input vector의 feature들이 서로 상관성이 강하거나 (이런 경우를 다중공선성(multi-collinearity)을 가진다고 한다) feature가 너무 많아서 고차원이 된 경우엔 feature를 줄일 필요가 있습니다.
- 그냥 줄일 수는 없고, 유의미한 feature를 만들어야 하는데 이 때 사용되는 기법들을 feature extraction method라고 합니다
- 대표적인 기법으로 PCA(Principal Component Analysis), AutoEncoder 등이 있다
- 요즘에는 딥러닝 기법들을 사용하여 임베딩(Embedding) 기법을 사용하기도 한다.
- 딥러닝 모델이 머신러닝 모델보다 성능이 좋은 경우가 임베딩 성능이 좋아서이기도 하다.
범주형 피처 인코딩
- input vector에는 수치형 데이터(numeric feature)말고도 종류를 나타내는 범주형 데이터(categorical feature)도 있다
- 이러한 categorical feature들은 대부분 문자열(string) 형태로 표현되어 있다.
- 문자열로 구성된 categorical feature들을 수치값으로 바꾸어야 feature vector로 표현이 가능하다.
- One-hot encoding 말고도 ordinal encoding, Mean encoding, hashing 등의 다른 기법들이 있다.
- 원본 데이터의 category가 어떤 의미를 가지고 있느냐에 따라 표현하는 방법을 선택할 수 있다
머신러닝 모델링
- 주어진 학습 데이터로 얻은 정보로 학습하지 않은 데이터에 대해서 예측할 수 있는 시스템
- 머신러닝 모델링 과정에서 feature vector를 이용하여 학습을 진행한다
- 학습(learning)의 과정은 모델마다 달라진다.
- 문제 정의에 따라 모델도 달라진다.
- 분류 => Naive Bayes, logistic Regression
- 회귀 => Linear Regression, Random Forest
- 클러스터링 => K-means, Hierarchical Clusterin
- 대부분의 머신러닝 문제가 예측 모델(predictive model)을 사용한다
- 예측 모델은 대부분 분류/회귀 문제를 풀게 된다.
예측 모델 학습
- [RECAP] Iris dataset을 3개의 Species로 구분하는 문제인 "분류(Classification)"로 정의했다.
- 분류 문제를 풀기 위해서 간단한 분류 모델인, Linear Classifier를 사용했다.
- 위 그림은 Linear Classifier를 이용해 4차원 feature space에 표현되는 iris dataset을 3가지로 분류한 모습이다.
- 경계선(decision boundary)를 기준으로 데이터가 분류되고 있다.
- 이러한 구분선을 찾아주는 방식이 Linear Calssifier라는 모델이다.(사실은 구분선보다 고차원적인 개념인 hyperplane이다.)
- 이렇게 구분선을 찾기 위해서는 선을 결정하는 parameter(또는 weight)를 찾아주면 된다.
- ex) y = ax + b 라는 식을 생각해보면 a와 b를 정하면 직선 하나가 결정된다
- 그래서 컴퓨터는 이러한 숫자를 찾기 위한 방식으로 학습을 진행하게 된다.
모델 성능 개선
- 학습이 잘 되지 않은 것(=적절한 숫자를 못 찾은 것)을 확인하기 위해서는 평가 기준이 필요하다.
- 분류에서 주로 사용하는 평가 기준은 "정확도(Accuracy)"가 있으며 정확도는 전체 데이터 중에 모델이 맞춘 데이터의 비율
- 정한 평가 기준을 가지고 점차 좋은 점수를 내는 것이 중요하다
성능 평가 지표
- 분류의 평가 기준에는 정확도만 있을까
- 분류의 평가 지표(Evalution Metric) : Accuracy, Precision, Recall, F1-score, AUC, MCC, Quadratic Kappa socre 등
- 정의한 문제를 머신러닝 모델이 잘 예측했는지를 알기 위해서는 적절한 평가 지표가 설정되는 것이 중요하다
- 이 중에 하나늘 선택했다면, 해당 성능이 설정한 목표(기준 점수)에 도달할 때까지 학습을 진행한다
서비스 적용 및 배포
- 학습이 완료된 모델을 실제 서비스에 적용하는 단계
- 학습이 완료된 모델을 실제 상용 프로그램(application)에 적용하기 위해서는 해당 모델을 서비스가 만들어진 프로그램에 넣어야 합니다.
- 프로그램이 호환되기 위해서는 세가지 방법이 있다.
- 기존 어플리케이션이 작동되고 있는 framework(프로그래밍 언어를 비롯한 개발 환경)에 맞추어 코드를 다시 짠다.
- 직접 코드를 짜지 않고, 서로 정보만 API를 통해서 주고 받는다
- 머신러닝 모델 객체를 저장하고 상용 프로그램에서 이를 불러와 사용한다.
- 첫번째 케이스는 말도 안되는 경우이므로 거의 없음
- 두번째와 세번째 케이스를 하기 위해서 Python에서 제공되는 Flask나 Django같은 framework를 통해서 머신러닝 모델 코드와 상용 프로그램이 소통할 수 있게 해준다.
- 이러한 과정을 모델 배포라고 한다.
최종 모델 배포
- 보통 모델 배포를 하고 서비스에 넣는다고 끝이 아니다.
- 머신러닝은 학습(training) 단계를 포함하고 있기 때문에, 지속적인 모니터링을 하면서 계속해서 예측 대상인 데이터에 패턴이 바뀌는지 체크를 해야한다.
- 데이터의 패턴이 바뀐다면, 학습했던 모델의 성능이 떨어지므로(예측 결과가 않좋아짐) 재학습이 필요하다.
- 이러한 과정을 머신러닝 모델 개발 사이클(ML Model Development Cycle)이라고 한다.
- 이 사이클을 완성하기 위해서는 실제로 학습된 모델이 사용 서비스에 적용 되었을 떄, 처음 문제 정의를 서비스 형태로 해결할 수 있는지 체크
- 예를 들어
- Iris DB에 적용되는 솔루션을 다시 생각해본다면 4개의 feature값이 들어왔을 때 3개의 종(setosa, versicolor, virginica)으로 분류하는 문제인데 새로운 종에 해당하는 정보가 들어온다면 제대로 예측하지 못하고 3개의 종 중에 하나로 답을 한다(우리가 만든 모델은 3지선다형으로 만들어 졌기 때문에)
- 이러한 케이스가 발생한다면, 새로운 종에 대한 정보를 모델에 업데이트 해야한다.
- 업데이트를 위해서 다시 정의하고, 새로운 종을 포함한 4지선다 문제로 재학습을 진행한다.
- 다시 배포를 해서, 서비스에 원활하게 적용이 되는지 체크한다.
- 이런 과정을 도와주는 오픈소스 라이브러리 MLFlow가 있다.