빅데이터 전문가 되기

머신러닝 Data Leakage 본문

머신러닝

머신러닝 Data Leakage

지야소이 2023. 4. 18. 22:37

👀 머신러닝이란?

: 사용하는 데이터를 기반으로 학습 또는 성능 향상을 지원하는 시스템을 구축하는데 초점을 맞추는

  인공 지능(AI)의 하위 집합입니다.

 

여기서,  Data Leakage는 머신러닝 예측 모델 개발 시 문제가 될 수 있습니다.

 

 

 

😄 예측모델의 목적?

: Total loss를 최대한 줄이고, training 데이터에 포함되지 않은 새로운 데이터의 정확도를 예측하는 모델을 개발하는 것.

 

 

😄 Data Leakage (데이터 누수) 란?

:  training data 밖에서 유입된 정보가 모델을 만드는데 사용되는 것을 의미합니다.

   즉, training data를 가지고 알고리즘 훈련을 하는데 예측하려는 정보 (test data)를 가지고 있을 때,

     data leakage라 할 수 있습니다.

 

 

😄 Data Leakage를 방지하는 방법?

- 데이터 준비 방법을 전체 데이터 세트에 적용하면 모델 성능을 잘못 추정하는 데이터 유출이 발생합니다.

- 데이터 준비는 데이터 유출을 방지하기 위해 훈련 세트에서만 준비해야 합니다.

 

 

예시로 data leakage를 들어보겠습니다.

# 코로나 확진 받은 적이 있는지 여부 예측
> 이름, 성별, 나이, 거주지, 직업, 백신접종여부, 코로나 검진키트 사용여부, 
  자가격리기간, 코로나 확진자 지원금 수령여부

 -> 여기서, '코로나 확진자 지원금'은 확진을 받은 사람만이 받을 수 있는 값이므로 모델의 예측도가 올라가게 됩니다.

                 따라서 이 변수를 사용하는 것은 바람직하지 않다고 볼 수 있습니다.

 

 

 

data leakage를 확인하기 위해서는 scikit-learn 패키지의 pipleline을 이용하도록 합니다.

data를 가지고 머신러닝을 진행하여 data leakage를 방지해보겠습니다.

 

 

 

👉 train 및 test set로 data 준비

: 잘못된 접근 방식부터 시작하여 확장된 데이터 세트를 이용하여 모델 평가하기

from sklearn.datasets import make_classification
# dataset 정의하기
x,y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
print(x.shape, y.shape)

> (1000, 20) (1000,)

-> 데이터 준비 방법을 적용 한 후 모델 평가하기 전에 데이터를 분할하는 것입니다.

 

👉 triain test 평가

from sklearn.model_selection import train_test_split
# MinMaxScaler : 정규화
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# dataset 정규화하기
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

# train set (67%), test set (33%) 분할하기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)

# 로지스틱 회귀 알고리즘 모델 적용
model = LogisticRegression()
model.fit(X_train, y_train)

# 모델 평가
yhat = model.predict(X_test)

# 예측 평가
accuracy = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % (accuracy*100))

> Accuracy: 84.848

-> 모델의 추정치 (정확도)는 84.848% 입니다.

    정규화한 후에 train data와 test data를 분할하였으므로 이 모델의 정확도 추정치는 잘못 된 을 알 수 있습니다.

 

 

 

👉 train 및 test set로 data 준비

: train set에 데이터 준비를 맞춘 후 train 및 test set에 변환을 적용하여 모델 평가하기

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# dataset 정의하기
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)

# train set (67%), test set (33%) 분할하기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)

# dataset 정규화하기
## 전체 dataset가 아닌 set만 사용하여 계산하므로 데이터 유출 방지
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

# 로지스틱 회귀 알고리즘 모델 적용
model = LogisticRegression()
model.fit(X_train, y_train)

# 모델 평가
yhat = model.predict(X_test)

# 예측 평가
accuracy = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % (accuracy*100))

> Accuracy: 85.455

-> 모델의 추정치 (정확도)는 85.455% 입니다.

    데이터 유출로 추정한 정확도보다 더 정확한 값을 나타내고 있다.

 

 

 

👉 k - 교차 검증하기

: 잘못된 접근 방식부터 시작하여 확장된 데이터 세트를 이용하여 k- 교차 검증하기

from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
# dataset 정의하기
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
# dataset 정규화하기
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

# 모델 정의하기
model = LogisticRegression()

# 평가절차 정의하기
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
# 교차 검증을 사용하여 모델 평가하기
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)

# 최종 성과
print('Accuracy: %.3f (%.3f)' % (mean(scores)*100, std(scores)*100))

> Accuracy: 85.300 (3.607)

-> 모델의 평균 정확도 85.300% 이며, 표준편차 3.607 임을 알 수 있습니다.

 

 

 

 

👉 k - 교차 검증하기

: train set에 데이터 준비를 맞춘 후 train 및 test set에 변환을 적용한 데이터 k-교차 검증하기

# dataset 정의하기
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=7)

# pipeline 정의하기
steps = list()
steps.append(('scaler', MinMaxScaler()))
steps.append(('model', LogisticRegression()))
pipeline = Pipeline(steps=steps)

# 평가 절차 정의하기
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)

# 교차 검증을 사용하여 모델 평가하기
scores = cross_val_score(pipeline, X, y, scoring='accuracy', cv=cv, n_jobs=-1)

# 최종 성과
print('Accuracy: %.3f (%.3f)' % (mean(scores)*100, std(scores)*100))

> Accuracy: 85.433 (3.471)

-> 모델의 평균 정확도 85.433% 이며, 표준편차 3.471 임을 알 수 있습니다.

 

데이터 유출을 제거하면서 성능이 약간 향상되었음을 확인 할 수 있었습니다.

'머신러닝' 카테고리의 다른 글

회귀분석 (Regression analysis)  (0) 2023.05.25
머신러닝 - LightGBM  (0) 2023.04.19
더미변수 만들기  (0) 2023.04.19
머신러닝 입문  (0) 2023.04.19
인공지능 & 머신러닝 자료 모음  (0) 2023.04.13
Comments