반응형
1. 사이킷런
- 사이킷런 기반 프레임워크
- 사이킷런(scikit-learn)은 파이썬 머신러닝 라이브러리 중 가장 많이 사용되는 대표적인 라이브러리이다.
- 사이킷런에서는 분류 알고리즘을 구현한 클래스를 Classifier로, 회귀 알고리즘을 구현한 클래스를 Regressor로 지칭한다. (사이킷런에서는 매우 많은 유형의 Classifier와 Regressor 클래스를 제공한다.)
- Classifier와 Regressor를 합쳐서 Estimator 클래스라고 부른다. (즉, 지도학습의 모든 알고리즘을 구현한 클래스를 Estimator라고 부른다.)
- Estimator 클래스 (내부)에서 fit()과 predict()를 구현함.
- 해당 Estimator를 인자로 받는...
- cross_val_score()와 같은 evaluation함수
- GridSearchCV와 같은 하이퍼 파라미터 튜닝을 지원하는 클래스
- fit()과 predict()를 호출해서 평가하거나 하이퍼 파라미터 튜닝을 수행함
- 비지도학습 ( 차원 축소, 클러스터링, 피처 추출 )에서 fit()은 입력 데이터의 형태에 맞춰 데이터를 변환하기 위한 사전 구조를 맞추는 작업. (학습 의미X)
- transform() : 입력 데이터의 차원 변환, 클러스터링, 피처 추출 등의 실제 작업
2. 검증 중 교차 검증
- 검증은 새로운 데이터 test set을 예측하기 전에, 알고리즘을 학습시키면서 예측 성능을 평가하기 위한 별도의 테스트용 데이터 이다.
- 보통 교차 검증은 데이터셋이 매우 적은 경우에 쓰이는데, 이유는. 과적합을 방지하기 위해서 이다.
- 데이터셋이 너무 적을 경우, 해당 데이터셋으로만 알고리즘을 학습시킬 때, 그 데이터에만 과적합되는 모델이 만들어져 다른 데이터를 예측할 경우 성능이 저하되는 "과대 적합" 문제가 발생하기 쉽다.
"교차 검증" 이란?
테스트 데이터 세트에 대해 평가하기 전에, 학습 세트와 검증 세트에서 알고리즘을 학습하고 평가하는 것을 의미한다. 대표적으로 K-fold cross-validation(k 폴드 교차 검증), Stratified K-fold cross-validation이 있다.
a. K-fold 교차 검증
풀어서 설명하자면, test set과 이미 분할된 train set에 대해서
K개(일반적으로 4 or 5)의 fold로 분할한 후,
- 1번째가 검증 data, 나머지 K-1개가 훈련 data로 훈련 및 성능 평가.
- 2번째가 검증 data, 나머지 K-1개가 훈련 data로 훈련 및 성능 평가.
- 3번째가 검증 data, 나머지 K-1개가 훈련 data로 훈련 및 성능 평가.
- 4번째가 검증 data, 나머지 K-1개가 훈련 data로 훈련 및 성능 평가.
- 5번째가 검증 data, 나머지 K-1개가 훈련 data로 훈련 및 성능 평가.
총 K개의 평가치의 평균을 구하면, 최종적인 검증 정확도값이 나오게 된다.
b. Stratified K-fold 교차 검증
- K-fold가 레이블 데이터 집합이 원본 데이터 집합의 레이블 분포를 학습 및 검증 데이터 세트에 제대로 분배하지 못하는 문제를 해결한다.
- 쉽게 말해서, KFold로 분할된 레이블 데이터 세트가 전체 레이블 값의 분포도를 반영하지 못하는 문제를 해결.
- 만약, 전체 레이블 데이터 0,1,2에서 0과 1 값으로 치우쳐져 있다면, 분할된 레이블 데이터 세트도 0과 1 값으로 치우쳐져 있도록 한다.
- iris_data의 label 예시) 전체 label data에는 0: 50, 1: 50, 2: 50 있는데, k=3인 폴드 세트로 만들어지는 경우, train:0과1, valid:2, train:0과2, valid:1, train:1과 2, valid:0으로 만드는 문제 발생
- StratifiedKFold는 split() 메서드에 인자로 전체 레이블 데이터 세트도 반드시 필요함.
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=3)
for train_index, test_index in skf.split(iris_df, iris_df['label']):
label_train = iris_df['label'].iloc[train_index]
label_test = iris_df['label'].iloc[test_index]
- Stratified K fold의 경우, 원본 데이터의 레이블 분포도 특성을 반영한 학습 및 검증 데이터 세트를 만들수 있으므로,왜곡된 레이블 데이터 세트에서는 반드시 Stratified K fold를 이용해 교차검증해야한다.
- 사실 일반적으로 분류(Classification)에서의 교차 검증은 Stratified K fold로 분할되어야하고,
- 회귀(Regression)에서는 Stratified K fold가 지원되지 않는다.
(레이블이 연속값이기 때문에, 결정값 별 분포가 의미가 없기 때문)
3. corss_val_score() - 교차 검증을 보다 간편하게
사이킷런은 교차 검증을 좀 더 편리하게 수행하게 해주는 API를 제공한다. 대표적인 것이 cross_val_score()
KFold로 데이터를 학습/예측하는 코드를 보면
1. 폴드 세트를 설정
2. for 루프에서 train 및 valid 데이터의 인덱스를 추출한 뒤
3. 반복적으로 학습과 예측을 수행하고 예측 성능을 반환했다.
cross_val_score()는 이런 과정을 한꺼번에 수행해주는 API이다.
선언 형식은
cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
여기서 주요 파라미터는 estimator(모델), X, y, scoring, cv이다.
X는 feature data set, y는 label data set, scoring은 예측 성능 평가 지표(accuracy 등), cv는 교차 검증 fold 수를 의미한다.
반환 값은 scoring 파라미터로 지정된 성능 지표 측정값을 배열 형태로 반환한다.
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score, cross_validate
from sklearn.datasets import load_iris
# 데이터 로드
iris_data = load_iris()
dt_clf = DecisionTreeClassifier(random_state=156)
data = iris_data.data
label = iris_data.target
# 성능지표는 정확도(accuracy), 교차 검증 세트는 3개
scores = cross_val_score(dt_clf, data, label, scoring='accuracy', cv=3)
print('교차 검증별 정확도:', np.round(scres, 4))
print('평균 검증별 정확도:', np.round(np.mean(scores),4))
- cross_val_score()는 내부적으로 StratifiedKFold를 이용한다.
- 비슷한 API로 코드에도 import 해 놓은 cross_validate()가 있는데, 이는 여러 개의 평가 지표를 반환할 수 있다.
- 또한 학습 데이터에 대한 성능 평가 지표와 수행 시간도 같이 제공한다.
- 그러나 대부분 cross_val_score()로 이용해도 되서 잘 쓰이지 않는다.
반응형
'지식 > Machine Learning' 카테고리의 다른 글
단순회귀, 다중회귀, 다항회귀 (0) | 2021.05.23 |
---|---|
데이터 전처리 (2. 피처 스케일링) (0) | 2021.04.11 |
데이터 전처리 (1) (0) | 2021.04.09 |
ndarray, 리스트, 딕셔너리와 DataFrame 상호 변환하기 (0) | 2021.03.28 |
K-NN 알고리즘의 쉬운 예제 (0) | 2021.03.16 |