이번 캐글 대회를 참여하며 데이터로 많이 고생을 했다.
자꾸 뭐만 하면 터지는게 너무 속상했는데............. 아마 분명 처음으로 캐글에 참여해보다 보니 코드 효율성이 부족해서 그런거라 생각한다.
그러던 중 매우 유용한 코드를 하나 발견했다.
# Reduce Memory Usage
# reference : https://www.kaggle.com/code/arjanso/reducing-dataframe-memory-size-by-65 @ARJANGROEN
def reduce_memory_usage(df):
start_mem = df.memory_usage().sum() / 1024**2
print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
for col in df.columns:
col_type = df[col].dtype.name
if ((col_type != 'datetime64[ns]') & (col_type != 'category')):
if (col_type != 'object'):
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:
pass
else:
df[col] = df[col].astype('category')
mem_usg = df.memory_usage().sum() / 1024**2
print("Memory usage became: ",mem_usg," MB")
return df
각 컬럼을 확인하며 숫자인지 확인 후 정수로 될수있는지, 최소 최대를 보고 데이터 유형을 결정하는
데이터셋을 최적화하는 코드였다.
해당 코드의 출처는 아래 사이트이다.
https://www.kaggle.com/code/arjanso/reducing-dataframe-memory-size-by-65
물론 메모리 터짐의 주된 이유는 모델때문으로 보였기에 데이터셋을 메모리 줄여도 여전히 고통받았지만,
앞으로도 자주 쓸거같은 코드여서 기재해둔다.
'데이터 사이언스 > 캐글' 카테고리의 다른 글
결측치를 처리하는 방법 (0) | 2024.08.16 |
---|---|
앙상블 기법 (0) | 2024.08.16 |
캐글 데이터 셋 코랩에서 사용하기. kaggle data on colab (0) | 2024.07.16 |
처음 시도하는 캐글 (0) | 2024.07.05 |