원자력발전소 상태 판단 경진대회

너무 큰 데이터 용량의 문제 - column

2020.07.06 12:22 6,390 Views

이번 글은 앞서 게재했던 해당 대회의 문제점 중에서 데이터의 크기와 범위도 값도 제각각인 5000개가 넘는 컬럼의 문제점을 다루겠습니다.


데이터의 크기가 너무 크다면?? 줄이면 되겠죠. 데이터의 중요한 부분만을 뽑아내어 줄인다면, 모델링이나 데이터 로드의 속도도 해결이 될 겁니다. 가장 먼저 주성분 분석을 통해서 줄이는 방법이 제일 먼저 생각날 겁니다. 하지만 상위권 분들 모두 PCA를 했더니 점수가 안좋아진다고 했습니다. 그래서 줄이는 방법을 2가지를 생각했습니다.

하나는 column을 줄이는 것이고, 또 하나는 row를 줄이는 것 입니다.


상위 팀들은 칼럼을 줄이는데에 실패를 했고, 우리 스터디는 칼럼을 줄이는 데에 성공했습니다. 우리 스터디가 column을 줄였던 방법에 대해 공유하려합니다.


상위권 팀들의 공유 코드를 보면, 전부 아래의 코딩을 합니다.

train = train.loc[:, train.nunique() != 1]

위 코드의 의미는 다들 아시겠지만, 해당 컬럼의 값이 1개로 반복되지 않는 칼럼만을 취한다는 의미입니다.

값이 한개로만 이루어진 컬럼은 전혀 쓸모가 없을 테니까요. 그리고 위 코드를 이용해서 컬럼을 줄여서 수상한 팀도 있습니다.

하지만 위 코드로 하면 오히려 점수가 줄어듭니다.

그럼 그냥 아무값이나 모든 row를 채우는 컬럼을 넣으면 모델이 라벨을 예측하는데 도움이 된다는 뜻인데, 대체 왜 점수가 줄어들까요?


값이 한개만으로 이루어진 컬럼들에 대한 편차를 상위 몇개 부분만 잘라왔습니다. 값이 한개 짜리로 이루어진 컬럼인데 어떻게 편차가 있을 수 있을까요? 이는 예상하건대 아마 nunique가 1이라는 값과 1.000001 이라는 값을 값의 차이가 너무 작아서 동일한 값을 인식하는 것 같습니다. (뇌피셜)


이 부분에 대해서는 저도 엄청 작은 값의 차이가 있어서 편차가 거의 0에 수렴하는 컬럼임에도 모델이 라벨을 예측하는 데에 있어서 유의미하다는 것을 깨달아서 굉장히 놀랐습니다.


이런 문제점을 깨달은 우리 팀은 아래와 같은 코드로 컬럼의 수를 줄였고, 실제로 모델의 예측력이 올라가는 성과를 얻었습니다.

train_std0=train.loc[:,train.std()!=0]
test_std0=test.loc[:,train_std0.columns]



nunique 를 이용해 컬럼을 제거한 데이터 컬럼의 수 3326

std=0 을 이용해 컬럼을 제거한 데이터 컬럼의 수 3416


90개의 아주 작은 편차를 가진 컬럼 때문에 예측력이 떨어졌다고 볼 수 있습니다.


(데이터가 너무 커서 모델링의 속도가 오래걸리기 때문에 예측력 비교는 단순히 랜덤 포레스트로 비교 했습니다.)

로그인이 필요합니다
0 / 1000
당쇠
2020.07.06 12:24

정말 많은 도움이 될것 같습니다. 훌륭하십니다.~~ 

인호베이션97
2020.07.06 12:26

댓글 감사합니다. :D