공부하자
머신러닝 - 사이킷런, 모델 Selection, 데이터 전처리 본문
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 교차검증
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?
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
'머신러닝' 카테고리의 다른 글
머신러닝 - 회귀 (0) | 2021.06.27 |
---|---|
머신러닝 - 성능 평가, 분류 (0) | 2021.06.27 |
머신러닝 - 기초(Numpy, Pandas, ...) (0) | 2021.06.27 |
머신러닝 with 파이썬 머신러닝 완벽 가이드 (0) | 2021.06.27 |