# 사이킷런을 이용하여 붓꽃(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))
-----------------------------------------------------------------------------------------------------
'Machine Learning > 캐글스터디(파이썬 머신러닝)' 카테고리의 다른 글
[3장-3] 피마 인디언 당뇨병 예측 (0) | 2023.04.08 |
---|---|
[3장-2] 정밀도와 재현율의 맹점 (0) | 2023.04.07 |
[3장-1] 분류 성능 평가 지표 (0) | 2023.04.04 |
[2장-3] 타이타닉 생존자 예측 ML 구현 (0) | 2023.04.03 |
[2장-1] 싸이킷런_파이썬 머신러닝 완벽가이드 (0) | 2023.03.20 |