본문 바로가기

Euron/정리

[Week1] 02. 사이킷런으로 시작하는 머신러닝

01. 사이킷런 소개와 특징

Anaconda를 설치하면 기본으로 설치가 완료된다.

내 버전은 1.2.2 이다. 추천하는 버전은 1.0.2인데 다른 모듈이랑 충돌이 나는 듯...다운그레이드가 안된다.

일단 실행에는 문제가 없어서 그냥 이 버전으로 실습함.

 


02. 첫 번째 머신러닝 만들어 보기 - 붓꽃 품종 예측하기

 

대표적인 지도학습의 방법 중 하나인 분류(Classification)을 이용한다.

 

함수 정리

  • sklearn.databases : 사이킷런에서 자체적으로 제공하는 데이터 세트를 생성하는 모듈의 모임
    • load_iris() : 붓꽃 데이터 생성
  • sklearn.tree : 트리 기반 ML 알고리즘을 구현한 클래스의 모임
    • DecisionTreeClassifier : ML 알고리즘으로 의사 결정 트리(Decision Tree) 알고리즘을 이용한다.
      • fit() : 학습용 피처데이터와 레이블 데이터 세트를 통해 학습을 수행한다.
      • predict() : 테스트용 피처 데이터 세트를 통해 예측을 수행하고 예측값을 반환한다.
  • sklearn.model_selection : 학습 데이터와 검증 데이터, 예측 데이터로 데이터를 분리하거나 최적의 하이퍼 파라미터로 평가하기 위한 모듈의 모임
  • train_test_split() : 데이터 세트를 학습 데이터와 테스트 데이터로 분리한다.
    • test_size 파라미터 입력값의 비율로 데이터를 분리 한다. test_size=0.2인 경우 테스트 데이터가 20%
    • 첫 번째 파라미터에는 피처 데이터 세트, 두 번째 파라미터에는 레이블 데이터 세트를 넣는다.
    • 함수 호출 시 무작위로 데이터를 분리하므로 random_state를 지정하여 동일하게 분리한다.
  • accuracy_score() : 실제 레이블 데이터 세트와 예측 레이블 데이터 세트를 순서대로 넣어 정확도를 측정한다.

실제로 붓꽃 데이터 세트를 로딩한 후  DataFrame으로 변환한다.

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import pandas as pd

# 붓꽃 데이터 세트를 로딩합니다. 
iris = load_iris()

# iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가지고 있습니다. 
iris_data = iris.data

# iris.target은 붓꽃 데이터 세트에서 레이블(결정 값) 데이터를 numpy로 가지고 있습니다. 
iris_label = iris.target
print('iris target값:', iris_label)
print('iris target명:', iris.target_names)

# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환합니다. 
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)

#output

결과

label은 품종명 순서대로 label 값을 가진다.

 

X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, 
                                                    test_size=0.2, random_state=11)

위와 같이 train_test_split()을 실행하면 각 변수에는 순서대로 학습용 피처 데이터 세트, 테스트용 피처 데이터 세트, 삭습용 레이블 데이터 세트, 테스트용 레이블 데이터 세트로 반환한다.

 

 

다음으로 DecisionTreeClassfier를 객체로 생성한 후, 객체의 fit() 메서드에 학습용 피처 데이터  속성과 결정값 데이터 세트를 입력해 호출하면 학습을 수행한다.

dt_clf = DecisionTreeClassifier(random_state=11)

dt_clf.fit(X_train, y_train)

위와 같이 학습을 완료하면, 학습된 DecisionTreeClassfier 객체를 이용해 예측을 수행한다.

예측은 학습 데이터가 아닌 다른 데이터를 이용해야 하면, 일반적으로 테스트 데이터 세트를 이용한다.

 

pred = dt_clf.predict(X_test)

다음으로 predict() 함수에 테스트용 피처 데이터 세트를 넣어 예측값을 얻는다.

 

 

위에서 얻은 예측값으로 정확도를 측정한다.

accuracy_score() 함수를 이용해 정확도를 측정할 수 있다.

from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))

# output

예측 정확도: 0.9333

 

