정보의 누수 & 데이터 랭글링

sy_healing·2022년 5월 15일
0

데이터 사이언티스트 실무 프로세스

지난 번에 첫 프로젝트 할 때는 문제랑 주제가 다 주어졌었다. 그래서 문제에 대해서는 생각할 필요가 없었지만, 사실 데이터사이언티스의 업무는 문제 해결을 위해 시작된다. 아무리 좋은 데이터와 모델이 있어도 이는 일종의 도구일 뿐, 전반적인 프로세스를 잘 이해해야 방향성을 가지고 좋은 인사이트를 도출할 수 있다.

실무 프로세스는 다음과 같다.

  • 1. 비지니스 문제
    : 어떤 문제를 해결하고자 하는가? (주로 실무자들과 대화를 통해서 문제를 발견한다.)
    2. 데이터 문제
    : 그 문제와 관련된 데이터를 발견
    3. 데이터 문제 해결
    : EDA 및 시각화, 머신러닝/통계 기법
    4. 비지니스 문제 해결
    : 데이터 문제 해결을 통해 실무자들과 함께 해결

어떤 문제를 해결하고자 하는지, 잘 생각해보고 방향성을 잡아야한다. 지난번 프로젝트 때는 해결해야할 문제만 생각하고 첫 프로젝트다 보니 방향성을 잘못잡아서, 하다가 엎고 하다가 엎는 것을 두어번 반복했다. 그렇기 때문에 항상 해결하고자 하는 문제를 명확히 파악하는 것이 중요하다.


💡 정보의 누수(Data Leakage)

모델을 학습시키고 검증 데이터로 검증했을 때 엄청나게 스코어가 잘 나오는 경우가 있다. 그러나 테스트 셋을 통해 최종 성능을 확인하면 결과가 좋지 않을 때, 우리는 정보의 누수를 생각할 필요가 있다.

Data Leakage는 train set이 target에 대한 정보를 가지고 있긴 하지만 실제 예측에 그 정보를 사용할 수 있을 때 발생한다. 즉, train과 val set에 대해 학습을 잘 했어도, 모델이 결국 제대로 성능을 내지 못한다는 의미이다.

Data Leakage는 두 가지 원인으로 발생하게 된다.

  • Train-Test Contamination

Train 데이터와 Val 데이터를 제대로 구분하지 않았을 때 발생하게 된다.

Train data와 val data를 나누기 전에 전처리를 실행한다고 생각해보면, (결국, 전처리 하고 data split한다는 것) 당연히 모델의 검증 점수가 올라갈 수 밖에 없다. val data를 예측 방법에 통합했기 때문이라고 생각하면 된다. 그럼 특정 데이터에 대해서는 좋은 성능을 내겠지만, Unseen data에 대해서는 성능이 좋지 못하다. 이러한 문제는 특성 공학이 복잡해 질 수록 더욱 위험해 진다.

결국 train-test set을 나누고 전처리를 하는 것이 좋으며, 이러한 문제는 pipeline을 이용하여 휴먼 에러를 방지할 수 있다. 특히 교차검증을 할 때는 이 pipeline을 이용하는 것이 아주 중요하다는 것을 기억하자.

  • Target Leakage

예측 시점에 사용할 수 없는 데이터가 데이터 셋에 포함되어 있을 경우 발생하게 된다.

예를 들어, target이 암의 발병 여부인데 데이터 셋에 항암치료라는 feature가 있다고 가정해보자. 항암 치료는 이미 암이 생긴 후에 하는 치료이기 때문에, target이 없이 항암치료라는 feature만 가지고 target를 유추할 수 있게 된다.

결국 target에 지나치게 영향을 주는 featrue는 제거를 해줌으로 데이터 누수를 방지해야한다.


💡 데이터 랭글링(Data Wrangling)

데이터 랭글링은 raw data를 분석에 적합한 데이터로 바꿔주는 전체 과정이라고 생각하면 될 듯 하다. 결국 데이터 전처리를 하는 것과 크게 다를바가 없다고 생각해도 될 것 같다. (지금까지 Pandas를 통해서 하던 것들..)

이를 위해서는 Groupby, merge, concat 등을 이용할 수 있고, 오늘은 pandas 기능 중 많이 쓰는 함수를 몇가지 배웠는데 그 중에 새롭게 알게된 query에 대해서 정리를 해야겠다.

😶 [Pandas] Query

Query 함수는 조건에 부합하는 데이터를 추출할 때 많이 사용한다.
지금까지 나는 if문을 사용하거나 filter 변수에 조건을 부여하면서 사용했었는데, query를 사용해보니 가독성이 좋고 아주 편리했다.

몇가지 예를 들어서 query 사용법을 기억해 둬야겠다.

📖 Python

import pandas as pd

df = pd.DataFrame({'A' : [1, 2, 3, 4, 5],
 			   'B' : ['red', 'yellow', 'blue', 'white', 'black']})


df.query('A > 3 and A < 5')  #=> 4 - white 추출
'''
논리 연산자
and, or, not
'''


df.query("A in (1, 3, 5)")   #=> 1, 3, 5 - red, blue, black 추출
'''
in 연산자
in, ==, not in, !=
'''

df.query('A > 3')  => 4, 5 - white, black 추출
'''
비교 연산자
==, >, >=, <, <=, !=
'''

[데이터 랭글링에 관해 정리된 내용]


0개의 댓글