https://www.kaggle.com/c/ieee-fraud-detection/data
 

IEEE-CIS Fraud Detection

Can you detect fraud from customer transactions?

www.kaggle.com

주로 이미지 관련한 competition이 주로 개최되다가 오랜만에 숫자값을 예측하는 대회가 열렸네요.

고객의 거래 데이터의 이상징후를 감지해보는 대회입니다.

대회의 데이터를 받아보면 상당히 많은 데이터로 메모리를 많이 잡아먹습니다. 실제로 불러오는데에도 시간이 많이 소비됩니다.

여러 커널에서는 메모리를 줄이기 위한 여러 코드를 사용하고 있는데요. 이 글에서는 다음 커널을 참조하였습니다.

https://www.kaggle.com/kabure/extensive-eda-and-modeling-xgb-hyperopt
 

Extensive EDA and Modeling XGB Hyperopt

Using data from IEEE-CIS Fraud Detection

www.kaggle.com


## Function to reduce the DF size
def reduce_mem_usage(df, verbose=True):
    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
    start_mem = df.memory_usage().sum() / 1024**2    
    for col in df.columns:
        col_type = df[col].dtypes
        if col_type in numerics:
            c_min = df[col].min()
            c_max = df[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)    
    end_mem = df.memory_usage().sum() / 1024**2
    if verbose: print('Mem. usage decreased to {:5.2f} Mb ({:.1f}% reduction)'.format(end_mem, 100 * (start_mem - end_mem) / start_mem))
    return df

실제로 데이터의 type들을 출력해보면 대부분 int64, float64로 이루어져있습니다. 

실제 데이터는 int64로 type이 잡혀있지만 실제로 데이터의 범위는 int16범위에만 속한다면?

이에 맞게 줄여줘야 메모리 사용을 줄일 수 있지 않을까요??

위 커널(뿐만 아니라 다른 커널까지)은 이 외에 데이터를 다루는데에 여러 시각화 기법과 Modeling 기법을 설명하고 있습니다.

이 커널만 분석하여도 꽤나 많은 정보를 얻으실 것 같네요.