Machine Learning/캐글스터디(파이썬 머신러닝)

[2장-2] 붓꽃 품종 예측_파이썬 머신러닝 완벽가이드

뉴욕킴 2023. 3. 20. 21:33

# 사이킷런을 이용하여 붓꽃(Iris) 데이터 품종 예측하기

 

1. 사이킷런 버전 확인
import sklearn
print(sklearn.__version__)

 

2. 붓꽃 예측을 위한 사이킷런 필요 모듈 로딩(필수 라이브러리 불러오기) 
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier  #결정트리 
from sklearn.model_selection import train_test_split   #학습과 분류 데이터

 

3. 학습 데이터와 테스트 데이터 세트로 분리

# X_train과 y_train은 모델을 학습시킬 때 사용되고(X_train과 y_train은 서로 겹치는 데이터가 없어야 함)

# X_test는 모델의 성능을 검증할 때, y_test는 모델을 평가할 때 사용


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

# X : 피쳐, y: 타겟으로 관습적으로 사용  
# feature: iris_data
# target data : iris_label
# test_size : 20%만 테스트로 만들어라
# random_stata 고정값(만약 실행해주지 않으면 실행 시마다 다른 결과가 나옴) 

 

4. 학습 데이터 세트로 학습(Train)수행
# DecisionTreeClassifier 객체 생성 :  데이터에 있는 규칙을 학습을 통해 자동으로 찾아내 트리 기반의 분류 규칙을 만드는 알고리즘이다.


dt_clf = DecisionTreeClassifier(random_state=11)

# 학습 수행 
dt_clf.fit(X_train, y_train)

 

5. 테스트 데이터 세트로 예측(Predict) 수행
# 학습이 완료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행. 
pred = dt_clf.predict(X_test)

 

6. 예측 정확도 평가 : accuracy_score
# y_test: 정답, pred: 예측한 것

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

 

-----------------------------------------------------------------------------------------------------

 

7. 데이터세트와 학습데이터 세트 분리

# 테스트 데이터 세트: 해당 모델이 일반화가 얼마나 잘 되어있는지 확인

 

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

dt_clf = DecisionTreeClassifier( )
iris_data = load_iris()

# 학습용 피쳐 데이터 세트: X_train, X_test
# 테스트용 : y_train, y_test

X_train, X_test,y_train, y_test= train_test_split(iris_data.data, iris_data.target, 
                                                    test_size=0.3, random_state=121)

# 데이터 세트를 전체의 30%, 학습 데이터 세트를 70%으로 분리
# random_state=121로 변경해 데이터 세트를 변화시키기, 호출할 떄마다 동일한 학습, 테스트용 데이터 세트를 생성하기 위해 주어지는 난수의 값

8. 예측 정확도 측정

dt_clf.fit(X_train, y_train)
pred = dt_clf.predict(X_test)
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))

 

-----------------------------------------------------------------------------------------------------

 

# 교차검증 (Kfold)

# K개의 폴드 세트를 만들어 K번 만큼 각 폴드 세트에 학습과 검증을 반복적으로 수행하고 K개의 결과를 평균한 결과를 가지고 예측 성능을 평가하는 방법 (가장 많이 사용)

 

# StratifiedKFold : 불균형한 분포도를 가진 레이블 데이터 집합을 위한 kfold의 방식

(원본 데이터의 레이블의 분포를 파악하고 이 분포와 동일하게 학습, 검증 데이터 세트를 분배) 

 

# 폴드 세트로 분리하는 Kfold 객체 사용

 

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold   #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)  # 4/5 학습용데이터= 120건, 1/5 검증용데이터: 30건
cv_accuracy = []
print('붓꽃 데이터 세트 크기:',features.shape[0])

 

n_iter = 0

# KFold객체의 split( ) 호출하면 폴드 별 학습용, 검증용 테스트의 로우 인덱스를 array로 반환  
for train_index, test_index  in kfold.split(features): 
    
    # 5번이 돌면서
    # 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)) 

 

# Stratified K 폴드
import pandas as pd

iris = load_iris()

iris_df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
iris_df['label']=iris.target #타겟값을 라벨로 주고
iris_df['label'].value_counts() #012 나열

 

kfold = KFold(n_splits=3)
# kfold.split(X)는 폴드 세트를 3번 반복할 때마다 달라지는 학습/테스트 용 데이터 로우 인덱스 번호 반환. 
n_iter =0
for train_index, test_index  in kfold.split(iris_df):
    n_iter += 1
    label_train= iris_df['label'].iloc[train_index]
    label_test= iris_df['label'].iloc[test_index]
    print('## 교차 검증: {0}'.format(n_iter))
    print('학습 레이블 데이터 분포:\n', label_train.value_counts())
    print('검증 레이블 데이터 분포:\n', label_test.value_counts())

 

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=3)
n_iter=0

for train_index, test_index in skf.split(iris_df, iris_df['label']):
    n_iter += 1
    label_train= iris_df['label'].iloc[train_index]
    label_test= iris_df['label'].iloc[test_index]
    print('## 교차 검증: {0}'.format(n_iter))
    print('학습 레이블 데이터 분포:\n', label_train.value_counts())
    print('검증 레이블 데이터 분포:\n', label_test.value_counts())

 

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.mean(cv_accuracy)) 

 

-----------------------------------------------------------------------------------------------------

# cross_val_score( ) : 교차검증과 최적 하이퍼파라미터 튜닝을 한번에 해주는 메소드 → 주로 많이 사용(간단하게 적용 가능)

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score 
from sklearn.datasets import load_iris
import numpy as np

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(scores, type(scores))
print('교차 검증별 정확도:',np.round(scores, 4))
print('평균 검증 정확도:', np.round(np.mean(scores), 4))

-----------------------------------------------------------------------------------------------------