コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
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()