사이킷 런 학습
- Cross Validation 이해
- K-fold
- Stratified-fold
- 모델에서 Dateset을 나누는 이유
Cross Validation의 이해
Dataset?* Machine Learning 모델을 만들기 위해 필요한 데이터 모임 * Machine Learning을 통해 해석이 필요한 데이터 모임 Vision에서 MINST, CIFAR-10, ImageNet 데이터 셋을 자주사용 Dateset나누기
Train model
- 모델의 Hyper-Parameter을 올바르게 정해주어야 한다
- lr, batch size 등등
- Bias : 모델의 Training data에 대한 예측값과 실제값의 오차
- Variance : 모델의 test data에 대한 예측값과 실제값의 오차
- High Bias : 훈련데이터를 제대로 표현 못함
- High variance : 훈련데이터를 지나치게 자세히 표현함. 새로운 데이터 예측 불가
- Validation : train셋으로 학습한 모델이 'Sample Bias' 되지 않았는지 확인
- Sample Bias : 훈련에 사용하지 않은 데이터에서 낮은 정확도를 보이는
- 데이터 셋이 작으면 train/valid/test로 분류하기 어려움
- 이럴땐 Cross Validation사용
- Train/test 두 개로 나눔
- 작은 데이터 셋에도 좋은 정확도
- k-Fold / Stratified K-Fold/ Leave one out/ Shuffle-split/ Bootstrap
- 이럴땐 Cross Validation사용
Cross Validation 종류
교차검증 통한 머신러닝 모델 성능 평가(K-Fold, Leave-one-out, Shuffle-Split) - [머신러닝]
< 교차검증 > 교차검증은 모델의 학습 과정에서 모델 생성을 위한 데이터셋을 학습(Training) / 검증(Validation) 데이터를 나눌 때 Validation데이터 셋에만 학습이 과적합 되어버리는 결과를 방지하기
yoon1seok.tistory.com
K-Fold
K개의 Fold를 만들어 진행하는 교차 검증식 K개의 모델의 Hyper-Parameter의 평균을 최종 결과로 사용
* 데이터 갯수가 적은 데이터 셋에서 정확도 향상 * 기존의 Train과 test로만 분류해 데이터 셋의 양이 더 많다
EX) 데이터가 150개 일때 K를 10으로 정하면 135개 Train, 15개 Test 10번 씩 135개 15개 나누어서 데이터 학습 시킴
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
iris = load_iris()
kfold = KFold(n_splits = 3)
# 분류 모델 불러오기
dt_clf = DecisionTreeClassifier()
# data를 k만큼 나눈다 k는 Hyper Parameter
for train_idx, test_idx in kfold.split(iris.data):
X_train, X_test = iris.data[train_idx], iris.data[test_idx]
y_train, y_test = iris.target[train_idx], iris.target[test_idx]
print(train_idx,test_idx)
dt_clf.fit(X_train,y_train)
pred = dt_clf.predict(X_test)
accuracy = np.round(accuracy_score(y_test,pred),4)
# 정확도 출력
print(accuracy*100)
Stratified K-Fold
데이터의 분포가 불균형할 때 데이터의 비율에 맞게 데이터 세트를 나누는 K-fold 방식 데이터가 편향되어 있을 때(데이터가 몰려있을때) 사용
StratifiedKFold(n_split, shuffle, random_state) n_split은 몇개로 분할할지 Shuffle은 섞일지 않섞을지(True, False)
K-Fold랑 차이를 보면은 인덱스 값들이 좀더 넓게 분포되어 있음고로 데이터가 몰려있는일을 방지가능
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np
iris = load_iris()
# 데이터 분포를 확인하기 위해 DataFrame을 만들어줍니다.
iris_df = pd.DataFrame(data = iris.data, columns = iris.feature_names)
iris_df['label'] = iris.target
# Classification에 사용할 모델 불러오기
dt_clf = DecisionTreeClassifier()
# Iris 데이터는 3개의 Class로 이루어져 있습니다.
# 2. 그러므로 3개의 Fold로 데이터를 나눕니다.
n_iter = 0
skf = StratifiedKFold(n_splits = 4)
avg_acc = []
for train_idx, test_idx in skf.split(iris.data, iris.target) : # iris 데이터에서 나누기
# Iter 수 증가
n_iter += 1
# 3. K 개수 만큼 Fold 나누기
train_label = iris_df['label'].iloc[train_idx]
test_label = iris_df['label'].iloc[test_idx]
print(train_idx),test_idx)
X_train, X_test = iris.data[train_idx], iris.data[test_idx]
y_train, y_test = iris.target[train_idx], iris.target[test_idx]
print("Iteration :", n_iter)
print("--------------------")
print("학습 데이터 분포 : \n", train_label.value_counts())
print("--------------------")
print("검증 데이터 분포 : \n", test_label.value_counts())
print("--------------------")
여기선 Iris 데이터 셋을 제공
ML 알고리즘
sklearn.ensemble : 앙상블 알고리즘 제공
sklearn.linear_model : 선형 회귀 및 로지스틱 회귀 등 Regression 관련 알고리즘 지원
sklearn.naive_bayes : 나이브 베이즈 알고리즘 제공 sklearn.neighbors : 최근접 이웃 알고리즘 제공
sklearn.svm : Support Vector Machine 알고리즘 제공
sklearn.tree : 의사 결정 트리 알고리즘 제공
sklearn.cluster : 비지도 클러스터링 (Unsupervised Clustering) 알고리즘 제공 각종 모델을 사용
사용할 모델.fit(train데이터, train종류들) pred = 사용할 모델.predict(train데이터)
정확도 검증 : sklearn.metrics(train종류들, pred)
import numpy as np
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = load_iris()
data_clf = DecisionTreeClassifier()
data_clf.fit(iris.data,iris.target)
pred = data_clf.predict(iris.data)
print(accuracy_score(iris.target,pred)*100)
#위와같은 정확도는 전체데이터를 검증데이터로 사용하므로 정확도가 모두같은 100% 확률이 나온다
X_train, X_test, Y_train, Y_test = train_test_split(iris.data,pred,test_size = 0.25)
data_clf.fit(X_train, Y_train) #데이터들을 data_clf모델로 학습 진행
pred = data_clf.predict(X_test) #위의 학습한 데이터를 성능 평가를위해 pred리스트에 삽입
print(accuracy_score(Y_test,pred))
train_test_split(arrays, test_size, train_size, random_state, shuffle, stratify)
arrays : 데이터 입력
test_size : Test data의 비율 (default = 0.25)
train_size : Train data의 비율 (default = 나머지 데이터)
random_state : shuffle을 위한 시드값
shuffle : shuffle 여부 (default = True)
stratify : Dataset의 비율 유지
'공부 > AI School 인공지능 여름캠프' 카테고리의 다른 글
머신러닝 의사결정트리(Decision Tree), 앙상블, 엔트로피 - [AI School] (0) | 2021.05.03 |
---|---|
머신러닝 분류 Classification - [AI School] (0) | 2021.05.03 |
머신러닝 회귀(Regression) 정리 - [AI School] (0) | 2021.05.03 |
탐색적 데이터 분석(EDA) 정리 - [AI School] (0) | 2021.05.03 |
파이썬 데이터 분석을 위한 함수 정리(Numpy, Pandas, Matplotlib) - [AI School] (0) | 2021.05.03 |