지금까지는 fast ai와 pytorch를 통해 dnn을 사용해왔다.

 

이제는 scikit learn, pandas, numpy를 이용해서 머신러닝 알고리즘을 사용하고자 한다.

 

[1. 데이터]

 

데이터는 캐글의 데이터를 사용하였다. 캐글의 api key를 받아서 api를 사용하여 csv파일을 다운로드 받을 수 있었다.

목적: predict sale price of equipment at auction based on usage, type, config ...

 

가장 먼저, 데이터의 구성을 확인해야한다.

1) 어떻게 저장되어 있는 지

2) 어떤 type의 데이터들이 있는 지 확인을 해야한다.

 

가장 먼저 pandas의 read_csv 메소드를 사용하여 validandtrain.csv파일을 가지고 왔다. 데이터가 불러졌는지와 어떤 데이터 타입이 있는 지 확인하기 위해서 df.columns, df.head()함수를 사용하여 확인하였다. 너무 많은 columns를 가지고 있었는데 그 중 중요한 것들만 살펴보도록 하자.

 

(read_csv를 사용할때 default로 low_memory = True가 되어있다. 이를 False로 사용하면 피쳐가 누락되는 것을 막을 수 있다.)

 

데이터에서 우리가 해야할 것은 크게 아래 3가지다.

1) ordinal columns 다루기 -> 2)dependent variable 다루기 -> 3)date 다루기

 

1) ordinal data는 순서가 있는 category data로써 예를 들어서 product size, ratings가 있다.

크다 > 조금 크다 > 중간 > 조금 작다 > 작다처럼 크기를 나눌 수 있다.

 

먼저, df['productsize'].unique를 통해 종류를 확인한다. 이때 object type이므로 df['product'].astype('category')를 통해 타입을 바꿔준다. 그리고, df['productsize'].cat.set_categories( size, ordered = True, Inplace = True)를 통해서 종류를 지정해준다.

 

2) 우리가 predict할 변수를 봐야한다.

가장 중요한 것은 metric을 정하는 것인데 사실 우리가 정해야하지만 여기서는 캐글이 정해줬다. root square mean log error을 사용한다.

그래서 dependent variable에 log를 취해줘야한다.

df[dep_var] = np.log(df[dep_var])

 

3) date는 ordinal이 아니다!

어떤 시스템을 다루냐에 따라서 관련지어지는데 보통은 enrich representations of dates가 좋다.

 

우리는 decision trees algorithm을 사용하게 되는데 ordinal, category, numerical의 경우에는 보다 크냐/작냐 특정 종류냐/아니냐로 나눌 수 있는데 date의 경우에는 최근이냐/과거냐보다는 --> 월,화,수...토,일 중 언제냐? holiday? 월이 무엇이냐에 따라 나누는 것이 좋다.

 

즉, date column -> holiday, day of week, month columns...로 나눈다는 것이다.

 

이때 fast ai에서는 df = add_datepart(df, 'saledate')라는 메소드를 제공하여 여러 개의 meta data columns로 나눠준다.

 

' '.join( o for o in df.columns if o.startswith('sale'))을 통해서 컬럼들을 확인할 수 있다.

 

[2.알고리즘]

 

decision tree는 데이터에 대해서 계속 물어보는 것으로 모든 피쳐의 모든 레벨에 대해서 묻고 그룹을 두 개로 나눈다 그리고 나눈 두 그룹의 prediction과 actual value를 비교하여 split point를 찾고 정지조건을 만족할때까지 재귀적으로 각 그룹에 대해서 반복한다. 이때, 정지조건은 개발자가 정한다.

+ Recent posts