본문 바로가기
CS/ML

[ML] 머신러닝 2주차 복습 정리

by 빠니몽 2023. 10. 1.

09.30.2023

 

2주차에서는 머신러닝 프로젝트가 어떻게 시작하고 흘러가서 끝나는지 전반적으로 설명을 합니다.

ML 프로젝트의 파이프라인은 여기서 제공되는 것과 별반 달라지지 않습니다.

이번 주차에서는 캘리포니아 부동산 가격 데이터셋을 이용하여 모든 지역의 부동산 중간 값을 예측합니다.

 

1. 빅픽처 그리기

1-1. 문제 정의

모델을 만드는 것은 목적이 아니다. 그 모델을 이용해서 (현업에 있는 경우라면 회사가) 어떤 이득을 얻을지 생각해보아야 한다.

어떻게 문제를 정립할지, 어떤 알고리즘을 이용하고 어떤 퍼포먼스 메쥬어를 이용할지, 그리고 원하는 성능을 얻기 위해 얼마나 노력을 투여할지 등이 모두 '목적이 무엇인가'에 달려있다.

이 챕터에서 모델의 목표는 모델의 아웃풋이 다른 ML 시스템에 공급되는것, 투자할 만한 가치가 있는 부동산인지, 그래서 그 하위 시스템이 투자를 할지 말지 결정하는 것 이다.

 

파이프라인

출처: 강의 자료

각각의 컴포넌트들은 보통 독립적으로, 비동기적으로 돌아감

 

결론적으로 supervised, unsupervise, or reinforvement learning 셋 중에 하나 선택해야함. 이 챕터에서는 supervised learning을 선택한다. 데이터셋이 레이블되어있기 때문이다.

그리고 classification task인지, regression task인지 그도 아니면 다른 태스크인지 정의해야함. 현재 챕터의 문제는 regression task임. 더불어 univariate 이다. 즉 싱글벨류만 예측할 예정.

batch learning 인지, online learning인지도 결정해야한다. 학습데이터셋이 적기 때문에 batch learning으로 충분하다

 

1-2. 성능 메쥬어 선택하기

regression 문제에 쓰이는 가장 흔한 성능 측정 방법은 Root Mean Square Error(RMSE) 이다.

 

출처: 강의자료

m: i 번째 인스턴스(행) 갯수

X(i): i번째 인스턴스의 모든 피쳐값(feature values)

Yi: i번째 인스턴스의 레이블

X: 모든 인스턴스의 모든 피쳐값을 포함하는 매트릭스

h: hypothesis, 가설, 우리가 학습시킨 모델

 

RMSE가 많이 쓰이긴 하지만, 아웃라이어(otlier)가 많으면 Mean Absolute Error(MAE) 사용을 고려할 수 있음

출처: 강의 자료

쉽게 말해 절대값을 계산한 값의 평균을 구해 성능을 측정한다.

두 방법 모두 두 벡터 사이의 거리를 계산하는 방식이다. measure 또는 norm 이라고도 명칭.

인덱스가 높아질수록 큰 값에 집중하고 작은 값을 무시하는 경향이 있음.

 

1-3. 가정 재검토

현재까지 진행된 가정들을 재검토한다.

2. 데이터 얻기

2-1. 데이터 다운로드

출처: 강의자료
출처: 강의자료

2-2. 함수 설명

head: 상위 5행 출력. 인자를 넣으면 인자만큼의 행 출력

info: 간단한 정보를 띄워줌(전체 행 숫자, 각각의 속성 타입, 논널값 숫자 등)

value_counts: categorical column에 value_counts()를 쓰면 카테고리당 데이터가 몇 개 있는지 알 수 있음

describe: 숫자 속성의 요약본을 알려줌(count, mean, std, min, 25%, 50%, 75%, max)

 

2-3. Plot으로 데이터 구조 살펴보기

출처: 강의 자료
출처: 강의 자료

위의 plot에서 볼 수 있는 잘못된 점은 현재 가운데 위에서 두개의 그래프를 보면 각각 55/50만에서 그래프가 튀는 것을 알 수 있다.

55이상/50만 이상을 각각 55/50만으로 표기했기 때문. 이러한 방식은 바람직하지 않음.

 

또한 나이와 집값에 대한 중간값이 정확하지 않다는 것을 알 수 있다.

우리가 예측할 값은 집값이므로, 이런 경우 크게 문제가 될 수 있다. 이 때의 해결책은 두가지가 있다.

  1. 정확한 레이블을 다시 얻거나
  2. 테스트셋과 트레이닝셋에서 데이터를 삭제하는 것

마지막으로, 히스토그램들이 전체적으로 tail-heavy 한 것을 볼 수 있다.

이런 경우 특정 모델들에 한해 패턴을 잘 찾지 못하는 경우가 발생할 수 있음.

 

2-4. 테스트셋 생성

데이터셋을 프리프로세싱(pre-processing)하기 전에 테스트셋을 먼저 따로 빼놓아야 함.

그렇다고 일반화와 패턴찾기에 특화되어있는 인간이 데이터를 정제하면 bias가 걸리기 때문에 random하게, 보통 데이터셋의 20퍼를 테스트 데이터로 따로 떼놓음.