따라서 붓꽃 데이터 세트로 분류를 예측한 프로세스를 정리하면 다음과 같다.

  1. 데이터 세트 분리 : 데이터를 학습 데이터와 테스트 데이터로 분리한다.
  2. 모델 학습 : 학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습시킨다.
  3. 예측 수행 : 학습된 ML 모델을 이용해 테스트 데이터의 분류(즉, 붓꽃 종류)를 예측한다.
  4. 평가 : 이러헥 예측된 결괏값과 테스트 데이터의 실제 결괏값을 비교해 ML 모델 성능을 평가한다.

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

EStimator 이해 및 fit(), predict() 메서드

 

모든 사이킷런 클래스는 fit()과 predict()만을 이용해 간단하게 학습과 예측 결과를 반환한다.

분류 알고리즘은 Classfier, 회귀 알고리즘은 Regressor 클래스로 구현한다. 이 두 클래스를 합쳐서 Estimator라 한다.

즉, Estimator는 지도 학습의 모든 알고리즘을 구현한 클래스!

evaluation 함수, 하이퍼 파라미터 튜닝을 지원하는 함수는 이 Estimator를 인자로 받는다. Estimator 내에 구현된 fit()과 predict() 함수를 호출하여 평가 혹은 튜닝을 수행한다.

사이킷런에서 비지도 학습을 구현한 클래스도 대부분 fit()과 transform()을 지원한다. fit()은 데이터를 변환하기 위한 사전 구조를 맞추는 작업이고, 실질적인 작업은 transform에서 구현한다.

 

사이킷런의 주요 모듈

  • 예제 데이터
    • sklearn.datasets : 사이킷런에 내장되어 예제로 제공하는 데이터 세트
  • 피처 처리
    • sklearn.preprocessing : 데이터 전처리에 필요한 다양한 가공 기능 제공(문자열 숫자형 코드 값으로 인코딩, 정규화, 스케일링 등)
    • sklearn.feature_selection : 알고리즘에 큰 영향을 미치는 피처를 우선순위대로 셀렉션 작업을 수행하는 다양한 기능 제공
    • sklearn.feature_extraction : 텍스트 데이터나 이미지 데이터의 벡터화된 피처를 추출하는데 사용된다.
  • 피처 처리& 차원 축소
    • sklearn.decomposition : 차원 축소와 관련한 알고리즘을 지원하는 모듛
  • 데이터 분리, 검증 & 파라미터 튜닝
    • sklearn.model_selection : 교차 검증을 위한 학습용/테스트용 분리, 그리드 서치로 최적 파라미터 추출 등의 api 제공
  • 평가
    • sklearn.metrics : 분류, 회귀, 클러스터링, 페어와이즈에 대한 다양한 성능 측정 방법 제공(Accuracy 등)
  • ML 알고리즘 
    • sklearn.ensemble : 앙상블 알고리즘 제공 (랜덤 포레스트, 에이다 부스트 등)
    • sklearn.linear_model : 즈로 쇠귀 관련 알고리즘을 지원, SGD 관련 알고리즘도 제공
    • sklearn.naive_bayes : 나이브 베이즈 알고리즘 제공(가우시안 NB, 다항 분포 NB 등)
    • sklearn.neighbors : 최근접 이웃 알고리즘 제공(K-NN)
    • sklearn.svm : 서포트 벡터 머신 알고리즘 제공
    • sklearn.tree : 의사 결정 트리 알고리즘 제공
    • sklearn.cluster : 비지도 클러스터링 알고리즘 데공(K-평균, 계층형 등)
  • 유틸리티
    • sklearn.pipeline : 피처 처리 등의 변환과 ML 알고리즘 학습, 예측 등을 함께 묶어서 실행할 수 있는 유틸리티 제공

 

내장된 예제 데이터 세트

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

fetch 계열의 명령은 인터넷에서 내려받아 scikit_learn_data라는 서브 디렉터리에 저장한 후 불러들이는 데이터(94p)

 

표본 데이터 생성기

  • datasets.make_classifications() : 분류를 위한 데이터 세트를 만든다.
  • datasets.make_blobs() : 클러스터링을 위한 데이터 세트를 무작위로 생성한다.

