Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공부하자

머신러닝 - 사이킷런, 모델 Selection, 데이터 전처리 본문

머신러닝

머신러닝 - 사이킷런, 모델 Selection, 데이터 전처리

맥뚜원샷 2021. 6. 27. 13:10

1. 머신러닝 붓꽃 품종 예측

 

- 지도학습
: 정답(Label)이 있는 데이터(Feature)를 이용해 모델 학습
: 이 후 별도의 테스트 데이터 세트에서 미지의 Label 예측
- 붓꽃 데이터 세트
: 꽃잎 길이, 너비, 꽃받침 길이, 너비 등의 Feature 기반으로 붓꽃 품종 예측
- 분류 예측 프로세스
i) 데이터 세트 분리 : 데이터를 학습 데이터 테스트 데이터로 분리 (train_test_split())
ii) 모델 학습 : 학습 데이터를 기반으로 알고리즘을 적용하여 모델 학습
iii) 예측 수행 학습된 모델을 이용해 테스트 데이터의 분류 예측
iv) 평가 : 예측된 결과와 실제 결과를 비교하여 모델 성능 평가

 

--> 여기서는 자세한 설명은 없고 일단 예제를 무작정 따라하기

★Feature, Label 차이
- Feature : 입력되는 정보, 단순 선형 회귀에서 X변수라고 보면 됨
- Label : 예측하고자 하는 대상 항목, 단순 선형회귀에서 Y변수

 

2. 사이킷런 기반 프레임워크 익히기

## Estimator이해, fit(), predict() 메서드

- Estimator : 지도학습의 모든 알고리즘을 구현한 클래스. Classifier, Regressor로 나뉨

i) Classifier : 분류 알고리즘을 구현

ii) Regressor : 회귀 알고리즘을 구현

- fit() : 모델 학습을 위한 메서드

- predict() : 학습된 모델의 예측을 위한 메서드

 

 

## 사이킷런 주요 모듈

- 머신러닝의 주요 프로세스

i) 피처 처리(feature preprocessing) : Feature의 가공, 변경, 추출

ii) ML 알고리즘 예측/수행

iii) 모델 평가

 --> 이런 거에 필요한 다양한 모듈 지원함

 + 내장된 예제 데이터 세트 활용 (Boston 집값, Breastcancer 데이터 등)

 

3. Model Selection 모듈

- Model Selection 모듈

: 학습/테스트 데이터 세트 분리, 교차 검증 분할 및 평가
 Estimator의 하이퍼 파라미터 튜닝을 위한 함수와 클래스 제공

 

## train_test_split()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3) 과 같은 방식으로 사용

 

## 교차 검증

- 과적합

: 모델이 학습 데이터에만 과도하게 최적화되어 실제 예측을 다른 데이터로 수행할 경우 예측 성능이 과도하게 떨어지는 것

- 교차 검증

: 데이터 편중을 막기 위해 별도의 여러 세트로 구성된 학습 데이터와 검증 데이터 세트에서 학습과 평가를 수행함

: 테스트 데이터 세트 외에 별도의 검증 데이터 세트로 최종 평가 이전에 학습된 모델을 다양하게 평가

- K 폴드 검증

: K개의 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습, 검증, 평가 반복 수행

: KFold.split() 호출시 학습/검증 데이터로 분할할 수 있는 인덱스를 반환함 (인덱스 짝을 세트 수만큼)

실제 학습 검증 데이터추출은 반환된 인덱스를 기반으로 개발코드에서 직접 수행

>>사용예시

K폴드의 문제점 : 분할된 레이블 데이터 세트가 전체 레이블값의 분포도를 반영하지 않는다.

--> Stratified K폴드

: 불균형한 분포도를 가진 레이블 데이터 집합을 위한 K폴드 방식

: 원본 데이터의 레이블 분포를 먼저 고려한 뒤, 이 분포와 동일하게 학습/검증 데이터 세트를 분배하여 K폴드의 문제점을 해결

모든 레이블 항목의 개수가 비슷하게 만들어짐

:- 회귀에서는 Stratified K폴드를 지원하지 않음(당연!)

 

- cross_val_score

