220919

AIVILLAIN·2022년 9월 19일
0

오공완

목록 보기
9/25

scikit-learn은 파이썬 머신러닝 라이브러리 중 가장 많이 사용됨

  • 파이썬 기반의 다른 머신러닝 패키지도 사이킷런 스타일의 API를 지향할 정도로 쉽고 파이썬스러운 API 제공
  • 머신러닝을 위한 다양한 알고리즘과 개발을 위한 편리한 프레임워크, API 제공
  • 오랜 기간 검증된 성숙한 라이브러리

Iris classification

실습 코드

지도학습
학습을 위한 다양한 피처와 분류 결정값인 레이블 데이터로 모델 학습 뒤 별도의 테스트 데이터 세트에서 미지의 레이블 예측

sklearn.model_selection.train_test_split

학습 데이터와 테스트 데이터를 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)

sklearn.tree.DecisionTreeClassifier

머신러닝 분류 알고리즘 (의사 결정 트리)

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() 함수
첫 번째 파라미터로 실제 레이블 데이터 세트, 두 번째 파라미터로 예측 레이블 데이터 세트 입력

  1. 데이터 세트 분리 : 학습 데이터, 테스트 데이터 분리
  2. 모델 학습 : 학습 데이터 기반으로 ML 알고리즘 적용하여 모델 학습
  3. 예측 수행 : 학습된 모델을 이용하여 테스트 데이터 예측
  4. 평가 : 예측 결과와 실제 결과를 비교하여 ML 모델 성능 평가

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

Estimator, fit(), predict()

사이킷런은 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()도 제공

내장된 예제 데이터세트

실습 코드

사이킷런에 내장되어 있는 데이터 세트는 분류나 회귀를 연습하기 위한 예제 용도의 데이터 세트와 분류나 클러스터링을 위해 표본 데이터로 생성될 수 있는 데이터세트로 나뉨

분류, 회귀 연습을 위한 예제 데이터

  • datasets.load_boston()
    회귀 용도, 미국 보스턴의 집 피처들과 가격에 대한 데이터 세트
  • datasets.load_breast_cancer()
    분류 용도, 유방암 피처들과 악성/음성 레이블 데이터 세트
  • datasets.load_diabetes()
    회귀 용도, 당뇨 데이터 세트
  • datasets.load_digits()
    분류 용도, 0에서 9까지 숫자의 이미지 픽셀 데이터 세트
  • datasets.load_iris()
    분류 용도, 붓꽃에 대한 피처를 가진 데이터 세트

fetch 계열의 명령은 데이터의 크기가 커서 패키지에 처음부터 저장되어 있지 않고 인터넷에 내려받아 홈 디렉터리 아래 scikit_learn_data라는 서브 디렉터리에 저장 후 추후 불러들이는 데이터

  • fetch_covtype()
    회귀 분석용 토지 자료
  • fetch_20newsgroups()
    뉴스 그룹 텍스트 자료
  • fetch_olivetti_faces()
    얼굴 이미지 자료
  • fetch_lfw_people()
    얼굴 이미지 자료
  • fetch_lfw_pairs()
    얼굴 이미지 자료
  • fetch_rcv1()
    로이터 뉴스 말뭉치
  • fetch_mldata()
    ML 웹사이트에서 다운로드

분류와 클러스터링을 위한 표본 데이터 생성기

  • datasets.make_classifications()
    분류를 위한 데이터 세트를 만듬
    높은 상관도, 불필요한 속성 등 노이즈 효과를 위한 데이터를 무작위로 생성
  • datasets.make_blobs()
    클러스터링을 위한 데이터 세트를 무작위로 생성
    군집 지정 개수에 따라 여러 가지 클러스터링을 위한 데이터 세트 생성

표본 데이터 생성기는 다양하게 있으며 위의 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가 가리키는 데이터 값을 추출할 수 있음

Model Selection

실습 코드

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

학습/테스트 데이터 세트 분리 - train_test_split()

sklearn.model_selection 모듈에서 train_test_split을 로드

  • test_size
    전체 데이터에서 테스트 데이터 세트의 비율, default = 0.25(25%)
  • shuffle
    데이터 분리 전 데이터를 섞을지에 대한 결정, default = True

교차 검증

알고리즘을 학습시키는 학습 데이터와 테스트 데이터가 별개로 필요함
하지만 이 방법 역시 과적합에 취약한 약점을 가짐