한 번 분리한 테스트셋은 나중에 건드리면 안됨.

 

2-4-1. Randome Sampling

만약 데이터셋에 identifier 컬럼이 없다면, 행 인덱스를 id로 쓰는 것이 가장 단순한 방법이다.

이런 경우 새로운 데이터셋은 반드시 뒤에 추가되어야하며, 데이터의 삭제가 불가능하다는 단점이 있다.

이 단점이 치명적인 데이터셋의 경우는 가장 안정된 피쳐들을 identifier로 쓴다(예시: 위경도값)

데이터셋이 충분히 크면 괜찮지만, 아니라면 상당한 샘플링 바이어스를 안고갈 수 있음

 

2-4-2. Stratified Sampling

테스트 데이터가 전체적인 파퓰레이션을 대표할 수 있도록 보장하기 위해 각각의 스펙트럼에서 행 숫자를 샘플링하고 strata라고 불리는 서브 단일 그룹으로 파퓰레이션으로 나누는 것을 stratified sampling이라고 한다.

 

3. 인사이트를 얻기 위해 데이터를 발굴하고 비주얼라이징하기

3-1. 상호관련성 찾기

데이터셋이 너무 크지만 않으면 두 어트리뷰트 사이에 어떤 관계가 있는지 알려주는 standard correlation coefficient를 계산할 수 있음.

correlation coefficient는 linear correlation에 대해서만 측정 가능하다.

한가지 단점으로는 결과값이 마이너스 또는 0으로 나온다는 점이다. 그러나 기본적인 correlation 체크에는 가장 좋음

출처: 강의 자료

housing.corr()["column"].sort_values() 를 진행했을 떄 얻을 수 있는 결과값이다.

값이 높을수록 중요한 피쳐임을 나타낸다.

 

3-2. Feature Engineering

머신러닝 알고리즘을 준비하기 전에, 어트리뷰트 컨비네이션을 시도해볼 수 있다.

예를 들어 그 지역의 전체 방 수보다는 한 집에 방 수가 몇개가 있느냐가 더 의미있는 지표임

코드 예시)

출처: 강의 자료

출처: 강의자료

부호 상관없이 절대값이 가장 큰게 가장 좋음

 

4. 머신러닝 알고리즘을 위한 데이터 준비하기

데이터 클렌징, 피쳐 엔지니어링, 노머라이제이션, 센다이제이션 등을 포함

4-1. 데이터 클렌징

  1. 데이터를 프리딕터와 레이블로 나눈다
  2. missing features를 처리한다. 미싱 피쳐가 얼마나 없는지, 연관 피쳐가 레이블과 얼마나 중요하게 연결되어 있는지가 중요함
    1. 겹치는 지역을 삭제하거나
    2. 전체 어트리뷰트를 삭제하거나
    3. (값이 크게 많이 비지 않는 경우)값을 특정 디폴트값으로 채워넣는다.(0, 평균값, 중간값 등)

4-2. Categorical 속성과 텍스트 다루기

텍스트 속성들은 숫자 형태로 변환해야 함

카테고리가 네 개라고 가정했을 때, 각각에 대해 그냥 인덱스를 부여해 대입하면 모델은 순서가 있다고 생각함

모델의 입장에서는, 0-1보다 0-2 번이 더 다르다고 생각하기 때문에 단순히 숫자 인코딩을 할 수 없음

4-2-1. 원 핫 인코딩

각각의 벡터(카테고리)는 단 하나의 1만 가질 수 있게 하는 기법

동일한 레벨로 카테고리를 표현할 수 있지만, Sparse matrix를 사용하기 때문에 메모리를 엄청 잡아먹음(한 행당 수많은 0과 단 하나의1)

1 곳의 로케이션을 저장하면 메모리 문제를 해결할 있음

4-2-2. 피쳐 스케일링

머신러닝 알고리즘은 인풋 숫자값들이 너무 다양한 스케일을 가질 때 성능이 잘 나오지 않는다.

현재 예제인 하우징 데이터를 보면 방의 총 숫자는 6부터 320이므로 범위가 굉장히 넓은 편이다

다만 우리가 구하고자 하는 티켓값은 스케일링하지 않아도 괜찮음

스케일링의 방식에는 두가지가 있음

 

1. Min-Max scaling(Normalization)

값들이 0-1 사이로 귀속할 수 있게끔 recale한다.

예제코드

2. Standardization

각각의 값들에서 중간값을 뺀 후 그것을 standard deviation으로 나눈다.

min-max scaling과는 다르게 특정 범위가 있진 않다. 이런 점이 나중에 문제가 될 여지가 될 수도 있음

장점으로는 아웃라이어들에 영향을 많이 받지 않는다는 점

 

 

모든 트렌스포메이션(변형)에 대해, 스케일러를 모든 데이터셋이 아닌 트레이닝 데이터셋에만 피팅시켜야한다(중요)

두 피쳐 스케일링 방식 모두 진행되기 전, heavy tail을 shrink하기 위해 트렌스폼(변형)을 먼저 해야한다. (분포가 대략적으로 발란스있게 보이도록)