사이킷런에 내장된 데이터 세트는 보통 딕셔너리 형태로 구성되어 있다. 사이킷런의 Bunch클래스가 유사함.

 

각 키가 가리키는 데이터 세트의 의미

  • data : 피처의 데이터 세트. ndarray 타입
  • target : 분류 시 레이블 값. 회귀일 때는 숫자 결괏값 데이터 세트이다. ndarray 타입
  • target_names : 개별 레이블의 이름. ndarray 혹은 파이썬 list 타입
  • feature_names : 피처의 이름. ndarray 혹은 파이썬 list 타입
  • DESCR : 데이터 세트에 대한 설명과 각 피처의 설명. 스트링 타입
  • 각 키는 keys() 함수로 나타낼 수 있다.

04. Model Selection 모듈 소개

 

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

 

학습/테스트 데이터 세트 분리

 

전체 데이터를 삭습 데이터와 테스트 데이터 세트로 분리해준다.

반환값은 튜플 형태로, 순차적으로 학습용 피처 데이터 세트, 테스트용 피처 데이터 세트, 학습용 레이블 데이터 세트, 테스트용 레이블 데이터 세트가 반환된다.

 

파라미터 정리

  • test_size : 정체 데이터에서 테스트 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정한다. default=0.25
  • train_size : 전체 데이터에서 학습용 데이터 세트 크기를 얼마로 샘플링할 것인가를 결정. 잘 안씀.
  • shuffle : 데이터를 분리하기 전에 데이터를 미리 섞을지를 결정한다. default=True
  • randon_state : 수행할 때마다 동일한 데이터 세트로 분리하기 위해 randon_state를 일정한 값으로 부여한다.

교차 검증

 

예측 성능을 평가하기 위해 별도의 테스트용 데이터가 필요하다.

그러나 과적합(Overfiting)에 취약한 약점을 가질 수 있다. 이렇게 되면 다른 테스트용 데이터가 들어올 경우 성능이 저하되는데, 이러한 문제점을 개선하기 위해 교차 검증을 이용한다.

 

교차 검증은 데이터 편중을 막기 위해 별도의 여러 세트로 구성된 학습 데이터 세트와 검증 데이터 세트에서 학습과 평가를 수해한다.

각 세트에서 수행한 평가 결과에 따라 하이퍼 파라미터 튜닝 등의 모델 최적화를 쉽게 할 수 있다.

 

대부분의 ML 모델 성능 평가는 교차 검증 기반으로 1차 평가를 한 뒤 최종적으로 테스트 데이터 세트에 적용해 평가한다.

데이터 세트를 세분화해서 학습, 검증, 테스트 데이터 세트로 나눌 수 있다.

 

K 폴드 교차 검증 : K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 삭습과 검증 평가를 반복적으로 수행한다.

  • KFold : n_splits 인자로 n 개의 KFold 객체를 생성한다.
  • split() : 위에서 생성된 KFold 객체를 n개의 폴드 데이터 세트로 분리한다.
    • KFold 객체는 split()을 호출하면 학습용/검증용 데이터를 분할할 수 있는 인덱스를 반환한다.
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
import numpy as np

iris = load_iris()
features = iris.data
label = iris.target
dt_clf = DecisionTreeClassifier(random_state=156)

# 5개의 폴드 세트로 분리하는 KFold 객체와 폴드 세트별 정확도를 담을 리스트 객체 생성.
kfold = KFold(n_splits=5)
cv_accuracy = []
print('붓꽃 데이터 세트 크기:',features.shape[0])

n_iter = 0