: 내부에서 Estimator의 학습, 예측, 평가를 수행하여 간단하게 교차검증을 수행함

: cross_val_score(estimator, X, y, scoring(기법), cv)

: 파라미터

- estimator : 분류/회귀 알고리즘 클래스

- X, y : Feature, Label 데이터셋

- Scoring : 예측 성능 평가 지표

- cv : 교차검증 폴드 수

 

- cross_validate()

: 여러 개의 평가 지표 반환

: 학습 데이터에 대한 성능 평가 지표, 수행 시간 제공한다.

 

★ 교차 검증 추가 조사자료 : 교차검증 이후 최종 모델은 어떻게?

- K번째 폴드의 훈련 과정에서 훈련 폴드를 이용하여 모델을 훈련시키고, 검증 폴드를 이용하여 정확도 측정

동시에 훈련과정에서 구한 parameter값을 저장한다.

- K번째 훈련까지 마친 후 K개의 정확도의 평균을 모델 정확도로 이용

-->이때 저장한 parameter값의 평균을 최종 모델의 parameter로 이용한다..

- 이후에 전체 훈련 세트를 사용해서 최종 모델을 다시 훈련

 (훈련 샘플이 많을수록 더 정교한 모델을 만드므로)

- 그리고 이전에 떼어둔 테스트 세트로 최종성능 추정

 

## GridSearchCV - 교차 검증과 최적 하이퍼 파라미터 튜닝을 한번에.

- 하이퍼 파라미터

: 머신러닝 알고리즘을 구성하는 주요 요소

: 하이퍼 파라미터를 조정하여 알고리즘 예측 성능 개선

- GridSearchCV

: 하이퍼 파라미터를 순차적으로 입력해서 최적의 파라미터를 편리하게 도출

 --> GridSearchCV(estimator, param_grid, scoring, cv)

: 파라미터 설명

i) estimator : 분류/회귀를 위한 클래스

ii) param_grid

: estimator 튜닝을 위해 파라미터명 및 사용될 파라미터 지정(파라미터 후보들 선정)

: key(이름) : list(파라미터 후보들) 로 이루어진 딕셔너리

iii) scoring : 예측 성능 평가 방법

iv) cv : 교차 검증 분할되는 학습/테스트 셋 개수 지정

v) refit : 최적 파라미터를 찾은 후 해당 파라미터로 estimator를 재학습(default = True)

- GridSearchCV.cv_results_

: GridSearchCV 후 결과를 가져다줌

이런 모양으로.

 

★ GridSearchCV는 학습시간이 오래 걸리기 때문에 비효율적. 더 많은 데이터로 복잡한 모델을 학습할 때는 GridSearchCV말고 임의로 파라미터를 조정하면서 학습하는 편이 더 좋다고 함

 

4. 데이터 전처리

## 데이터 인코딩

- 결손값 : Null 값을 고정된 다른 값으로 변환

- 문자열 입력값 : 인코딩을 통해 숫자형으로

- 레이블 인코딩 : 카테고리형 feature를 숫자형으로 변환

: LabelEncoder

: 한번에 숫자값으로 변환됨, 그러나 카테고리형으로 인식하지는 않아서 예측 성능이 저하될 여지가 있음

- 원 핫 인코딩

: 행 형태의 Feature 고유값을 열 형태로 차원 변환한 후 고유값에 해당하는 칼럼에만 1을 표시, 나머지 칼럼에는 0 표시.

: 상품 분류를 열로 다 표기한 다음에 각 열에서 True/False의 값을 갖도록 함

: OneHotEncoder 메서드 사용

--> 모든 카테고리 피쳐의 문자열 값을 숫자형으로 반환(LabelEncoder)한 뒤, 입력값으로 2차원 데이터를 넣어야 하므로 .reshape(-1, 1)을 사용

 

- Pandas에 get_dummies()라는 메소드가 있는데, 위의 과정 필요 없이 한 번에 원-핫 인코딩 결과를 만들어준다. 이거 위주로 쓰는 게 좋을 듯!

## 피쳐 스케일링, 정규화

- 피처 스케일링

: 서로 다른 변수의 값 범위를 일정 수준으로 맞추는 작업

- 표준화

