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

제공 데이터 이해하고 데이터 load 해보기! by 솜장

2020.03.03 23:15 5,092 조회

라벨링은 어떻게 해야할까?

train.zip : 각각의 csv파일은 feature에 대한 내용만 저장되어있음.

train_label.csv : 각각의 csv파일에 대한 label 값은 train_label.csv에 저장되어있음.

 

참가자가 직접 라벨링을 해주어야함.

train_label.csv파일 내에 각각의 csv파일별로 부여가되는 라벨에 대한 정보가 저장되어있습니다.

 

즉 만약 1번 csv파일의 라벨값이 29번이라면 29번을 target column에 추가를 해주면 됩니다.

 

하지만 train_label.csv 내에 있는 라벨 정보는 각각의 파일별 상태 B에 대한 정보를 나타냅니다.

 

모든 데이터는 상태 A에서 시작하기 때문에 상태 A부분을 반영해주어야합니다.

 

상태 A에서 발전소가 운영을 시작하다가 중간에 상태 B로 바뀌기 때문에 오른쪽의 그림과 같이

 

상태 A가 B로 바뀐 시점을 event time이라고 정의하면 event time 이전까지는 상태 A에 대한 라벨링

 

event time 다음부터 599초까지는 상태 B에 대한 라벨링을 해주면 됩니다.

 

상태 A에 대한 라벨링은 어떻게 할까

 

이미 0번부터 197번은 상태 B에 할당이 되어있으므로 0부터 197번이 아닌 숫자를 활용하여 event time 이전의 부분이 상태 B가 아니다라는 것을 명시해주면 됩니다.

 

여기 사진에서는 999를 예로 들었습니다.

 

파일별 상태 B의 시작위치 즉 event time은 다를 수 있습니다.

 

0번 파일은 event time이 10초일 수도 있고 1번 파일은 event time이 12초일 수 있다는 것입니다.

 

base line 코드는 모든 파일에 대해서 event time을 동일하게 설정하였습니다.

 

 

대회 측 공개코드 data_loader 함수 이해하기!

train_dataset

train.zip안에 들어있는 각각의 csv 파일들에 대해서 라벨값을 부여해주고 이것들을 하나의 파일로 합쳐줌으로 써 학습에 사용할 하나의 train_dataset을 만들어주는 역할을 합니다.

 

test_dataset

평가에 사용할 데이터를 그저 합쳐주는 역할을 함

 

코드 ver.1

import os
import pandas as pd 
import numpy as np
from multiprocessing import Pool 
import multiprocessing
from data_loader import data_loader #data_loader.py 파일을 다운 받아 주셔야 합니다. 
from tqdm import tqdm
from functools import partial

def data_loader_all(func, path, train, nrows, **kwargs):
    '''
    Parameters:
    
    func: 하나의 csv파일을 읽는 함수 
    path: [str] train용 또는 test용 csv 파일들이 저장되어 있는 폴더 
    train: [boolean] train용 파일들 불러올 시 True, 아니면 False
    nrows: [int] csv 파일에서 불러올 상위 n개의 row 
    lookup_table: [pd.DataFrame] train_label.csv 파일을 저장한 변수 
    event_time: [int] 상태_B 발생 시간 
    normal: [int] 상태_A의 라벨
    
    Return:
    
    combined_df: 병합된 train 또는 test data
    '''
    
    # 읽어올 파일들만 경로 저장 해놓기 
    files_in_dir = os.listdir(path)
    
    files_path = [path+'/'+file for file in files_in_dir]
    
    if train :
        func_fixed = partial(func, nrows = nrows, train = True, lookup_table = kwargs['lookup_table'], event_time = kwargs['event_time'], normal = kwargs['normal'])
        
    else : 
        func_fixed = partial(func, nrows = nrows, train = False)
    
    
    # 여러개의 코어를 활용하여 데이터 읽기 
    if __name__ == '__main__':
        pool = Pool(processes = multiprocessing.cpu_count()) 
        df_list = list(tqdm(pool.imap(func_fixed, files_path), total = len(files_path)))
        pool.close()
        pool.join()
    
    # 데이터 병합하기 
    combined_df = pd.concat(df_list, ignore_index=True)
    
    return combined_df
train_path = 'train'
test_path = 'test'
label = pd.read_csv('train_label.csv')
train = data_loader_all(data_loader, path = train_path, train = True, nrows = 100, normal = 999, event_time = 10, lookup_table = label)
test = data_loader_all(data_loader, path = test_path, train = False, nrows = 60)

 

코드 ver.2

import os
import pandas as pd 
import numpy as np
import multiprocessing # 여러 개의 일꾼 (cpu)들에게 작업을 분산시키는 역할
from multiprocessing import Pool 
from functools import partial # 함수가 받는 인자들 중 몇개를 고정 시켜서 새롭게 파생된 함수를 형성하는 역할
from data_loader_v2 import data_loader_v2 # 자체적으로 만든 data loader version 2.0 ([데이콘 15회 대회] 데이터 설명 및 데이터 불러오기 영상 참조)

from sklearn.ensemble import RandomForestClassifier
import joblib # 모델을 저장하고 불러오는 역할

train_folder = 'data/train/'
test_folder = 'data/test/'
train_label_path = 'data/train_label.csv'

train_list = os.listdir(train_folder)
test_list = os.listdir(test_folder)
train_label = pd.read_csv(train_label_path, index_col=0)

def data_loader_all_v2(func, files, folder='', train_label=None, event_time=10, nrows=60):   
    func_fixed = partial(func, folder=folder, train_label=train_label, event_time=event_time, nrows=nrows)     
    if __name__ == '__main__':
        pool = Pool(processes=multiprocessing.cpu_count()) 
        df_list = list(pool.imap(func_fixed, files)) 
        pool.close()
        pool.join()        
    combined_df = pd.concat(df_list)    
    return combined_df
    
train = data_loader_all_v2(data_loader_v2, train_list, folder=train_folder, train_label=train_label, event_time=10, nrows=60)
test = data_loader_all_v2(data_loader_v2, test_list, folder=test_folder, train_label=None, event_time=10, nrows=60)

 

실제로 한번 실행해보자

실행환경

 

코드 ver.1 실행 결과

train 결과

일정부분까지 상태 A에 해당하는 999가 들어가고 그 이후에 상태 B에 해당하는 110이 들어가는 것을 볼 수 있습니다.


출처 - 솜장 티스토리 https://ideans.tistory.com/32?category=836289


로그인이 필요합니다
0 / 1000
당쇠
2020.03.03 23:19

공유해주신 솜장님께 감사드립니다.