# KFold객체의 split( ) 호출하면 폴드 별 학습용, 검증용 테스트의 로우 인덱스를 array로 반환  
for train_index, test_index  in kfold.split(features):
    # kfold.split( )으로 반환된 인덱스를 이용하여 학습용, 검증용 테스트 데이터 추출
    X_train, X_test = features[train_index], features[test_index]
    y_train, y_test = label[train_index], label[test_index]
    #학습 및 예측 
    dt_clf.fit(X_train , y_train)    
    pred = dt_clf.predict(X_test)
    n_iter += 1
    # 반복 시 마다 정확도 측정 
    accuracy = np.round(accuracy_score(y_test,pred), 4)
    train_size = X_train.shape[0]
    test_size = X_test.shape[0]
    print('\n#{0} 교차 검증 정확도 :{1}, 학습 데이터 크기: {2}, 검증 데이터 크기: {3}'
          .format(n_iter, accuracy, train_size, test_size))
    print('#{0} 검증 세트 인덱스:{1}'.format(n_iter,test_index))
    cv_accuracy.append(accuracy)
    
# 개별 iteration별 정확도를 합하여 평균 정확도 계산 
print('\n## 평균 검증 정확도:', np.mean(cv_accuracy))

# output(약간 생략)

#5 교차 검증 정확도 :0.7333, 학습 데이터 크기: 120, 검증 데이터 크기: 30
#5 검증 세트 인덱스:[120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
 138 139 140 141 142 143 144 145 146 147 148 149]

## 평균 검증 정확도: 0.9

 

Stratified K 폴드 : 불균형한 분포도를 가진 레이블(결정 클래스) 데이터 집합을 위한 K 폴드 방식

  • 원본 데이터와 유사한 레이블 값의 분포를 학습/테스트 세트에도 유자히야 한다.
  • StrarifiedKFold 클래스를 이용해 개선한다.
  • KFold와의 차이 : 분포도에 따라 학습/검증 데이터를 나누기 때문에 split() 메서드에 인자로 피처 데이터 세트뿐만 아니라 레이블 데이터 세트도 반드시 필요하다.
  • 회귀는 지원하지 않는다. 회귀의 결정값은 연속된 숫자값이므로.
dt_clf = DecisionTreeClassifier(random_state=156)

skfold = StratifiedKFold(n_splits=3)
n_iter=0
cv_accuracy=[]

# StratifiedKFold의 split( ) 호출시 반드시 레이블 데이터 셋도 추가 입력 필요  
for train_index, test_index  in skfold.split(features, label):
    # split( )으로 반환된 인덱스를 이용하여 학습용, 검증용 테스트 데이터 추출
    X_train, X_test = features[train_index], features[test_index]
    y_train, y_test = label[train_index], label[test_index]
    #학습 및 예측 
    dt_clf.fit(X_train , y_train)    
    pred = dt_clf.predict(X_test)

    # 반복 시 마다 정확도 측정 
    n_iter += 1
    accuracy = np.round(accuracy_score(y_test,pred), 4)
    train_size = X_train.shape[0]
    test_size = X_test.shape[0]
    print('\n#{0} 교차 검증 정확도 :{1}, 학습 데이터 크기: {2}, 검증 데이터 크기: {3}'
          .format(n_iter, accuracy, train_size, test_size))
    print('#{0} 검증 세트 인덱스:{1}'.format(n_iter,test_index))
    cv_accuracy.append(accuracy)
    
# 교차 검증별 정확도 및 평균 정확도 계산 
print('\n## 교차 검증별 정확도:', np.round(cv_accuracy, 4))
print('## 평균 검증 정확도:', np.round(np.mean(cv_accuracy), 4))

 

cross_val_score() : 교차 검증을 더 편리하게 수행하도록 도와주는 API

선언 형태 : cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_drspatch='2*n_jobs')

 

주요 파라미터 정리

  • estimator : 사이킷 런의 분류 알고리즘 클래스(Classifier or Regressor)
  • X : 피처 데이터 세트
  • y : 레이블 데이터 세트
  • scoring : 예측 성능 평가 지표
  • cv : 교차 검증 폴드 수

cv로 지정된 횟수만큼 scoring 파라미터로 지정된 평가 지표로 평가 결괏값을 배열로 반환한다. 그리고 이를 평균해 쳥가 수치로 사용한다.

 

GridSearchCV

 

Classifier나 Regressor와 같은 알고리즘에 사용되는 하이퍼 파라미터를 순차적으로 입력하면서 편리하게 최적의 파라미터를 도출할 수 있는 방안을 제공한다.

