n214_Logistic Regression

ssu_hyun·2021년 8월 22일
0

[codestates] AI Bootcamp

목록 보기
16/62

학습 목표

  • 훈련/검증/테스트(train/validate/test) 데이터를 분리하는 이유를 명확히 이해하고 사용합니다.
  • 분류(classification) 문제와 회귀문제의 차이점을 파악하고 문제에 맞는 모델을 사용 할 수 있습니다.
  • 로지스틱회귀(Logistic regression)를 이해하고 모델을 학습할 수 있습니다.



훈련/검증/테스트(train/validate/test) 세트


train & test data

훈련데이터와 테스트데이터를 분리함과 동시에 테스트데이터에서 타겟정보를 제외하는 가장 큰 이유는 "모델의 일반화 성능을 올바르게 측정하기 위해서"입니다.

성과 측정 : 학습과 테스트 데이터의 분리


train & validate data & test

이에 추가적으로 검증세트가 필요한 이유는 훈련세트로 모델을 한 번에 완전하게 학습시키기가 어렵기 때문입니다. 훈련세트로 다르게 (하이퍼파라미터)튜닝된 여러 모델들을 학습한 후 어떤 모델이 학습이 잘 되었는지(튜닝의 효과 확인) 검증하고 선택하는 과정이 필요합니다.(*테스트 세트로 하이퍼파라미터 튜닝을 하면 절대로 안됩니다. )

데이터가 많을 경우에는 전체 데이터를 훈련/검증/테스트 세트로 나누면 되지만, 상대적으로 데이터 수가 적을 경우 K-fold 교차검증(k-fold cross-validation) 을 진행할 수 있습니다. 물론 이때도 테스트 세트는 미리 떼어 놓아야 합니다.

이렇게 훈련/검증세트로 좋은 모델을 만들어 낸 후 최종적으로 테스트세트에는 단 한번의 예측테스트를 진행합니다. 최종테스트 결과가 마음에 들지 않는다고 모델을 또 수정하여 테스트 세트를 더 잘 예측하는 모델을 만든다면 그 모델은 테스트세트에 과적합하여 일반화 성능이 떨어지게 될 수 있습니다.

  • 훈련데이터(train) : 모델을 Fit 하는데 사용합니다.
  • 검증데이터(val) : 예측 모델을 선택하기 위해서 예측의 오류를 측정할 때 사용합니다.
  • 테스트데이터(test) : 일반화 오류를 평가하기 위해 선택된 모델에 한하여 마지막에 한 번 사용합니다. 테스트데이터가 유출(leak)이 되어 훈련/검증과정에 사용이 되면 모델을 잘못 평가하게 되므로 훈련이나 검증과정에서 사용하지 않도록 주의해야 합니다.

모델 검증


# Presence or absence of cardiovascular disease => 0 = No, 1 = Yes
target = 'cardio'
feature = df.columns[:-1]

#훈련, 테스트 데이터
from sklearn.model_selection import train_test_split
train, test = train_test_split(df, test_size=0.2, train_size=0.8, random_state=2)

# 훈련, 검증 데이터
train, val = train_test_split(train, test_size=0.2, train_size=0.8, random_state=2)

# feature matrix, target vector
X_train = train[feature]
y_train = train[target]

X_val = val[feature]
y_val = val[target]

X_test = test[feature]
y_test = test[target]

# 데이터의 volume 확인
print("훈련용 데이터 확인 / features: {0}, target{1}".format(X_train.shape, y_train.shape))
print("검증용 데이터 확인 / features: {0}, target{1}".format(X_val.shape, y_val.shape))
print("테스트용 데이터 확인 / features: {0}, target{1}".format(X_test.shape, y_test.shape))



분류(Classification)


타겟 범주 비율

분류문제 에서는 타겟 변수가 편중된 범주비율을 가지는 경우가 많으므로 문제를 풀기전에 항상 먼저 타겟 범주가 어떤 비율을 가지고 있는지 확인해 보아야 합니다.

# 타겟을 정합니다
# survived => 0 = No, 1 = Yes
target = 'Survived'


# target 범주 비율 확인
y_train.value_counts(normalize=True)


# target 범주 비율 시각화
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.countplot(x=y_train);



기준모델(Base model)

분류문제는 회귀문제와 다른 기준으로 기준모델을 설정합니다.

  • 회귀문제 : 보통 타겟 변수의 평균값을 기준모델로 사용합니다.
  • 분류문제 : 보통 타겟 변수에서 가장 빈번하게 나타나는 범주를 기준모델로 설정합니다.
  • 시계열(time-series) 데이터 : 보통 어떤 시점을 기준으로 이전 시간의 데이터가 기준모델이 됩니다.
# mode(): Return the highest frequency value in a Series.
major = y_train.mode()[0]


# 타겟 샘플 수 만큼 담긴 리스트를 만듭니다. 기준모델로 예측
y_pred = [major] * len(y_train)



평가지표(evaluation metrics)

정확도(Accuracy) 는 분류문제에서 사용하는 평가지표입니다.
절대로 회귀 평가지표를 분류에 사용하면 안됩니다. 그 반대도 마찬가지 입니다.

Accuracy = 올바르게예측한수전체예측수\frac{올바르게 예측한 수} {전체 예측 수} = TP+TNP+N\frac{TP + TN} {P + N}

# 기준 모델 정확도_train
from sklearn.metrics import accuracy_score
print("기준모델과 훈련용 데이터 학습 정확도: ", accuracy_score(y_train, y_pred))


# 기준 모델 정확도_val
y_pred = [major] * len(y_val)
print("기준모델과 검증용 데이터 학습 정확도: ", accuracy_score(y_val, y_pred))

scikit-learn, Scoring functions
Proportion of correct classifications




📌선형 분류 : 로지스틱 회귀(Logistic Regression)


분류문제를 선형회귀모델을 사용해 학습한다면!?

회귀모델은 타겟값이 음수에서 양수까지 나타나므로 예측값이 정확히 어떤 클래스에 속하는지 결과를 분명히 알 수 없습니다. (ex. 생존인지 아닌지) 게다가 회귀이기 때문에 분류모델에 사용하는 평가지표를 사용할 수 없습니다. 로지스틱회귀를 사용하면 타겟변수의 범주로 0과 1을 사용할 수 있으며 각 범주의 예측 확률값을 얻을 수 있습니다.

0개의 댓글