기계학습 훈련 데이터 구성 방법

기계 학습으로 분석 모형을 만들기 위해서는 학습을 위한 데이터가 필요합니다. 보통 원래의 전체 데이터 셋에서 두 종류의 데이터로 구분해서 실험을 합니다.

  • 학습을 위한 데이터 셋 (training data)
  • 학습된 모델 검증을 위한 테스트용 데이터 셋 (test data)

이번 포스팅에서는 싸이킷런에서 제공하는 실험 데이터 구성을 지원하는 함수들을 살펴보겠습니다. 아래 설명되는 실험 데이터 구성 방식은 로보리포트의 기계학습 툴킷에서 그대로 사용이 가능합니다.

train_test_split 함수

train_test_split 함수는 전체 데이터셋 배열을 받아서 랜덤하게 훈련/테스트 데이터 셋으로 분리해주는 함수입니다. 함수 정의는 아래와 같습니다. 참고로 함수에 대한 자세한 설명은 링크에서 확인 가능합니다.


from sklearn.model_selection import train_test_split


sklearn.model_selection.train_test_split(array*, test_size, train_size, random_state, shuffle, stratify)[source]

필수 인자 값으로는 데이터들을 받습니다. 데이터는 list, arrays, matrics, dataframe 등 다양한 형태를 포함합니다. 클래스 값을 포함하여 하나의 데이터로 받을 수도 있고 클래스 값을 분리해서 두개의 데이터로도 받을 수 있습니다.

  • 클래스 값을 포함하여 하나의 데이터로 받는 경우

df_train, df_test = train_test_split(df, test_size=0.4, random_state=0)

  • 클래스를 개별의 배열로 받는 경우

train_x, test_x, train_y, test_y = train_test_split(X, Y, test_size = 0.5)

아래 다른 파라미터들은 다 옵션으로 선택 가능합니다.

test_size는 float, int 또는 None값을 사용합니다. 0에서 1의 값(float)을 입력하면 전체 데이터 셋에서 test set의 비율을 의미합니다. 0.3을 입력할 경우 전체 데이터의 30%를 랜덤하게 테스트로 사용합니다. 정수 값(int)을 입력하면 데이터 개수를 의미합니다. None을 입력하고 훈련 데이터 셋 사이즈를 지정할 경우 훈련 데이터셋을 뺀 나머지를 테스트 데이터로 사용합니다. 기본 값은 0.25입니다.

train_size는 float, int 또는 None값을 사용합니다. 0에서 1의 값(float)을 입력하면 전체 데이터 셋에서 train set의 비율을 의미합니다. 0.3을 입력할 경우 전체 데이터의 30%를 랜덤하게 훈련 데이터로 사용합니다. 정수 값(int)을 입력하면 훈련에 사용될 데이터 개수를 의미합니다. None을 입력하고 테스트 데이터 셋 사이즈를 지정할 경우 테스트 데이터셋을 뺀 나머지를 훈련 데이터로 사용합니다. 기본 값은 None입니다.

random_state는 int, randomstate instance 또는 None 값을 사용합니다. 정수 값을 입력하면 숫자를 random하게 생성할때 사용되는 seed 숫자로 사용되며, None을 입력하면 np.random에서 제공하는 random number generator가 사용됩니다.

shuffle은 bool 값으로 데이터를 분리하기 전에 데이터를 셖을 것인지 지정하며 기본값은 True이다.

stratify는 훈련/테스트 데이터들이 원래의 input dataset의 클래스의 비율과 같은 비율을 가지도록 할 것인지 지정한다. 예를 들어 0,1의 클래스가 input dataset에 20:80 비율로 있었다면 훈련 데이터와 테스트 데이터 역시 각각의 클래스가 같은 비율로 있도록 지정할 수 있다. 

이런 식으로 데이터를 비율 등으로 간단하게 데이터를 분리하여 실험 데이터를 구성할 수 있습니다. 다음 포스팅에서는 k-fold validation 방식을 설명하겠습니다 : )

scikit-learn을 사용하여 부동산 가격 예측하기 – 3) 실험 데이터 분석하기

scikit-learn을 사용하여 부동산 가격 예측하기

3) 실험 데이터 분석하기

본격적으로 실험을 하기전에 pandas의 resample 함수를 사용해서 데이터의 분포를 확인해 보려고 합니다.  pandas의 resample 함수에서는 시계열 데이터의 시간 간격을 재조정할 수 있습니다. 이 함수를 사용하기 위해서는 dataframe이 시간 관련 index(datetimeIndex, PeriodIndex, TimedeltaIndex 등)를 가져야 합니다. 이전 포스트에서 데이터를 읽어올 때부터 아래와 같이 date 칼럼을 index로 설정하여 바로 사용이 가능합니다. 

df = pd.read_csv(“economy.csv”, parse_dates =[“date”], index_col =”date”)


함수의 사용방법은 아래와 같습니다.

DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention=’start’, kind=None, loffset=None, limit=None, base=0, on=None, level=None)

rule에는 resample을 실행할 시간 단위를 적어둡니다. (아래 표 참조)
이 때 시간 구간이 작아지면 데이터 양이 증가한다고 해서 업-샘플링(up-sampling)이라 하고 시간 구간이 커지면 데이터 양이 감소한다고 해서 다운-샘플링(down-sampling)이라 부릅니다.



좀 더 보기좋게 시간 단위의 alias만 정리된 표는 아래와 같습니다.

시간 단위 alias

그리고 아래와 같은 기본적인 aggregation 함수들을 dispatching이라는 방법으로 간단하게 호출하여 resample 함수와 같이 사용할 수 있습니다.

이제 실제 데이터 분포를 확인해보겠습니다. 예전 포스팅에서 부동산 지수 예측을 위해 저장했던 dataframe을 사용하겠습니다. 기존 데이터를 년말 기준으로 resample을 해서 각 칼럼당 개별 년도의 mean 값을 확인해보겠습니다.

df.resample(rule=’A’).mean()

데이터가 2010년부터 2018년도 까지 있다는 것을 확인할 수 있습니다. 그리고 각각의 속성(칼럼)의 mean 값을 확인할 수 있습니다. 얼핏 봐도 cd 금리(cd)와 국가채(spirit_deposit_rate) 시간이 지날 수록 연도별 평균값이 점점 낮아지고 있는 것을 확인할 수 있습니다.

그럼 실제로 cd 금리로 시계열 그래프를 그려보도록 하겠습니다. jupyter notebook을 사용할 경우 %matplotlib inline 을 명시하면 노트북 내부에서 그래프가 표시됩니다. 월말 기준으로(rule=’M’) 바 그래프(‘bar’)를 plot함수를 사용하여 아래와 같이 그려보겠습니다.

%matplotlib inline
df[‘cd’].resample(rule=’M’).mean().plot(‘bar’)



cd 금리 그래프

간단하게 그래프가 그려졌습니다. 그렇지만 월별 데이터로 그리니 넘 촘촘하게 그려지고 있습니다.

년도 단위로 데이터가 얼마나 있나 확인하고 싶어 count 함수를 rule=’A’ 옵션과 같이 사용해서 그래프를 다시 그려봅니다.

2018년도 데이터가 다른 년도 데이터보다 더 적은 것을 확인 할 수 있습니다.

이런식으로 시계열 데이터를 간단히 그래프를 그릴 수 있습니다.
그럼 이제 본격적인 실험으로 들어가보도록 하겠습니다 : )