즉, 데이터 세트를 교차 검증을 위한 학습/테스트 데이터 세트로 자동으로 분할한 뒤에 하이퍼 파라미터 그리드에 기술된 모든 파라미터를 순차적으로 적용해 최적의 파라미터를 찾을 수 있게 한다.

(cv 값 * 파라미터 조합 개수) 번의 학습/평가가 이뤄진다.

 

주요 파라미터 정리

  • estimator : classifier, regressor, pipeline이 사용된다.
  • param_grid : key+리스트 값을 가지는 딕셔너리가 주어진다. estimator의 튜닝을 위해 파라미터명과 사용될 여러 파라미터 값을 지정한다.
  • scoring : 예측 성능을 측정할 평가 방법을 지정한다. 보통 평가 지표를 지정하는 문자열(accuracy 등)을 지정하나, 별도의 성능 평가 지표 함수도 지정할 수 있다.
  • cv : 교차 검증을 위해 분할되는 학습/테스트의 개수
  • refit : default=True 이며 True로 생성 시 가장 최적의 하이퍼 파라미터를 찾은 뒤 입력된 estimator 객체를 해당 파라미터로 재학습시킨다.
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV

# 데이터를 로딩하고 학습데이타와 테스트 데이터 분리
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, 
                                                    test_size=0.2, random_state=121)
dtree = DecisionTreeClassifier()

### parameter 들을 dictionary 형태로 설정
parameters = {'max_depth':[1,2,3], 'min_samples_split':[2,3]}

import pandas as pd

# param_grid의 하이퍼 파라미터들을 3개의 train, test set fold 로 나누어서 테스트 수행 설정.  
### refit=True 가 default 임. True이면 가장 좋은 파라미터 설정으로 재 학습 시킴.  
grid_dtree = GridSearchCV(dtree, param_grid=parameters, cv=3, refit=True)

# 붓꽃 Train 데이터로 param_grid의 하이퍼 파라미터들을 순차적으로 학습/평가 .
grid_dtree.fit(X_train, y_train)

# GridSearchCV 결과 추출하여 DataFrame으로 변환
scores_df = pd.DataFrame(grid_dtree.cv_results_)
scores_df[['params', 'mean_test_score', 'rank_test_score', \
           'split0_test_score', 'split1_test_score', 'split2_test_score']]

fit() 메서드를 수행하면 cv_results_속성에 파라미터 학습/평가를 수행한 결과를 기록한다.

따라서 cv_results_는 gridsearchcv의 결과 세트로서 딕셔너리 형태로 key값와 리스트 형태의 value를 가진다.

params 칼럼에는 수핼할 때마다 적용된 개별 하이퍼 파라미터값을 나타낸다.

rank_test_score 칼럼 값이 1인 결과가 결과 예측 성능이 1위라는 의미이다.

mean_test_score는 오른쪽 세 개의 score, 즉 개별 하이퍼 파라미터별로 cv의 폴딩 테스트 세트에 대해 총 수행한 평가 평균 값이다.

 

fit()을 수행하면 최고 성능을 나타낸 하이퍼 파라미터의 값과 그때의 결과 값이 각각 best_params, best_score_속성에 기록된다.

print('GridSearchCV 최적 파라미터:', grid_dtree.best_params_)
print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dtree.best_score_))

 

GridSearchCV 최적 파라미터: {'max_depth': 3, 'min_samples_split': 2}
GridSearchCV 최고 정확도: 0.9750

05. 데이터 전처리

결손값, 즉 NaN, Null 값은 허용되지 않는다.

피처값 중 Null 값이 얼마되지 않는다면 피처의 평균값으로 대체하고, Null 값이 대부분이라면 해당 피처는 드롭한다.

 

사이킷런의 ML 알고리즘은 문자열 값을 입력값으로 허용하지 않는다.

텍스트형 피터는 피처 벡터화 등의 기법으로 벡터화하거나 불필요한 경우 삭제한다.

 

