def run_train_cv(self, fold_splits): # データをロードする self._load_data() # モデルをクロスバリデーションの分割数分作成する self._cv_models = [] for i in range(fold_splits): model = copy.deepcopy(self._model) self._cv_models.append(model) fold = KFold(n_splits=fold_splits, shuffle=False) for i, (train_index, valid_index) in enumerate( fold.split(self._whole_x, self._whole_y)): # 訓練データを抽出する tx = self._whole_x.iloc[train_index] ty = self._whole_y.iloc[train_index] # 検証データを抽出する vx = self._whole_x.iloc[valid_index] vy = self._whole_y.iloc[valid_index] # モデルがDNNの場合はデータを正規化する if type(self._model) is ModelDnn: # Max-Minスケール化 scaler, tx, vx = util.max_min_scale(tx, vx) # 学習を行う self._model.train(tx, ty, vx, vy) # 予測を行う pred_y = self._model.predict(vx) # 評価結果を出力する run_fold_name = '{0:s}_fold_{1:02d}'.format(self._run_name, i) print('#################################') print(' {0:s}'.format(run_fold_name)) print('#################################') if type(self._model) is ModelDnn: # モデルがDNNの場合はOne-Hotラベル表現用の正解率を表示する vy_onehot = keras.utils.to_categorical( vy, num_classes=self._label_num) util.print_accuracy_one_hot(vy_onehot, pred_y, self._class_names) util.print_precision_and_recall_one_hot( vy_onehot, pred_y, self._class_names) else: util.print_accuracy(vy, pred_y, self._class_names) util.print_precision_and_recall(vy, pred_y, self._class_names)
def _print_evaluation_score(self, model, run_fold_name, test_y, pred_y): print('#################################') print(' {0:s}'.format(run_fold_name)) print('#################################') if type(model) is ModelDnn: # モデルがDNNの場合はOne-Hotラベル表現用の正解率を表示する test_y_onehot = keras.utils.to_categorical( test_y, num_classes=self._label_num) util.print_accuracy_one_hot(test_y_onehot, pred_y, self._class_names) util.print_precision_and_recall_one_hot(test_y_onehot, pred_y, self._class_names) else: util.print_accuracy(test_y, pred_y, self._class_names) util.print_precision_and_recall(test_y, pred_y, self._class_names)
def run_train_cv(self): # データをロードする self._load_data() #fold = StratifiedKFold(n_splits=3) fold = KFold(n_splits=3, shuffle=True) for i, (train_index, test_index) in enumerate( fold.split(self._train_x, self._train_y)): # 訓練データを抽出する tx = self._train_x.iloc[train_index] ty = self._train_y.iloc[train_index] # 検証データを抽出する vx = self._train_x.iloc[test_index] vy = self._train_y.iloc[test_index] # モデルがDNNの場合はデータを正規化する if type(self._model) is ModelDnn: # Max-Minスケール化 scaler, tx, vx = util.max_min_scale(tx, vx) # 学習を行う self._model.train(tx, ty, vx, vy) # 予測を行う pred_y = self._model.predict(vx) # 評価結果を出力する run_fold_name = '{0:s}_fold_{1:02d}'.format(self._run_name, i) print('#################################') print(' {0:s}'.format(run_fold_name)) print('#################################') if type(self._model) is ModelDnn: # モデルがDNNの場合はOne-Hotラベル表現用の正解率を表示する vy_onehot = keras.utils.to_categorical( vy, num_classes=self._label_num) util.print_accuracy_one_hot(vy_onehot, pred_y, self._class_names) else: util.print_accuracy(vy, pred_y, self._class_names)
def run_predict_all(self): # 全データで学習済みか if self.is_trained_all: test_x = self._test_x # モデルがDNNの場合は学習時に使用したスケーラで正規化する if type(self._model) is ModelDnn: test_x = self._train_all_scaler.transform(test_x) # 予測を行う pred_y = self._model.predict(test_x) # 正解率を表示する print('#################################') print(' {0:s}'.format(self._run_name)) print('#################################') if type(self._model) is ModelDnn: # モデルがDNNの場合はOne-Hotラベル表現用の正解率を表示する ty_onehot = keras.utils.to_categorical( self._test_y, num_classes=self._label_num) util.print_accuracy_one_hot(ty_onehot, pred_y, self._class_names) util.print_precision_and_recall_one_hot( vy_onehot, pred_y, self._class_names) else: util.print_accuracy(self._test_y, pred_y, self._class_names) util.print_precision_and_recall(vy, pred_y, self._class_names) # 特徴量の重要度を表示する #print('#################################') print(' show_importance_of_feature...') self._show_importance_of_feature() # Graphvizのグラフをファイルに出力する #print('#################################') print(' export_graphviz...') self._export_graphviz()