: 데이터의 각 feature 각각을 평균 0, 분산 1인 가우시안 정규분포를 가진 값으로 변환함(Z분포 변환)

 반환값 = (x_i - mean(x)) / std(x)

 

- 정규화

: 개별 데이터의 크기를 모두 똑같은 단위로 변경 (최댓값을 1, 최솟값을 0으로 변환하여 모든 데이터가 0~1에 있도록)

 반환값 = (x_i - min(x)) / (max(x) - min(x))

 

- Scikit-learn의 Normalizer 모듈

: 선형대수에서 벡터 정규화 개념 적용

: 개별 벡터의 크기를 맞추기 위해 변환하는 것.

 반환값 = x_i / sqrt(x_i^2 + y_i^2 + z_i^2)

: x, y, z는 각기 다른 열의 데이터로, 여러 개의 열을 고려해서 정규화할 필요가 있을 때 사용한다고 생각됨 (예 : 좌표 등)

 

## StandardScaler

- 표준화를 지원(Z변환)

- 데이터의 가우시안 분포를 가정한 SVM, 선형 회귀, 로지스틱 회귀에서 중요하다. 

scaler = StandardScaler()

scaler.fit(iris_df)

iris_scaled = scaler.transform(iris_df)

- fit~transform 거치면 결과값 나옴

 

## MinMaxScaler

- 정규화를 지원(0~1사이 값으로 변환)

- 사용 방법은 StandardScaler와 같음.

 

★ 학습 데이터, 테스트 데이터 스케일링 변환 시 유의할 점

- fit(), transform(), fit_transform() 의 메소드가 있다

: fit : 데이터 변환을 위한 기준 정보 설정

: transform : 그에 따라서 변환함

: fit_transform : 원큐에 다 함

--> 학습 데이터를 fit, transform할 때는 fit_transform() 사용해도 됨.

그러나 fit이 완료된 scaler 객체를 이용해 다시 테스트 데이터 세트를 transform할 때는

fit_transform()이 아니라 transform()만 사용해야 한다.

fit_transform()을 사용하면 데이터 변환 기준 정보가 테스트 셋으로 맞춰져 버려서

학습 데이터로 학습했던 모델이랑 달라지게 됨.

 

--> 전체 데이터셋에 스케일링 적용(최대한 많은 데이터를 이용해서)한 후 학습/테스트셋 분리하는 것이 바람직하다.

 

 

 

 

교차검증 관련 참고자료

K-Fold 교차검증 (velog.io)

 

K-Fold 교차검증

KFold 교차검증에 대해 알아봅시다.K개의 데이터 셋을 만든 후 K번 만큼 1) 학습, 2) 검증을 수행한는 방법위키 피디아 설명교차검증은 목적은 모델의 성능 평가를 일반화하는것모델의 성능을 직접

velog.io

머신 러닝 입문자를 위한 설명 - 교차 검증(K-Fold Cross Validation) (tistory.com)

 

머신 러닝 입문자를 위한 설명 - 교차 검증(K-Fold Cross Validation)

기계 학습(머신 러닝) 알고리즘은 '모델'이 학습 데이터(Training Data)를 통해 학습된 속성을 기반으로 결과를 예측하도록 합니다. 얼핏 생각하기에는 적합한 데이터를 이용하여 훈련시킨다면 다른

devkor.tistory.com

 

K-Fold Cross Validation(교차검증) 정의 및 설명 :: nonameyet (tistory.com)

 

K-Fold Cross Validation(교차검증) 정의 및 설명

정의 - K개의 fold를 만들어서 진행하는 교차검증 사용 이유 - 총 데이터 갯수가 적은 데이터 셋에 대하여 정확도를 향상시킬수 있음 - 이는 기존에 Training / Validation / Test 세 개의 집단으로 분류하

nonmeyet.tistory.com

How to choose a predictive model after k-fold cross-validation? - Cross Validated (stackexchange.com)

 

How to choose a predictive model after k-fold cross-validation?

I am wondering how to choose a predictive model after doing K-fold cross-validation. This may be awkwardly phrased, so let me explain in more detail: whenever I run K-fold cross-validation, I use K

stats.stackexchange.com