def run_predict_cv(self) -> None: """クロスバリデーションで学習した各foldのモデルの平均により、テストデータの予測を行う あらかじめrun_train_cvを実行しておく必要がある """ logger.info(f'{self.run_name} - start prediction cv') test_x = RunnerLeaveOneOut.load_x_test(self.features) preds = [] # 各foldのモデルで予測を行う for i_fold in range(self.n_fold): logger.info(f'{self.run_name} - start prediction fold:{i_fold}') model = self.build_model(i_fold) model.load_model(self.features) pred = model.predict(test_x) preds.append(pred) logger.info(f'{self.run_name} - end prediction fold:{i_fold}') # 予測の平均値を出力する pred_avg = np.mean(preds, axis=0) # 予測結果の保存 Util.dump(pred_avg, f'../model/pred/{self.run_name}-test.pkl') logger.info(f'{self.run_name} - end prediction cv')
def save_model(self, feature): model_path = os.path.join(f'../model/model/{feature}', f'{self.run_fold_name}.h5') scaler_path = os.path.join(f'../model/model/{feature}', f'{self.run_fold_name}-scaler.pkl') os.makedirs(os.path.dirname(model_path), exist_ok=True) self.model.save(model_path) Util.dump(self.scaler, scaler_path)
def run_train_cv(self, lr_curve_train_sizes: Optional[List[int]]=None) -> None: """クロスバリデーションでの学習・評価を行う 学習・評価とともに、各foldのモデルの保存、スコアのログ出力についても行う """ logger.info(f'{self.run_name} - start training cv') scores = [] va_idxes = [] preds = [] lr_curve = not (lr_curve_train_sizes is None) if lr_curve: train_scores = np.empty(( 0, len(lr_curve_train_sizes) ) , float) valid_scores = np.empty(( 0, len(lr_curve_train_sizes) ) , float) # 各foldで学習を行う for i_fold in range(self.n_fold): # 学習を行う logger.info(f'{self.run_name} fold {i_fold} - start training') if lr_curve: model, va_idx, va_pred, score, tr_score, val_score = self.train_fold_lr(i_fold, lr_curve_train_sizes) train_scores = np.append(train_scores, tr_score.reshape(1, len(lr_curve_train_sizes)) ,axis=0) valid_scores = np.append(valid_scores, val_score.reshape(1, len(lr_curve_train_sizes)),axis=0) else: model, va_idx, va_pred, score = self.train_fold(i_fold) logger.info(f'{self.run_name} fold {i_fold} - end training - score {score}') # モデルを保存する model.save_model(self.features) # 結果を保持する va_idxes.append(va_idx) scores.append(score) preds.append(va_pred) # 各foldの結果をまとめる va_idxes = np.concatenate(va_idxes) order = np.argsort(va_idxes) preds = np.concatenate(preds, axis=0) preds = preds[order] logger.info(f'{self.run_name} - end training cv - score {np.mean(scores)}') # 予測結果の保存 Util.dump(preds, f'../model/pred/{self.features}/{self.run_name}-train.pkl') # 評価結果の保存 logger.result_scores(self.run_name, scores) if lr_curve: self._plot_lr_curve(lr_curve_train_sizes, train_scores, valid_scores)
def run_predict_all(self) -> None: """学習データすべてで学習したモデルにより、テストデータの予測を行う あらかじめrun_train_allを実行しておく必要がある """ logger.info(f'{self.run_name} - start prediction all') test_x = RunnerLeaveOneOut.load_x_test(self.features) # 学習データ全てで学習したモデルで予測を行う i_fold = 'all' model = self.build_model(i_fold) model.load_model(self.features) pred = model.predict(test_x) # 予測結果の保存 Util.dump(pred, f'../model/pred/{self.run_name}-test.pkl') logger.info(f'{self.run_name} - end prediction all')
def save_model(self, feature): model_path = os.path.join(f'../model/model/{feature}', f'{self.run_fold_name}.model') os.makedirs(os.path.dirname(model_path), exist_ok=True) Util.dump(self.model, model_path)