오히려 좋아..

상황이 나쁘게만 흘러가는 것 같을 때 외쳐보자.. .

궁금한 마음으로 포트폴리오 보기

Data Analysis and ML, DL/Tensorflow

[sklearn] 사이킷런으로 대용량 데이터 분석하기

junha6316 2020. 11. 20. 15:18

사이킷런은 GPU를 지원하지 않는다.

그래서 코랩 프로를 사용했을 때 이점이 그렇게 크지 않다. 더군다나 코랩은 고용량 RAM도 25기가 밖에 지원하지 않기 때문에 금새 OOM(Out of Memory)가 떠서 기껏 연산해놓은 작업이 날라가 버리는 불상사가 발생한다. 이 글은 제한된 컴퓨터 자원을 이용해 머신러닝을 하려는 사람들에게 도움이 됐으면 하는 마음으로 프로젝트를 하면서 사용했던 방법을 공유하는 글이다.

 

첫번째. 메모리를 사라.

이게 무슨 말인가? 제한된 컴퓨터 자원을 사용하는 사람을 위한 글이라더니 갑자기 메모리를 사라니?

맞다. 하지만 금전적인 여유가 있다면... 이 방법 저 방법 찾는바에야 메모리를 사서 해결하는 방법이 훨씬 더 간편하고 속편한 방법이다.

일단 메모리만 커져도 디스크 I/O가 적어져서 훨씬 빠르게 작업을 할 수 있다.

돈으로 해결할 수 있으면 돈으로 해결해라...

 

두번째. Input Data가 모두 필요한지 생각해보자

과연 학습하는데 모든 데이터가 다 필요한지 생각해보자. 그렇지 않을 확률이 높을 것이다.

모델을 학습하는데는 꼭 2가지를 고려해야한다.

 

학습시간(컴퓨팅 시간) vs 학습률(Accuracy)

 

물론 당신이 클래스(featurre)에 욕심이 있을 수 있다. 하지만 적은 피쳐로 학습시키고 파라미터 최적화를 통해 

학습률을 개선시킬 수 있다면 그것만큼 좋은 방법이 없을 것이다.

메모리 부족이나 데이터의 크기로 인해 학습조차 시킬 수 없다면 욕심을 버리고 가장 중요한 피쳐들만 골라서 학습 시켜보자

 

세번째 . 메모리를 필요한 크기만큼 할당하고 있는가?

일반적으로 데이터는 csv 파일로 구성되어 있고 Pandas에 있는 read_csv 같은 함수를 이용해 데이터를 메모리에 올릴 것이다.

하지만 read_csv는 임의로 데이터의 크기를 판단하기 때문에 필요 이상의 데이터를 할당할 수 있다. 꼭 데이터 범위를 확인해 필요한 만큼만 dtype를 정의해 필요한 메모리만큼 할당 하도록 하자

import pandas as pd
import numpy as np

dtype ={

	'a' : np.int8,
    'b' : np.int16,
    'c' : np.float64,
    'd' : object
    
}

df = pd.read_csv('data.csv', dtype= dtype)