예제 #1
0
    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)
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
    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()