2021-03-02 === ###### tags: `유사도` `XG Boost` `Bagging` `CNN` - 중복 문항 체크 - pd Series의 value_counts 함수 ```python= temp_array = pd.Series([1, 1, 1, 2, 3, 4, 5]) temp_array.value_counts() ``` - result ``` 1 3 5 1 4 1 3 1 2 1 ``` - Preprocessing - Box plot으로 데이터의 분포를 확인 - Bar chart로 라벨 별 데이터 개수가 균등한지 확인 - 라벨 별 데이터 균등하게 맞추기 ```python= train_pos_data = train_data.loc[train_data['is_duplicate'] == 1] train_neg_data = train_data.loc[train_data['is_duplicate'] == 0] class_difference = len(train_neg_data) - len(train_pos_data) sample_frac = 1 - (class_difference / len(train_neg_data)) train_neg_data = train_neg_data.sample(frac = sample_frac) ``` - Character와 Word 단위로 문항을 나눠 그 길이로 box plot과 bar chart를 확인하는 행위는 무엇을 위함인가..? - 데이터의 보편적인 특징(물음표로 끝난다거나 대문자로 시작하는 것)은 데이터 전처리에서 제거하여 편향된 학습을 방지 - XG Boost (Tree Boosting) - 앙상블이란 여러개의 학습 알고리즘을 사용해 더 좋은 성능을 얻음 - 앙상블에는 배깅과 부스팅이 존재 - Bagging: 여러개의 학습 알고리즘, 모델을 통해 각각 결과를 예측 후 모든 결과를 동등하게 취합하여 최종 결과를 얻음 ex: Random Forest - Boosting: 여러개의 학습 알고리즘, 모델의 결과를 순차적으로 취합, 잘못 예측한 부분에 가중치를 주어 재학습 진행 - 여러개의 의사결정 트리를 사용하되 결과들의 평균을 사용하는게 아니라 오답에 대한 가중치를 주어 재학습 진행 ```python= train_data = xgb.DMatrix(train_input.sum(axis=1), label=train_label) # 학습 데이터 읽어 오기 eval_data = xgb.DMatrix(eval_input.sum(axis=1), label=eval_label) # 평가 데이터 읽어 오기 data_list = [(train_data, 'train'), (eval_data, 'valid')] params = {} # 인자를 통해 XGB모델에 넣어 주자 params['objective'] = 'binary:logistic' # 로지스틱 예측을 통해서 params['eval_metric'] = 'rmse' # root mean square error를 사용 bst = xgb.train(params, train_data, num_boost_round = 1000, evals = data_list, early_stopping_rounds=10) ``` - Bagging은 Train Data Set을 n개로 나누어 n개의 트리(모델)에 각각 학습을 시킨 후 Evaluate Data Set으로 n개의 모델을 평가하는데 그 중 가장 평가 결과가 우수한 트리(모델)의 결과를 최종 결과로 사용 - XG Boosting은 Train Data Set을 n개의 트리(모델)에 학습 시킨 후 Evaluate Data Set으로 n개의 모델을 평가하는데 평가 과정 중 오답인 데이터를 Train Data Set에 포함되도록 중요도를 조절하여 다음 학습 차례 때 해당 오답처리 되었던 데이터에 대해 정답이 될 수 있도록 학습을 진행 - CNN - Sentence Embedding Layer ```python= class SentenceEmbedding(layers.Layer): def __init__(self, **kargs): super(SentenceEmbedding, self).__init__() self.conv = layers.Conv1D(kargs['conv_num_filters'], kargs['conv_window_size'], activation=tf.keras.activations.relu, padding='same') # max_pool_seq_len는 문장의 길이로 셋팅 self.max_pool = layers.MaxPool1D(kargs['max_pool_seq_len'], 1) self.dense = layers.Dense(kargs['sent_embedding_dimension'], activation=tf.keras.activations.relu) def call(self, x): x = self.conv(x) x = self.max_pool(x) x = self.dense(x) return tf.squeeze(x, 1) ``` - Similarty Model ```python= class SentenceSimilarityModel(tf.keras.Model): def __init__(self, **kargs): super(SentenceSimilarityModel, self).__init__(name=kargs['model_name']) # Turns positive integers (indexes) into dense vectors of fixed size. self.word_embedding = layers.Embedding(kargs['vocab_size'], kargs['word_embedding_dimension']) self.base_encoder = SentenceEmbedding(**kargs) self.hypo_encoder = SentenceEmbedding(**kargs) self.dense = layers.Dense(kargs['hidden_dimension'], activation=tf.keras.activations.relu) self.logit = layers.Dense(1, activation=tf.keras.activations.sigmoid) self.dropout = layers.Dropout(kargs['dropout_rate']) def call(self, x): x1, x2 = x b_x = self.word_embedding(x1) h_x = self.word_embedding(x2) b_x = self.dropout(b_x) h_x = self.dropout(h_x) b_x = self.base_encoder(b_x) h_x = self.hypo_encoder(h_x) e_x = tf.concat([b_x, h_x], -1) e_x = self.dense(e_x) e_x = self.dropout(e_x) return self.logit(e_x) ``` - MaLSTM - 위 코드에서 CNN대신 LSTM을 사용 - RNN(LSTM을 포함)계열은 Layer가 많아야 성능이 나온다.