AI·빅데이터 융합 경영학 Study Note

[ML수업] 5주차 실습1: Cross-Validation(LOOCV(Leave-One-Out), Shuffle-Split) 본문

AI·ML

[ML수업] 5주차 실습1: Cross-Validation(LOOCV(Leave-One-Out), Shuffle-Split)

SubjectOwner 2023. 11. 21. 15:49

Cross-Validation

 

# 사이킷런에서 제공하는 손으로 쓴 숫자(0~9) 이미지 데이터 세트 (8x8 픽셀)
from sklearn.datasets import load_digits

digits = load_digits()

# 'data', 'target', 'target_names', 'images', 'DESCR' 필드로 구성
digits.keys()
# dict_keys(['data', 'target', 'frame', 'feature_names', 'target_names', 'images', 'DESCR'])

# digits.data는 이미지 속성을, digits.target는 클래스 레이블(0~9)을 갖고 있음

 

import matplotlib.pyplot as plt
%matplotlib inline

# digits.data는 1차원 데이터이기 때문에 이미지를 도식하려면 2차원으로 변경해야 함
plt.imshow(digits.data[100].reshape(8,8), cmap=plt.cm.gray_r)
digits.target[100] #4

 

 

X, y = digits.data, digits.target

from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC

model = DecisionTreeClassifier()
#model = LogisticRegression()
#model = KNeighborsClassifier()
#model = SVC()

from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, scoring='accuracy'); scores
#array([0.775     , 0.71111111, 0.81337047, 0.82172702, 0.80222841])

 

# Change k
scores = cross_val_score(model, X, y, cv=30); scores

'''
array([0.775     , 0.71111111, 0.81337047, 0.82172702, 0.80222841])
array([0.75      , 0.71666667, 0.76666667, 0.8       , 0.93333333,
       0.88333333, 0.93333333, 0.86666667, 0.85      , 0.81666667,
       0.93333333, 0.81666667, 0.73333333, 0.83333333, 0.86666667,
       0.85      , 0.9       , 0.91666667, 0.93333333, 0.9       ,
       0.9       , 0.83333333, 0.85      , 0.9       , 0.9       ,
       0.83333333, 0.8       , 0.77966102, 0.88135593, 0.84745763])
'''

print("Mean: {:.3f}\nStd: {:.3f}\nMin: {:.3f}\nMax: {:.3f}".format(
    scores.mean(), scores.std(), scores.min(), scores.max()))
    
'''
Mean: 0.851
Std: 0.060
Min: 0.717
Max: 0.933
'''

 

 

LOOCV(Leave-One-Out) Cross Validation

# LOOCV is very time-consuming => useful in small data

from sklearn.model_selection import LeaveOneOut
scores = cross_val_score(model, X, y, cv=LeaveOneOut())
scores.mean()

#0.8603227601558152

 

Shuffle-Split Cross Validation

from sklearn.model_selection import ShuffleSplit

sscv = ShuffleSplit(test_size=.5, train_size=.4, n_splits=10)
scores = cross_val_score(model, X, y, cv=sscv)
scores.mean()
scores

'''
array([0.83426029, 0.7942158 , 0.83759733, 0.79310345, 0.81979978,
       0.810901  , 0.80088988, 0.8320356 , 0.82424917, 0.81535039])
'''

 

 

 

1. plt.imshow(digits.data[100].reshape(8,8), cmap=plt.cm.gray_r): 이 부분은 digits 데이터셋에서 100번째 이미지를 선택하고, reshape(8, 8)을 사용하여 이미지를 8x8 픽셀 그리드로 변환한 후, cmap=plt.cm.gray_r을 사용하여 그레이 스케일 이미지로 표시합니다. imshow 함수를 사용하여 이미지를 표시합니다.

 

 

2. X, y = digits.data, digits.target
X와 y 변수에 데이터를 할당하는 코드입니다.

 

X: 입력 데이터 또는 특성(feature) 데이터를 나타냅니다. 이 변수에는 각 숫자 이미지의 특성 정보가 포함되어 있습니다. 각 이미지가 숫자를 나타내는 8x8 픽셀 그리드로 표현되고, 각 픽셀 값은 특성으로 사용됩니다.

y: 출력 데이터 또는 타겟(target) 데이터를 나타냅니다. 이 변수에는 각 이미지가 나타내는 숫자(0부터 9까지의 정수)가 포함되어 있습니다. 각 이미지에 해당하는 숫자를 나타내는 레이블 정보입니다.

 

3. LOOCV(Leave-One-Out) Cross Validation

:  N(샘플 수 만큼)번의 model을 만들고, 각 모델을 만들 때에 하나의 샘플만 제외하면서 그 제외한 샘플로 test set performance를 계산하여 N개의 performance에 대해서 평균을 내는 방법 (다른 블로그에서 복붙함.)

 

 

4. Shuffle-Split Cross Validation

 

train_size만큼의 포인트로 train set를 만들고, test_size만큼(train set와 중첩되지 않는) 포인트로 test set를 만들도록 분할함

이 분할은 n_splits 횟수만큼 반복됨 (다른 블로그에서 복붙함) (이해 안됨.)