본문 바로가기

cs,코딩,알고리즘/<파이썬 머신러닝 완벽 가이드>스터디

2. 사이킷런-붓꽃 품종 분류하기

728x90

2. 사이킷런의 기반 프레임 워크 이해하기

사이킷런에서는 분류 알고리즘을 구현한 클래스를 Classifier로, 회귀 알고리즘을 구현한 클래스를 Regressor로 지칭하고, 이 둘을 합쳐 Estimator 클래스라고 부른다.(지도학습의 모든 알고리즘을 구현한 클래스를 통칭함)


이 Estimator 클래스는 fit()과 predcict()만을 이용해 간단하게 학습과 예측 결과를 반환한다.

Scikit-learn class 구현 클래스
Estimator
(분류+회귀)
학습: fit()
예측: predict()
Classifier (분류) DecisionTreeClassifier
RandomForestClassifier
GradientBoostingClassifer
GaussianNB
SVC
Regressor (회귀) LinearRegression
Ridge, Lasso
RandomForestRegressor
GradientBoostingRegressor

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

 

 

머신러닝 모델을 구축하는 주요 프로세스: 피처 가공, 변경, 추출을 수행하는 피처 처리(feature processing)-> 알고리즘 학습.예측-> 모델 평가단계 반복적으로

 

(여러 분류, 회귀 연습용 데이터 중 붓꽃에 대한 피처를 가진 데이터 세트로 해보자!)

붓꽃 품종 예측해보기

한 아마추어 식물학자가 들에서 발견한 붓꽃의 품종을 알고 싶다고 가정해보자. 이 식물학자는 붓꽃의 꽃잎(petal)과 꽃받침(sepal)의 폭과 길이를 센티미터 단위로 측정하였다.
전문 식물학자가 setosa, versicolor, virginica 종으로 분류한 붓꽃의 측정 데이터도 가지고 있다. 이 측정값을 이용해서 앞에서 채집한 붓꽃이 어떤 품종인지 구분하려고 한다. 이 아마추어 식물학자가 야생에서 채집한 붓꽃은 이 세 종류뿐이라고 가정해보자.

-->우리의 목표는 어떤 품종인지 구분해놓은 측정 데이터를 이용해 새로 채집한 붓꽃의 품종을 예측하는 머신러닝 모델을 만드는 것!!

붓꽃의 품종을 정확하게 분류한 데이터를 가지고 있으므로 이 문제는 지도 학습에 속한다. (몇 가지 선택사항(붓꽃의 품종) 중 하나를 선택하는 문제. 그러므로 이 예는 분류Classification 문제에 해당합니다.)출력될 수 있는 값(붓꽃의 종류)들을 클래스class -> 데이터셋에 있는 붓꽃 데이터는 모두 세 클래스 중 하나에 속합니다. 따라서 이 예는 세 개의 클래스를 분류하는 문제입니다.
데이터 포인트 하나(붓꽃 하나)에 대한 기대 출력은 꽃의 품종이 된다. 이런 특정 데이터 포인트에 대한 출력, 즉 품종을 레이블label이라고 한다

사용 라이브러리: 사이킷런(sklearn)

주어지는 붓꽃 데이터 피처(Feature) : 꽃잎의 길이와 너비, 꽃바침의 길이와 너비

결과로 도출하는 붓꽃 데이터 품종(레이블) : Setosa, Vesicolor, Virginica

* 피처(Feature)와 속성은 같은 용어. – 피처는 데이터 세트의 일반 속성. 머신 러닝은 2차원 이상의 다차원 데이터에서도 많이 사용되므로 타겟값을 제외한 나머지 속성을 모두 피처로 지정함.
* 레이블(분류) = 클래스(분류) = 타겟() = 결정()
- 타겟값 또는 결정값은 지도 학습 시 데이터의 학습을 위해 주어지는 정답 데이터.
- 지도 학습 중 분류의 경우에는 이 결정값을 레이블 또는 클래스로 지칭함.

지도학습은 학습을 위한 다양한 피처와 분류 결정값인 레이블 데이터로 모델을 학습한 뒤, 별도의 테스트 데이터 세트에서 미지의 레이블을 예측함.
- 지도학습은 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식.

 

 

1) 붓꽃 데이터 생성

lead_iris가 반환하는 객체중 눈여겨 볼 것은 data, target, feature_names, target_names
이렇게 보면 객체의 키들의 구성을 더 알기 쉬울 듯
눈여겨볼 객체들의 키 값을 일단 출력

2) 학습.테스트 세트 분리- train_test_split()

나누는 이유- 학습 데이터 세트로만 학습하고 예측하면 정확도가 100%나옴-> 그러면 만든 모델을 평가하고 비교할 수가 없다.

 

ML모델은 DceisionTreeClassifier

train_test_split()을 이용해 데이터 세트는 전체의 30%, 학습데이터는 70%로 분리

 

3) 검증-교차검증

 

보통은 train set 으로 모델을 훈련, test set으로 모델을 검증한다. 기에는 한 가지 약점이 존재한다.

고정된 test set을 통해 모델의 성능을 검증하고 수정하는 과정을 반복하면, 결국 내가 만든 모델은 test set 에만 잘 동작하는 모델이 된다. 즉 test set에 과적합(Overfitting)하게 되므로 다른 실제 데이터를 가져와 예측을 수행하면 엉망인 결과가 나와버리게 된다.

 이를 해결하고자 하는 것이 바로 교차 검증(cross validation)이다

  ->교차 검증은 train set을 train set + validation set으로 분리한 뒤, validation set을 사용해 검증하는 방식이다.

cf) 과적합 :  ML모델이 학습데이터에 과도하게 최적화(fit)되어, 학습된 데이터에는 좋은 성능을 보이지만 새로운 데이터로 예측할 때 예측성능이 과도하게 떨어지는 현상

