분석시각화 대회 코드 공유 게시물은
내용 확인 후
좋아요(투표) 가능합니다.
원자력발전소 상태 판단 경진대회
제공 데이터 이해하고 데이터 load 해보기! by 솜장
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을 동일하게 설정하였습니다.
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
데이콘(주) | 대표 김국진 | 699-81-01021
통신판매업 신고번호: 제 2021-서울영등포-1704호
서울특별시 영등포구 은행로 3 익스콘벤처타워 901호
이메일 dacon@dacon.io | 전화번호: 070-4102-0545
Copyright ⓒ DACON Inc. All rights reserved
공유해주신 솜장님께 감사드립니다.