데이터 인코딩

 

  • 레이블 인코딩(Label Encoding)
    • 카테고리 피처를 코드형 숫자 값으로 변환한다.
    • LabelEncoder 클래스로 구현한다.
    • 문자열 값이 어떤 숫자 값으로 인코딩 됐는지 알고싶다면 LabelEncoder 객체의 classes_ 속성값으로 확인한다.
      • 0번부터 순서대로 변환된 인코딩 값에 대한 원본값을 반환한다.
    • inverse_transform()을 통해 인코딩된 값을 다시 디코딩할 수 있다.
    • 레이블 인코딩은 숫자 값에 따른 순서나 중요도를 인식하지 않는 트리 계열의 ML 알고리즘에서 사용한다.
  • 원-핫 인코딩(One-Hot Encoding)
    • 피처 값의 유형에 따라 새로운 피처를 추가해 고유값에 해당하는 칼럼에만 1을 표시하고 나머지 칼럼에는 0을 표시하는 방식이다.
    • OneHotEncoder 클래스로 변환이 가능하다.
      • 입력값으로 2차원 데이터가 필요하다.
      • 변환값이 희소 행렬 형태이므로 이를 다시 toarray() 메서드를 이용해 밀집행렬로 변환해야 한다.
    • get_dummies()를 이용하면 원-핫 인코딩을 더 쉽게 구현할 수 있다.

피처 스케일링과 정규화

 

피처 스케일링(feature scaling) : 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업. 표준화와 정규화가 있다.

사이킷런의 Normalizer 모듈은 선형대수에서의 정규화 개념이 적용됐으며, 개별 벡터의 크기를 맞추기 위해 변환하는 것을 의미한다.

 

StandardScaler

 

표준화를 쉽게 지원하기 위한 클래스.

개별 피처를 평균이 0이고, 분산이 1인 값으로 변환해준다.

 

StandardScaler 객체를 생성한 후에 fit()과 transform() 메서드에 변환 대상 피처 데이터 세트를 입력하고 호출하면 간단하게 변환된다.

변환된 데이터 세트는 ndarray 이므로 이를 DataFrame으로 변환한다.

from sklearn.preprocessing import StandardScaler

# StandardScaler객체 생성
scaler = StandardScaler()
# StandardScaler 로 데이터 셋 변환. fit( ) 과 transform( ) 호출.  
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

#transform( )시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature 들의 평균 값')
print(iris_df_scaled.mean())
print('\nfeature 들의 분산 값')
print(iris_df_scaled.var())

# output

feature 들의 평균 값
sepal length (cm)   -1.690315e-15
sepal width (cm)    -1.842970e-15
petal length (cm)   -1.698641e-15
petal width (cm)    -1.409243e-15
dtype: float64

feature 들의 분산 값
sepal length (cm)    1.006711
sepal width (cm)     1.006711
petal length (cm)    1.006711
petal width (cm)     1.006711
dtype: float64

모든 칼럼 값의 평균이 0에 아주 가까운 값, 분산은 1에 아주 가까운 값으로 변환됐다.

 

MinMaxScaler

 

데이터값을 0과 1사이의 범위값으로 변환한다.(음수 값이 있다면 -1에서 1값으로 변환)

from sklearn.preprocessing import MinMaxScaler

# MinMaxScaler객체 생성
scaler = MinMaxScaler()
# MinMaxScaler 로 데이터 셋 변환. fit() 과 transform() 호출.  
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)

# transform()시 scale 변환된 데이터 셋이 numpy ndarry로 반환되어 이를 DataFrame으로 변환
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns=iris.feature_names)
print('feature들의 최솟값')
print(iris_df_scaled.min())
print('\nfeature들의 최댓값')
print(iris_df_scaled.max())

# output은 생략. 최솟값이 모두 0이고 최댓값은 1이 나온다.

 

학습 데이터와 테스트 데이터의 스케일링 변환 시 유의점

 

Scaler 객체를 이용해 학습 데이터 세트로 fit()과 transform()을 적용하면 테스트 데이터 세트로는 다시 fit()을 수행하지 않고 학습 데이터 세트로 fit()을 수행한 결과를 이용해 transform() 변환을 적용해야 한다.

 