1)k-Fold Cross Validation(k겹 교차검증)

보통 회귀 모델에 사용되며, 데이터가 독립적이고 동일한 분포를 가진 경우에 사용된다.

K-Fold 교차 검증 과정

  1. 전체 데이터셋을 Training Set과 Test Set으로 나눈다.
  2. Training Set를 Traing Set + Validation Set으로 사용하기 위해 k개의 폴드로 나눈다.
  3. 첫 번째 폴드를 Validation Set으로 사용하고 나머지 폴드들을 Training Set으로 사용한다.
  4. 모델을 Training한 뒤, 첫 번 째 Validation Set으로 평가한다.
  5. 차례대로 다음 폴드를 Validation Set으로 사용하며 3번을 반복한다.
  6. 총 k 개의 성능 결과가 나오며, 이 k개의 평균을 해당 학습 모델의 성능이라고 한다.

 

KFold를 통해 붓꽃 데이터 세트를 교차검증하고 예측 정확도를 알아보자

KFold(n_split=5)로  KFold 객체 생성

전체 붓꽃 데이터를 5개의 폴드 데이터 세트로 분리(30개씩 5개의 세트)

=> 교차 검증을 할 때 마다 학습과 검증을 반복해 예측의 정확도를 특정

각 교차 검증 정확도는 계속해서 달라지는 것을 알 수 있으며 5번의 검증 정확도를  평균낸 결과는 0.9

 

2)Stratified k-Fold Cross Validation(k겹 교차검증)

Stratified K 폴드는 불균형한(imbalanced) 분포도를 가진 레이블(결정 클래스) 데이터 집합을 위한 K폴드 방식-> 불균형한 분포도를 가진 레이블 데이터: 특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 것

ex-1억건의 금융 데이터 세트에 총 1000건의 대출사기 데이터가 존재한다면 이 대출사기 데이터의 비율은 0.0001%로 아주 작은 부분. 대출사기 데이터는 아주 작은 비율을 차지하는 데이터이지만 대출 사기를 예측할 수 있는 아주 중요한 피처 값을 가지고 있기 때문에 매우 중요한 데이터 세트(특정 학습/테스트 데이터 세트에는 대출사기 데이터가 상대적으로 많이 들어 있고, 다른 학습/테스트 데이터 세트에는 그렇지 못한 결과가 발생할 수 있다.)

=>원본 데이터와 유사한 대출 사기 데이터의 분포를 학습/테스트 세트도 유지하는 것이 중요하다

레이블 값0,1,2 모두 50으로 동일(Setosa, Versicolor, Virginica 품종 모두 50개)

이슈가 발생하는 현상을 유도하기 위해 3개의 폴드 세트를 KFold로 생성하고 각 교차 검증 시마다 생성되는 학습/검증 레이블 데이터 값의 분포를 확인해보자

완전히 다른 값으로 추출됩니다. 1번 교차 검증을 보면 0번 레이블에 대한 데이터는 하나도 학습되지 않았습니다. 따라서 이 경우에는 0번 레이블에 해당하는 데이터를 예측하지 못함을 의미

=>StratifiedKFold는 이렇게 KFold로 분할된 레이블 데이터 세트가 전체 레이블 값의 분포도를 반영하지 못하는 문제를 해결해준다

 

3)간편한 교차검증-cross_val_score()

1. 폴드 세트를 설정한다.

2. 반복문을 이용해 학습, 테스트 데이터의 인덱스를 추출한다.

3. 학습과 예측을 반복하고 예측 성능을 반환한다.

=> 이걸 한번에 수행

-scoring 파라미터에 지정된 성능 지표의 측정값을 배열 형태로 반환합니다.

-또한 classifier가 입력되면 Stratified K 폴드 방식으로 레이블값의 분포에 따라 학습/테스트 데이터 세트를 분할합니다.(회귀는 K 폴드 방식)

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

하이퍼 파라미터란 머신러닝 알고리즘을 구성하는 주요 구성 요소이며, 이 값을 조정해 알고리즘의 예측 성능을 개선할 수 있다.

GridSearchCV는 Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 최적의 파라미터 조합을 찾는다.

데이터 세트를 cross-validation을 위한 학습/테스트 세트로 자동으로 분할한 뒤 하이퍼 파라미터 그리드에 기술된 모든 파라미트럴 순차적으로 적용하는 것으로 최적의 파라미터를 도출

6개의 하이퍼 파라미터의 조합을 변경하면서 교차 검증 데이터 세트에 수행 성능을 측정한다. (cv가 3회라면 개별 파라미터 조합마다 3개의 폴딩 세트를 3회에 걸쳐 학습/평가해 평균값으로 성능을 측정) 즉 cv가 3회 X 6개의 파라미터 조합 = 18회의 학습/평가가 이루어집니다.
params는 수행할 때마다 적용된 하이퍼 파라미터값을 가지고 있다. rank_test_score는 예측 성능의 순위. split(n)_test_score는 세개의 폴딩 세트에서 각각 테스트한 성능 수치. mean_test_score는 split(n)_test_socre의 평균치
GridSearchCV 객체의 fit()을 수행하면 최고 성능을 보인 하이퍼 파라미터의 조합은  best_params_ 에 , 최고의 성능 결과는  best_score_ 에 저장된다

=>이로써 모델검증은 여기써 끝!

별도의 테스트 데이터 세트로 정확도를 측정한 결과 약 96.67%의 성능이 측정(GridSearchCV를 이용해 최적의 하이퍼파라미터를 튜닝한 뒤 별도의 테스트 데이터 세트에서 이를 평가하는 방법을 사용)