scikit-learn은 파이썬 머신러닝 라이브러리 중 가장 많이 사용됨
지도학습
학습을 위한 다양한 피처와 분류 결정값인 레이블 데이터로 모델 학습 뒤 별도의 테스트 데이터 세트에서 미지의 레이블 예측
학습 데이터와 테스트 데이터를 test_size 파라미터 입력 값의 비율로 분할
X_train, X_test, y_train, y_test = train_test_split(feature_datasets, label_datasets, test_size=0<n<1, random_state=num)
test_size = 전체 데이터 세트 중 테스트 데이터 세트 비율
random_state = 호출할 때마다 같은 학습/테스트 데이터를 생성하기 위해 주어지는 난수 발생값, random_state를 지정하지 않으면 코드 수행시마다 다른 학습/테스트 데이터가 선택될 수 있음
random_state의 숫자 자체에는 의미가 없음 (seed)
머신러닝 분류 알고리즘 (의사 결정 트리)
dt_clf = DecisionTreeClassifier(random_state=num)
dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
fit() 메서드에 학습용 피처 데이터, label 데이터 세트를 입력해 호출하면 학습 수행
predict() 메서드에 테스트용 피처 데이터 세트를 입력해 호출하면 학습된 모델 기반 테스트 데이터 세트에 대한 예측 label 반환
from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test, pred)))
정확도 측정을 위한 accuracy_score() 함수
첫 번째 파라미터로 실제 레이블 데이터 세트, 두 번째 파라미터로 예측 레이블 데이터 세트 입력
사이킷런은 API 일관성과 개발 편의성을 제공
ML 모델 학습을 위한 fit(), 학습된 모델의 예측을 위한 predict() 메서드 제공
지도학습의 주요 분야인 분류와 회귀의 다양한 알고리즘을 구현한 모든 사이킷런 클래스는 fit(), predict()만을 이용해 간단하게 학습과 예측 결과 반환
분류 알고리즘을 구현한 클래스를 Classifier로, 회귀 알고리즘을 구현한 클래스를 Regressor로 지칭
사이킷런에서 제공하는 많은 유형의 Classifier와 Regressor를 합쳐서 Estimator라고 부름
cross_val_score()와 같은 evaluation 함수, GridSearchCV와 같은 하이퍼파라미터 튜닝을 지원하는 클래스의 경우 이 Estimator를 인자로 받음
인자로 받은 Estimator에 대해 cross_val_score(), GridSearchCV.fit() 함수 내에서 이 Estimator의 fit()과 predict()를 호출해서 평가를 하거나 하이퍼파라미터 튜닝 수행
비지도학습인 차원 축소, 클러스터링, 피처 추출 등을 구현한 클래스 역시 대부분 fit()과 transform()을 적용
비지도학습과 피처 추출에서 fit()은 지도학습의 fit()과 같이 학습을 의미하는 것이 아닌 입력 데이터를 형태에 맞춰 데이터를 변환하기 위한 사전 구조를 맞추는 작업
fit()으로 변환을 위한 사전 구조를 맞추면 이후 입력 데이터의 차원 변환, 클러스터링, 피처 추출 등의 실제 작업은 transform()으로 수행
fit()과 transform()을 하나로 결합한 fit_transform()도 제공
사이킷런에 내장되어 있는 데이터 세트는 분류나 회귀를 연습하기 위한 예제 용도의 데이터 세트와 분류나 클러스터링을 위해 표본 데이터로 생성될 수 있는 데이터세트로 나뉨
분류, 회귀 연습을 위한 예제 데이터
fetch 계열의 명령은 데이터의 크기가 커서 패키지에 처음부터 저장되어 있지 않고 인터넷에 내려받아 홈 디렉터리 아래 scikit_learn_data라는 서브 디렉터리에 저장 후 추후 불러들이는 데이터
분류와 클러스터링을 위한 표본 데이터 생성기
표본 데이터 생성기는 다양하게 있으며 위의 2개 정도로 여러가지 사례에 적용할 수 있음
사이킷런에 내장된 데이터 세트는 일반적으로 딕셔너리 형태로 되어 있음
키는 보통 data, target, target_name, feature_names, DESCR로 구성되어 있음
data는 피처 데이터 세트
target은 분류 시 레이블, 회귀일 때는 숫자 결괏값 데이터 세트
target_names는 개별 레이블 이름
feature_names는 피처 이름
DESCR은 데이터 세트에 대한 설명과 피처 설명
data, target은 ndarray, target_names, feature_names는 ndarray 혹은 파이썬 리스트
DESCR은 스트링 타입
피처의 데이터 값을 반환받기 위해서는 내장 데이터 세트 API 호출 후 해당 Key값을 지정하면 됨
load_iris() API의 반환 결과는 sklearn.utils.Bunch
파이썬 딕셔너리 자료형과 유사
데이터 키는 피처들의 데이터 값을 가리킴
데이터 세트가 딕셔너리 형태이기 때문에 피처 데이터 값을 추출하기 위해서는 데이터 세트.data를 이용하면 됨
다른 속성 또한 key가 가리키는 데이터 값을 추출할 수 있음
학습 데이터와 테스트 데이터 세트를 분리하거나 교차 검증 분할 및 평가, Estimator의 하이퍼파라미터를 튜닝하기 위한 다양한 함수와 클래스 제공
sklearn.model_selection 모듈에서 train_test_split을 로드
알고리즘을 학습시키는 학습 데이터와 테스트 데이터가 별개로 필요함
하지만 이 방법 역시 과적합에 취약한 약점을 가짐
과적합
모델이 학습 데이터에만 과도하게 최적화되어 실제 예측을 다른 데이터로 수행할 경우에는 예측 성능이 과도하게 떨어지는 것
고정된 학습 데이터와 테스트 데이터로 평가를 하다 보면 테스트 데이터에만 최적의 성능을 발휘할 수 있도록 편향되게 모델을 유도하는 경향이 생기게 됨
교차 검증은 데이터 편증을 막기 위해 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행
각 세트에서 수행한 평가 결과에 따라 하이퍼파라미터 튜닝 등의 모델 최적화를 더욱 손쉽게 수행
ML 모델의 성능 평가는 교차 검증 기반으로 1차 평가 후 최종적으로 테스트 데이터 세트에 적용해 평가하는 프로세스
ML에 사용되는 데이터 세트를 세분화해서 학습, 검증, 테스트 데이터 세트로 나눌 수 있음
테스트 데이터 세트 외에 별도의 검증 데이터 세트를 통해 최종 평가 이전 학습된 모델을 다양하게 평가
가장 보편적으로 사용되는 교차 검증 기법
K개의 데이터 폴드 세트를 만들어서 K번 만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행
K개의 예측 평가를 구했으면 이를 평군해서 K 폴드 평가 결과로 반영
사이킷런에는 K 폴드 교차 검증 구현을 위해 KFold, StratifiedKFold 클래스 제공
KFold(n_split=n, shuffle=False, random_state=num)
KFold 객체의 split()을 호출하여 전체 붓꽃 데이터를 5개의 폴드 데이터로 분리
4/5는 학습 데이터, 1/5는 검증 데이터
split()을 호출하면 학습/검증 데이터로 분할할 수 있는 인덱스 반환
(실제 학습, 검증 데이터 추출은 반환된 인덱스를 기반으로 개발 코드에서 직접 수행)
불균형한 분포도를 가진 레이블 데이터 집합을 위한 K 폴드 방식
특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 경우
원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습, 검증 데이터 세트를 분배
KFold로 데이터를 학습하고 예측하는 코드는 폴드 세트를 설정, for 루프에서 반복으로 학습 및 테스트 데이터의 인덱스를 추출, 반복적으로 학습과 예측 수행하여 예측 성능 반환
cross_val_score()는 이런 일련의 과정을 한꺼번에 수행해주는 API
cross_val_score(estimator, X, y, scoring, cv, n_jobs, verbose, fit_params, pre_dispatch
주요 파라미터는 estimator, X, y, scoring, cv
estimator는 Clasifier 또는 Regressor를 의미, X는 피처 데이터 세트, y는 레이블 데이터 세트, scoring은 예측 성능 평가 지표, cv는 교차 검증 폴드 수
cross_val_score() 수행 후 반환 값은 scoring 파라미터로 지정된 성능 지표 측정값을 배열 형태로 반환
cross_val_score()는 classifier가 입력되면 Stratified K 폴드 방식으로 레이블값의 분포에 따라 학습/테스트 세트를 분할 (Regressor인 경우 기본 K 폴드 방식으로 분할)
cross_val_score()는 단 하나의 평가 지표만 가능하지만 cross_validate()는 여러 개의 평가 지표를 반환할 수 있으며 학습 데이터에 대한 성능 평가 지표와 수행 시간도 같이 제공
하이퍼파라미터는 머신러닝 알고리즘을 구성하는 주요 요소
이 값을 조정해 알고리즘의 예측 성능을 개선할 수 있음
교차 검증을 기반으로 하이퍼파라미터의 최적값을 찾게 해줌
데이터 세트를 cross-validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤 하이퍼파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용하여 최적의 파라미터를 찾을 수 있게 해줌
사용자가 튜닝하고자 하는 여러 종류의 하이퍼파라미터를 다양하게 테스트하면서 최적의 파라미터를 편리하게 찾게 해주지만 동시에 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸림
CV횟수와 파라미터 조합 수를 곱한 만큼 학습/평가가 수행됨
주요 파라미터는 estimator, param_grid, scoring, cv, refit이 있음
params 컬럼에는 수행할 때마다 적용된 하이퍼 파라미터 값을 가짐
rank_test_score는 평가한 결과 예측 성능의 순위를 의미
split_test_score는 폴딩 세트에서 각각 테스트한 성능 수치
GridSearchCV 객체의 fit()을 수행하면 최고 성능을 나타낸 하이퍼파라미터 값과 그때의 평가 결과 값이 각각 bestparams, bestscore 속성에 기록됨
이 속성을 통해 최적 하이퍼 파라미터 값과 그때의 정확도를 알 수 있음
refit=True이면 GridSearchCV가 최적 성능을 나타내는 하이퍼 파라미터로 Estimator를 학습해 bestestimator로 저장