def regression_preprocessing(file_train='./Kor_Train_교통사망사고정보(12.1~17.6).csv', file_test='./test_kor.csv'): f = open(file_train, 'r') r = csv.reader(f) f2 = open(file_test) r2 = csv.reader(f2) attr_test = [] for row in r2: # test_kor를 열 별로 for elem in row: # test_kor를 열의 원소 별로 attr_test.append(elem) break attr_train = [] for row in r: # 교통사망정보(트레이닝.csv) 열 별로 for elem in row: # 교통사망정보 열의 원소 별로 attr_train.append(elem) break _input_train = [] # 사람 수 데이타를 제외한 인풋 정보 output_train = [] # 사람 수 데이터(사망자, 사상자, 중상자, 경상자,부상신고자의 수) # 위에서 row로 반복문을 돌려서 맨처음 row인 자료 정보 분류는 불포함하여 반복문을 돌림 for row in r: # 교통사망정보 열 별로(맨 처음 row였던 자료 분류는 불포함) tmp = [] for i, elem in enumerate(row): # 교통사망정보 열만큼 돌림 if attr_train[ i] in attr_test: # 교통사망정보 열의 원소 중 test_kor와 일치하는 원소만 append tmp.append(elem) input = [] output = [] for i, elem in enumerate(tmp): # 인덱스로 인풋 아웃풋 분류(2<=인풋<7) if i < 2: input.append(elem) elif i < 7: output.append(int(elem)) else: input.append(elem) _input_train.append(input) output_train.append(output) f.close() f2.close() """ """ tmp = [] for i in range(len(_input_train[0])): tmp.append([]) # _input_train의 attribute 개수만큼 list 생성 for row in _input_train: for i, elem in enumerate(row): tmp[i].append(elem) # 각 attribute에 해당하는 element를 list형태로 tmp에 저장 input_count = [] input_set = [] for i, c in enumerate(tmp): if i == ( len(tmp) - 2 ): # default file_train의 마지막 두 attribute의 element가 일부 겹치므로 union set으로 통일 input_count.append(len(set(c) | set(tmp[i + 1]))) input_set.append(set(c) | set(tmp[i + 1])) break else: input_count.append( len(set(c)) ) # 각 attribute가 가지는 중복되지 않는 element의 수를 input_count list에 저장 input_set.append(set(c)) # tmp의 각 리스트를 set으로 변환하여 input_set에 저장 dic_list = [] for _ in range(len(input_set)): # file_train의 attribute 개수만큼 dictionary 생성 dic_list.append({}) for i, B in enumerate(input_set): for j, b in enumerate(B): dic_list[i][b] = oneHotEncoding( input_count[i], j) # i번째 attribute에 해당되는 dictionary에서 키값을 b로 하는 벡터화된 value를 맵핑 dic_list.append( dic_list[len(dic_list) - 1]) # input_count와 크기를 맞춰주기 위해 마지막번째 attribute에 병합된 set을 추가 """ """ input_train = [] # 사람 수 데이타를 제외한 input을 벡터화한 list for i, row in enumerate(_input_train): input_train.append([]) for j, elem in enumerate(row): input_train[i].append(dic_list[j][elem]) return input_train, output_train, dic_list
def category_H_and_I_preprocessing( file_train='./Kor_Train_교통사망사고정보(12.1~17.6).csv', file_test='./test_kor.csv'): f = open(file_train, 'r') r = csv.reader(f) f2 = open(file_test, 'r') r2 = csv.reader(f2) attr_test = [] for row in r2: # test_kor를 열 별로 for elem in row: # test_kor를 열의 원소 별로 attr_test.append(elem) break attr_train = [] for row in r: # 교통사망정보(트레이닝.csv) 열 별로 for elem in row: # 교통사망정보 열의 원소 별로 attr_train.append(elem) break _input_train = [] # 사람 수 데이타를 제외한 인풋 정보 _output_train = [] # 사람 수 데이터(사망자, 사상자, 중상자, 경상자,부상신고자의 수) # 위에서 row로 반복문을 돌려서 맨처음 row인 자료 정보 분류는 불포함하여 반복문을 돌림 for row in r: # 교통사망정보 열 별로(맨 처음 row였던 자료 분류는 불포함) tmp = [] for i, elem in enumerate(row): # 교통사망정보 열만큼 돌림 if attr_train[ i] in attr_test: # 교통사망정보 열의 원소 중 test_kor와 일치하는 원소만 append tmp.append(elem) input = [] output = [] for i, elem in enumerate(tmp): if i < 2: input.append(elem) elif i < 7: input.append(int(elem)) elif i < 9: output.append(elem) else: input.append(elem) _input_train.append(input) _output_train.append(output) f.close() f2.close() """ inputs """ tmp = [] for i in range(len(_input_train[0])): tmp.append([]) # _input_train의 attribute 개수만큼 list 생성 for row in _input_train: for i, elem in enumerate(row): tmp[i].append(elem) # 각 attribute에 해당하는 element를 list형태로 tmp에 저장 input_count = [] input_set = [] for i, c in enumerate(tmp): input_count.append(len(set( c))) # 각 attribute가 가지는 중복되지 않는 element의 수를 input_count list에 저장 input_set.append(set(c)) # tmp의 각 리스트를 set으로 변환하여 input_set에 저장 input_dic_list = [] for _ in range(len(input_set)): # file_train의 attribute 개수만큼 dictionary 생성 input_dic_list.append({}) for i, B in enumerate(input_set): for j, b in enumerate(B): if isinstance(b, int): input_dic_list[i][b] = b else: # i번째 attribute에 해당되는 dictionary에서 키값을 b로 하는 벡터화된 value를 맵핑 input_dic_list[i][b] = oneHotEncoding(input_count[i], j) input_train = [] # 사람 수 데이타를 제외한 input을 벡터화한 list for i, row in enumerate(_input_train): input_train.append([]) for j, elem in enumerate(row): input_train[i].append(input_dic_list[j][elem]) """ outputs """ tmp = [] for i in range(len(_output_train[0])): tmp.append([]) # _output_train의 attribute 개수만큼 list 생성 for row in _output_train: for i, elem in enumerate(row): tmp[i].append(elem) # 각 attribute에 해당하는 element를 list형태로 tmp에 저장 output_count = [] output_set = [] for i, c in enumerate(tmp): output_count.append(len(set( c))) # 각 attribute가 가지는 중복되지 않는 element의 수를 output_count list에 저장 output_set.append(set(c)) # tmp의 각 리스트를 set으로 변환하여 output_set에 저장 output_dic_list = [] for _ in range( len(output_set)): # file_train의 attribute 개수만큼 dictionary 생성 output_dic_list.append({}) for i, B in enumerate(output_set): for j, b in enumerate(B): if isinstance(b, int): output_dic_list[i][b] = b else: output_dic_list[i][b] = oneHotEncoding(output_count[i], j) output_train = [] # 사람 수 데이타를 제외한 input을 벡터화한 list for i, row in enumerate(_output_train): output_train.append([]) for j, elem in enumerate(row): output_train[i].append(output_dic_list[j][elem]) # output_train[i] = output_dic_list[j][elem] return input_train, output_train, input_dic_list, output_dic_list
def main_2(): if not os.path.isdir('./outputs'): os.mkdir('./outputs') if not os.path.isdir('./models'): os.mkdir('./models') """ preprocessing """ # 범주형 데이터 리스트, 사람 수 데이터 리스트, 벡터화 dictionary _inputs, _outputs, input_dict, output_dict = category_L_preprocessing() # delete columns _inputs = deleteColumn(_inputs, [1, 3, 10]) # 요일, 사상자 수, K열 제외 # make list tmp = [] for _input in _inputs: ttmp = [] nums = [] for i, elem in enumerate(_input): if i < 1: ttmp.append(elem) elif i < 5: nums.append(elem) elif i == 5: ttmp.append(norm_list(nums)) ttmp.append(elem) else: ttmp.append(elem) tmp.append(ttmp) _inputs, _outputs = shuffleList( tmp, _outputs) # 데이터 리스트가 고루 섞이도록 _inputs와 _outputs를 함께 섞음 inputs, outputs, input_test, input_train, input_val, output_test, output_train, output_val \ = separate_set_multiple_outputs(_inputs, _outputs) # 범주형 데이터와 사람 수 데이터를 각각 test, train, validate를 위해 분류 # ensemble num_models = 11 # 11 cnt = 0 models = [] while cnt < num_models: """ create model """ model = createModel(inputs, outputs) """ training """ model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy']) # model.summary() # early stopping # val_loss값이 10번 동안 개선되지 않으면 해당 model의 학습을 중단 early_stopping = EarlyStopping(monitor='val_loss', patience=10, verbose=0) # train # model의 학습 이력 정보로 train의 loss와 accuracy, val의 loss와 accuracy 값을 받음 hist = model.fit([np.array(i) for i in input_train], [np.array(i) for i in output_train], epochs=1000, batch_size=pow(2, 13), validation_data=([np.array(i) for i in input_val], [np.array(i) for i in output_val]), callbacks=[early_stopping], verbose=0) try: # plot_hist(hist) pass except: pass """ test """ # model의 성능 평가 score = model.evaluate([np.array(i) for i in input_test], [np.array(i) for i in output_test], verbose=0) # TH = 0.72 if score[1] < 0.72: print('fail : model %d: %s = %.2f%%' % (cnt, model.metrics_names[1], score[1] * 100)) continue # PASS print('complete: model %d: %s = %.2f%%' % (cnt, model.metrics_names[1], score[1] * 100)) """ save model """ model.save('./models/2_model_' + str(cnt) + '.h5') try: plot_model(model, to_file='./models/2_model_' + str(cnt) + '.png', show_shapes=True, show_layer_names=True) except: pass models.append(model) # model의 개수가 10개가 될 때 cnt += 1 """ predict """ f1 = open('./outputs/1_output.csv', 'r') f2 = open('./outputs/2_output.csv', 'w', newline='') r1 = csv.reader(f1) r2 = csv.writer(f2) for i, row in enumerate(r1): # blank if (10 < i & i < 21) | (42 < i & i < 46): """ preprocessing """ # copy _row = row[:] # L열 제외 for k, j in enumerate([11]): del (_row[j - k]) for j, elem in enumerate(_row): if 1 < j & j < 7: _row[j] = int(elem) _input_pred = [] for j, elem in enumerate(_row): try: if isinstance(elem, int): _input_pred.append(elem) else: _input_pred.append(input_dict[j][elem]) except: _input_pred.append('') # _row = deleteColumn(row, [1, 3, 10]) # 요일, 사상자 수, K열 제외 for k, j in enumerate([1, 3, 10]): del (_input_pred[j - k]) # make list input_pred = [] nums = [] for j, elem in enumerate(_input_pred): if j < 1: input_pred.append(elem) elif j < 5: nums.append(elem) elif j == 5: input_pred.append(norm_list(nums)) input_pred.append(elem) else: input_pred.append(elem) """ predict """ pred = [] for model in models: _pred = list( model.predict([np.array([j]) for j in input_pred])[0]) pred.append( value_key_map( output_dict, 0, oneHotEncoding(len(_pred), _pred.index(max(_pred))))) # majority val, rate = majority(pred) print('save : row %2d: val = %.2f%%' % (i + 1, rate * 100)) """ write """ row[11] = val r2.writerow(row) else: r2.writerow(row) f1.close() f2.close()