각각 fit()을 수행하게 되면 학습 데이터와 테스트 데이터의 서로 다른 원본값이 동일한 값으로 변환될 수도 있다.

 


06. 사이킷런으로 수행하는 타이타닉 생존자 예측

 

주요 과정 정리

  • info() 결과에서 RangeIndex는 DataFrmae 인덱스의 범위를 나타내므로 전체 로우 수를 알 수 있다.
  • Null 값처리를 위해 fillna() 함수 사용
  • 선실 번호를 나타내는 Cabin의 경우 선실 번호 중 선실 등급을 나타내는 첫 번째 알파벳이 중요하므로, Cabin 속성은 앞 문자만 추출한다.
  • 시각화는 Seaborn 패키지를 이용한다.
    • barplot() 함수를 호출하면 가로 막대 차트를 쉽게 그릴 수 있다.
  • Age의 경우값 종류가 많으므로 범위별로 분류해 카테고리 값을 할당한다.
  • 남은 문자열 카테고리 피처를 숫자형 카테고리 피처로 변환한다.
    • LabelEncoder 클래스는 카테고리 유형 수에 따라 0~ (카테고리 유형 수-1)까지의 숫자 값으로 변환한다.
    • encode_features() 함수를 선언하고 문자열 카테고리를 리스트로 fit(), transform() 처리를 한 번에 한다.
  • ML 알고리즘인 결정 트리, 랜덤 포레스트, 로지스틱 회귀를 이용해 타이타닉 생존자를 예측한다.
    • DecisionTreeClassifier, RandomForestClassifier, LogisticRegression 클래스
    • LogisticRegression 클래스의 인자 sovler='liblinear' 는 로지스틱 회귀의 최적화 알고리즘

함수 정리

from sklearn.preprocessing import LabelEncoder

# Null 처리 함수
def fillna(df):
    df['Age'].fillna(df['Age'].mean(), inplace=True)
    df['Cabin'].fillna('N', inplace=True)
    df['Embarked'].fillna('N', inplace=True)
    df['Fare'].fillna(0, inplace=True)
    return df

# 머신러닝 알고리즘에 불필요한 피처 제거
def drop_features(df):
    df.drop(['PassengerId', 'Name', 'Ticket'], axis=1, inplace=True)
    return df

# 레이블 인코딩 수행.
def format_features(df):
    df['Cabin'] = df['Cabin'].str[:1]
    features = ['Cabin', 'Sex', 'Embarked']
    for feature in features:
        le = LabelEncoder()
        le = le.fit(df[feature])
        df[feature] = le.transform(df[feature])
    return df

# 앞에서 설정한 데이터 전처리 함수 호출
def transform_features(df):
    df = fillna(df)
    df = drop_features(df)
    df = format_features(df)
    return df
  • 예측 성능 평가는 정확도로 하며, accuracy_score() api를 이용
    • LogisticRegression이 가장 높은 정확도를 나타낸다.
  • 교차검증으로 결정 트리 모델을 더 펼가한다.
    • KFold 클래스, cross_val_score(), GridSearchCV 클래스 사용

# 참고

 

하이퍼파라미터 튜닝이란 무엇인가요?- 하이퍼파라미터 튜닝 방법 설명 - AWS (amazon.com)

 

하이퍼파라미터 튜닝이란 무엇인가요?- 하이퍼파라미터 튜닝 방법 설명 - AWS

하이퍼파라미터는 모델 구조, 기능 및 성능을 직접 제어합니다. 하이퍼파라미터 튜닝을 사용하면 데이터 과학자가 최적의 결과를 위해 모델 성능을 조정할 수 있습니다. 이 프로세스는 기계 학

aws.amazon.com

 

'Euron > 정리' 카테고리의 다른 글

[Week4] 04. 분류 - 캐글 실습  (0) 2023.09.29
[Week3] 04. 분류(2)  (0) 2023.09.21
[Week2] 04. 분류(1)  (0) 2023.09.17
[Week1] 03. 평가  (0) 2023.09.12
[Week1] 01. 파이썬 기반의 머신러닝과 생태계 이해  (0) 2023.09.11