또다른 heavy tail 처리 방법은, bucketizing 이다.

분포를 거의 동일한 사이즈의 bucket으로 잘게 나눈뒤 각각의 feature값들을 bucket들의 인덱스로 대체하는 것이다.

4-3. Custom Transformers

트렌스포메이션들이 트레이닝을 요구하지 않는 경우 그냥 NumPy 배열을 인풋으로 받아 아웃풋으로 변환된 배열을 뱉는 함수를 만들면 됨

이런 경우에는 FunctionTransformer를 사용하면 간편하게 할 수 있음.

그러나 트레인이 가능한 트랜스포머가 필요하다면, fit, fit_transform() 메소드들을 쓸 수 있다.

4-4. Transformation Pipelines

스케일링, 어트리뷰트 추가, 널벨류 추가 등등의 transformation을 따로 하기에는 번거롭기 때문에 파이프라인이 필요

Scikit-Learn 에서는 ColumnTransformer라는 트랜스포메이션 파이프라인 자동화를 도와주는 클래스를 도입함

출처: 강의자료

 

5. 모델 선정 및 트레이닝

5-1. 트레이닝 셋에 대한 트레이닝과 이발류에이팅

Linear Regression 모델 하나를 트레이닝 했고, 이 모델에 대한 RMSE를 모든 트레이닝 셋에 대해 구해보았을 때,

68628이라는 큰 숫자가 나왔다. 이런 경우 큰 에러가 발생했다고 볼 수 있으며, 언더피팅이 된 것을 알 수 있다.

이 경우 모델이 너무 심플하기 때문에 더 복잡한 모델을 트레이닝 시켜야한다.

더 복잡한 모델인 Decision Tree Regression을 트레이닝 시킨 후 RMSE 값이다.

0이 나왔을 경우에는 오버피팅의 가능성이 있다. 확실시 하려면 validation 과정이 피요한데, validation값이 RMSE보다 너무 크다면 오버피팅이다.

이 과정에서 우리는 Training set, Test set에 이어서 Validation Set에 대한 필요성을 느꼈다.

 

6. 모델 파인튜닝하기

파인튜닝이란 학습으로 학습되지 않는 파라미터들(하이퍼 파라미터)의 최적의 조합을 찾는 과정이다.(최적화하는 과정이다)

6-1. Grid Search

그리드 서치는 좋은 하이퍼파라미터 값 콤비네이션을 발견할 때까지 하이퍼파라미터를 수동으로 조작하는 것이다.

파라미터를 그리드로 줄 때는 모든 콤비네이션을 인풋으로 주어야 한다.

Grid Search는 시간이 많이 드는 방법이지만, 좋은 하이퍼 파라미터를 찾는 방법으로 대체가능한 방법이 없다.

 

6-2. Randomized Search

하이퍼파라미터 검색 공간이 넓은 경우 Grid Search 대신 사용한다.

장점은 모든 값들을 모든 하이퍼파라미터에 대해 검색한다. Gird Search는 전체의 몇 개의 하이퍼파라미터만)

또한 iteration을 세팅하는 쉬운 방법으로 비용에 맞춰 하이퍼 파라미터 서치를 진행 할 수 있다.

 

6-3. 앙상블 메소드

성능이 잘 나오는 모델들을 병합시킴으로써 파인튜닝을 하는 방법도 있음

앙상블(모델 그룹)은 보통 하나의 모델보다 좋은 성능을 낼 수 있다. 서로가 서로를 보완시키면서 동작할 수 있기 때문

 

6-4. 베스트모델과 그 모델의 에러 분석하기

RandomFoerestRefressor 클래스는 정확한 예측을 만들기 위한 각각의 속성의 상대적 중요도를 나타낼 수 있게 해준다.

6-5. 테스트셋에 대해 시스템 evaluate하기

1. 테스트데이터에 대해서는 transform만 시켜야 한다. fitting을 진행하면 안됨.

2. Cross-validation 값과 RMSE값이 비슷하게 나오면 잘 학습된 모델이라 볼 수 있다.

3. 파인튜닝을 한 번 진행한 모델에 다시 파인튜닝을 할 수는 없음

 

7. 시스템 배포, 모니터, 유지보수하기

7-1. 배포

1. Scikit-Learn model 저장 (로컬환경)

2. joblib를 이용해 저장 후 GooogleAI Platform에서 저장된 GCS file을 새로운 모델로 생성(클라우드 이용)

7-2. 모니터링

모니터링은 선택이 아닌 필수. 시스템의 실시간 성능을 체크하는 코드가 반드시 있어야 함.

모델이 노후화되는 것은 흔한 현상이다.

데이터가 계속 진화하면, 데이터셋과 모델도 주기적으로 업데이트 해주어야 한다.

'CS > ML' 카테고리의 다른 글

[ML] 요점정리  (1) 2023.10.25
[ML] 5주차 - SVM  (1) 2023.10.23
[ML] 4주차 - 트레이닝 모델  (1) 2023.10.22
[ML] 머신러닝 3주차 - Classification  (2) 2023.10.08
[ML] 머신러닝 1주차 복습정리  (0) 2023.09.17