정의 : 데이터를 통해 모델을 만들고 사용하는 것
예측 모델링, 데이터 마이닝이라고도 불린다.
보통 주어진 데이터로 모델을 구축하고, 새로운 데이터에 만들어진 모델을 적용하면 다음과 같이 다양한 것을 예측해볼수 있다
<종류>
hold-out 기법
전체 데이터에서 7:3 또는 8:2 등 비율로 훈련 데이터와 테스트 데이터로 나눈다
훈련 데이터(training set)는 모델을 개발하기 위해, 테스트 데이터(test set)는 모델을 평가하기 위해 사용
k-묶음 교차검증
전체 데이터를 k-묶음으로 나눈 후 (k-1)개 묶음
hold-out + validation 기법
검증 데이터 셋을 추가하여, 훈련 데이터에 다시 hold-out 기법을 적용한 방법
검증 데이터셋은 훈련 데이터로 개발된 여러 모델의 성능을 비교하는데 사용되며, 선정된 최선의 모델의 성능은 테스트 데이터셋을 이용하여 평가
import random
from typing import TypeVar, List, Tuple
X = TypeVar('X')
def split_data(data: List[X], prob: float) -> Tuple[List[X], List[X]]:
# 데이터를 섞지 않고 나누는 함수
idx = int(len(data) * prob) # 데이터를 나누는 인덱스 계산
return data[:idx], data[idx:] # 데이터를 나누어 반환
data = [n for n in range(1000)] # 0부터 999까지의 숫자로 이루어진 데이터 생성
train, test = split_data(data, 0.75) # 데이터를 나눔
# 반환된 데이터의 길이가 올바른지 확인
assert len(train) == 750
assert len(test) == 250
# 반환된 데이터가 원본 데이터를 포함하고 있는지 확인
assert sorted(train + test) == data
학습 데이터, 평가 데이터에 x와 y가 제대로 쌍을 이뤄서 들어갈수 있도록 한다.
Y = TypeVar('Y') # 출력 변수를 표현하기 위한 일반적인 타입
def train_test_split(xs: List[X],
ys: List[Y],
test_pct: float) -> Tuple[List[X], List[X], List[Y], List[Y]]:
# Generate the indices and split them.
idxs = [i for i in range(len(xs))]
train_idxs, test_idxs = split_data(idxs, 1 - test_pct)
return ([xs[i] for i in train_idxs], # x_train
[xs[i] for i in test_idxs], # x_test
[ys[i] for i in train_idxs], # y_train
[ys[i] for i in test_idxs]) # y_test
xs = [x for x in range(20)] # xs are 1 ... 1000
ys = [2 * x for x in xs] # each y_i is twice
x_train, x_test, y_train, y_test = train_test_split(xs, ys, 0.25)
print(xs, ys)
print(x_train, x_test)
print(y_train, y_test)
# 비율이 맞는지 확인
assert len(x_train) == len(y_train) == 750
assert len(x_train) == len(y_test) == 250
# 대응되는 데이터들이 잘 짝지어졌는지 확인
assert all(y == 2 * x for x, y in zip(x_train, y_train))
assert all(y == 2 * x for x, y in zip(x_test, y_test))
# 모델 학습 하고, 성능 평가
model = SomeKindOfModel()
x_train, x_test, y_train, y_test = train_test_split(xs, ys, 0.33)
model.train(x_train, y_train)
performance = model.test(x_test, y_test)
Split arrays or matrices into random train and test subsets
Param
test_size, train_size: *float (0.0~1.) or int, default=None*
Returns
splitting*list, length=2 * len(arrays)*
모델의 분류와 정답
정확도 (accuracy)
accuracy = (tp + tn) / (tp + fp + fn + tn)
높게 나와도 의미가 없을 수 있음
정밀도(Precision) : Positive 라고 분류한 것 중에서 실제 Positive 인 것의 비율
재현율(Recall) : 실제 Positive 인 것 중에서 모델이 Positive라고 예측한 것의 비율
특이도(Specificity) : 실제 Negative 중 맞춘 Negative(TN)의 비율
위양성율(FRP : False Positive Rate) : 실제 Negative 중 틀린 Positive(FP)의 비율
위음성율(FNR : False Negative Rate) : 실제 Positive 중 틀린 Negative(FN)의 비율
환자 적용
정밀도와 재현율의 트레이드 오프 관계
조화 평균