과적합
모델이 학습 데이터에만 과도하게 최적화되어 실제 예측을 다른 데이터로 수행할 경우에는 예측 성능이 과도하게 떨어지는 것
고정된 학습 데이터와 테스트 데이터로 평가를 하다 보면 테스트 데이터에만 최적의 성능을 발휘할 수 있도록 편향되게 모델을 유도하는 경향이 생기게 됨

교차 검증은 데이터 편증을 막기 위해 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수행
각 세트에서 수행한 평가 결과에 따라 하이퍼파라미터 튜닝 등의 모델 최적화를 더욱 손쉽게 수행
ML 모델의 성능 평가는 교차 검증 기반으로 1차 평가 후 최종적으로 테스트 데이터 세트에 적용해 평가하는 프로세스
ML에 사용되는 데이터 세트를 세분화해서 학습, 검증, 테스트 데이터 세트로 나눌 수 있음
테스트 데이터 세트 외에 별도의 검증 데이터 세트를 통해 최종 평가 이전 학습된 모델을 다양하게 평가

K 폴드 교차 검증

가장 보편적으로 사용되는 교차 검증 기법
K개의 데이터 폴드 세트를 만들어서 K번 만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행
K개의 예측 평가를 구했으면 이를 평군해서 K 폴드 평가 결과로 반영

사이킷런에는 K 폴드 교차 검증 구현을 위해 KFold, StratifiedKFold 클래스 제공

KFold(n_split=n, shuffle=False, random_state=num)

KFold 객체의 split()을 호출하여 전체 붓꽃 데이터를 5개의 폴드 데이터로 분리
4/5는 학습 데이터, 1/5는 검증 데이터
split()을 호출하면 학습/검증 데이터로 분할할 수 있는 인덱스 반환
(실제 학습, 검증 데이터 추출은 반환된 인덱스를 기반으로 개발 코드에서 직접 수행)

Stratified K fold

불균형한 분포도를 가진 레이블 데이터 집합을 위한 K 폴드 방식
특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 경우
원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습, 검증 데이터 세트를 분배

cross_val_score()

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()는 여러 개의 평가 지표를 반환할 수 있으며 학습 데이터에 대한 성능 평가 지표와 수행 시간도 같이 제공

GridSearchCV

하이퍼파라미터는 머신러닝 알고리즘을 구성하는 주요 요소
이 값을 조정해 알고리즘의 예측 성능을 개선할 수 있음
교차 검증을 기반으로 하이퍼파라미터의 최적값을 찾게 해줌
데이터 세트를 cross-validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤 하이퍼파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용하여 최적의 파라미터를 찾을 수 있게 해줌
사용자가 튜닝하고자 하는 여러 종류의 하이퍼파라미터를 다양하게 테스트하면서 최적의 파라미터를 편리하게 찾게 해주지만 동시에 순차적으로 파라미터를 테스트하므로 수행시간이 상대적으로 오래 걸림
CV횟수와 파라미터 조합 수를 곱한 만큼 학습/평가가 수행됨

주요 파라미터는 estimator, param_grid, scoring, cv, refit이 있음

  • estimator
    classifier, regressor, pipeline이 사용될 수 있음
  • param_grid
    key + 리스트 값을 가지는 딕셔너리
    estimator의 튜닝을 위해 파라미터명과 사용될 파라미터 값 지정
  • scoring
    예측 성능을 측정할 평가 방법 지정
    사이킷런의 성능 평가 지표를 지정하는 문자열로 지정하거나 별도 성능 평가 지표 함수도 지정할 수 있음
  • cv
    교차 검증을 위해 분할되는 학습/테스트 세트의 수
  • refit
    default=True
    가장 최적의 하이퍼파라미터를 찾은 뒤 입력된 estimator 객체를 해당 하이퍼파라미터로 재학습

params 컬럼에는 수행할 때마다 적용된 하이퍼 파라미터 값을 가짐
rank_test_score는 평가한 결과 예측 성능의 순위를 의미
split_test_score는 폴딩 세트에서 각각 테스트한 성능 수치

GridSearchCV 객체의 fit()을 수행하면 최고 성능을 나타낸 하이퍼파라미터 값과 그때의 평가 결과 값이 각각 bestparams, bestscore 속성에 기록됨
이 속성을 통해 최적 하이퍼 파라미터 값과 그때의 정확도를 알 수 있음

refit=True이면 GridSearchCV가 최적 성능을 나타내는 하이퍼 파라미터로 Estimator를 학습해 bestestimator로 저장

profile
소신있는 오픈마인드

0개의 댓글