AI·빅데이터 융합 경영학 Study Note
[ML수업] 5주차 실습1: Cross-Validation(LOOCV(Leave-One-Out), Shuffle-Split) 본문
[ML수업] 5주차 실습1: Cross-Validation(LOOCV(Leave-One-Out), Shuffle-Split)
SubjectOwner 2023. 11. 21. 15:49Cross-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 횟수만큼 반복됨 (다른 블로그에서 복붙함) (이해 안됨.)
'AI·ML' 카테고리의 다른 글
[ML수업] 6주차 이론: measuring model performance(모형평가) (0) | 2023.11.21 |
---|---|
[ML수업] 5주차 실습2: model tuning(hyperparameter optimization), grid search CV, randim search CV, Baysian optimization with optuna (0) | 2023.11.21 |
[ML수업] 4주차 이론: cross validation (교차검증) (0) | 2023.11.21 |
[ML수업] 3주차 이론2: decision tree (의사결정나무) (0) | 2023.11.21 |
[ML수업] 3주차 이론1: overfitting and regularization (과적합과 정규화) (0) | 2023.11.21 |