コード例 #1
0
    def __init__(self,
                 wind_size=52,
                 pred_step=1,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 seed=3,
                 gcn_layer_num=2,
                 dropout=0.4):
        self.setup_seed(seed)
        self.device = torch.device(
            'cuda' if torch.cuda.is_available() else 'cpu')

        print('VGCN')
        self.dataset = GlobalFlu(wind_size=wind_size,
                                 pred_step=pred_step,
                                 data_type=data_type,
                                 split_param=split_param)
        self.dataset.to_tensor()
        self.dataset.to_device(self.device)

        self.epochs = 200
        self.count = 0
        self.loss_type = 'mse'
        self.dropout = dropout
        self.gcn_layer_num = gcn_layer_num
        self.pred_nums = None
        self.min_loss = 1e10
        self.batch_size = 30
        self.build_model()
コード例 #2
0
ファイル: rvgsn_fixed_trainer.py プロジェクト: aI-area/DVGSN
    def __init__(self,
                 wind_size=52,
                 pred_step=1,
                 layer_num=2,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 seed=3,
                 mlp_layer_num=2,
                 gcn_layer_num=2,
                 alpha=0):
        self.setup_seed(seed)
        self.device = torch.device(
            'cuda' if torch.cuda.is_available() else 'cpu')

        print('VGCN')
        self.dataset = GlobalFlu(wind_size=wind_size,
                                 pred_step=pred_step,
                                 data_type=data_type,
                                 split_param=split_param)
        self.dataset.to_tensor()
        self.dataset.to_device(self.device)
        self.adj = generate_rvgsn_adj(self.dataset.node_size).to(self.device)
        self.epochs = 200
        self.count = 0
        self.loss_type = 'mse'
        self.alpha = alpha
        self.mlp_layer_num = mlp_layer_num
        self.gcn_layer_num = gcn_layer_num
        self.mid_channels = 256
        self.pred_nums = None
        self.min_loss = 1e10
        self.batch_size = 30
        self.build_model()
コード例 #3
0
ファイル: v_gin_trainer.py プロジェクト: aI-area/DVGSN
    def __init__(self,
                 wind_size=52,
                 pred_step=1,
                 layer_num=2,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 seed=3):
        self.setup_seed(seed)
        self.device = torch.device(
            'cuda' if torch.cuda.is_available() else 'cpu')

        print('VGIN')
        self.dataset = GlobalFlu(wind_size=wind_size,
                                 pred_step=pred_step,
                                 data_type=data_type,
                                 split_param=split_param)
        self.dataset.to_tensor()
        self.dataset.to_device(self.device)

        self.adj = torch.full([self.dataset.node_size, self.dataset.node_size],
                              1,
                              dtype=torch.float32).to(self.device)
        self.epochs = 200
        self.count = 0
        self.loss_type = 'mse'
        self.alpha = 0.00005
        self.layer_num = layer_num
        self.pred_nums = None
        self.min_loss = 1e10
        self.batch_size = 30
        self.build_model()
コード例 #4
0
ファイル: tcn_trainer.py プロジェクト: aI-area/DVGSN
    def __init__(self,
                 wind_size=52,
                 pred_step=1,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 seed=3):
        self.setup_seed(seed)
        self.device = torch.device(
            'cuda' if torch.cuda.is_available() else 'cpu')

        print('TCN')
        self.dataset = GlobalFlu(wind_size=wind_size,
                                 pred_step=pred_step,
                                 data_type=data_type,
                                 split_param=split_param)
        self.dataset.to_tensor()
        self.dataset.to_device(self.device)
        self.pred_step = pred_step

        self.epochs = 200
        self.count = 0
        self.loss_type = 'mse'

        self.alpha = 0.001
        self.pred_nums = None
        self.min_loss = 1e10
        self.batch_size = self.dataset.train_index.shape[0]
        # self.batch_size = 30
        # print(self.dataset.node_ft_mat.size())
        self.build_model()
コード例 #5
0
ファイル: xgb_trainer.py プロジェクト: aI-area/DVGSN
    def __init__(self,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 wind_size=12,
                 pred_step=1):

        self.dataset = GlobalFlu(data_type=data_type,
                                 split_param=split_param,
                                 wind_size=wind_size,
                                 pred_step=pred_step)

        self.params = {
            'booster': 'gbtree',
            'n_estimators': 200,
            'max_depth': 10,  # max_depth [缺省值=6]
            'eta': 0.08,  # learning_rate
            'silent': 1,  # 为0打印运行信息;设置为1静默模式,不打印
            'nthread': 4,  # 运行时占用cpu数
            'gamma': 0.0,  # min_split_loss](分裂最小loss)参数的值越大,算法越保守
            'min_child_weight': 5,  # 决定最小叶子节点样本权重和,缺省值=1,避免过拟合. 值过高,会导致欠拟合
            'learning_rate': 0.1,
            'num_boost_round': 2000,
            'objective': 'reg:squarederror',
            'random_state': 7,
        }

        self.model = None
コード例 #6
0
ファイル: gat_full_adj_trainer.py プロジェクト: aI-area/DVGSN
    def __init__(self, wind_size=52, pred_step=1, layer=2, data_type='us', split_param=[0.6, 0.2, 0.2], seed=3):
        self.setup_seed(seed)
        print('GATFullTrainer  wind_size={}  pred_step={},  data_type={}'.format(wind_size, pred_step, data_type))
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        # self.device = 'cpu'
        self.dataset = GlobalFlu(wind_size=wind_size, pred_step=pred_step, data_type=data_type, split_param=split_param)

        self.dataset.to_tensor()
        self.dataset.to_device(self.device)

        self.adj = torch.full([self.dataset.node_size, self.dataset.node_size], 1, dtype=torch.float32).to(self.device)
        self.layer_num = layer
        self.epochs = 200
        self.count = 0
        self.loss_type = 'mse'

        self.pred_nums = None
        self.min_loss = 1e10
        self.batch_size = 30
        # self.batch_size = self.dataset.train_index.shape[0]

        self.build_model()
コード例 #7
0
    def __init__(self,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 wind_size=12,
                 pred_step=1):

        print(
            'LinearRegression  wind_size={} pred_step={}, data_type={}'.format(
                wind_size, pred_step, data_type))
        self.dataset = GlobalFlu(data_type=data_type,
                                 split_param=split_param,
                                 wind_size=wind_size,
                                 pred_step=pred_step)
        self.model = LinearRegression()
コード例 #8
0
ファイル: adaboost_trainer.py プロジェクト: aI-area/DVGSN
    def __init__(self,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 wind_size=12,
                 pred_step=1):
        self.n = 200
        print('AdaBoost n = ', self.n)
        self.dataset = GlobalFlu(data_type=data_type,
                                 split_param=split_param,
                                 wind_size=wind_size,
                                 pred_step=pred_step)

        self.base_estimator = DecisionTreeRegressor(min_impurity_split=5,
                                                    min_samples_leaf=1,
                                                    splitter='random')
        self.model = AdaBoostRegressor(n_estimators=self.n, loss='square')
コード例 #9
0
    def __init__(self,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 wind_size=12,
                 pred_step=1):

        self.n_neighbors = 4
        self.weights = 'uniform'
        print('KNN  n_neighbors = {}, weights = {}'.format(
            self.n_neighbors, self.weights))

        self.dataset = GlobalFlu(data_type=data_type,
                                 split_param=split_param,
                                 wind_size=wind_size,
                                 pred_step=pred_step)
        self.model = KNeighborsRegressor(n_neighbors=self.n_neighbors,
                                         weights=self.weights)
コード例 #10
0
ファイル: rvgsn_fixed_trainer.py プロジェクト: aI-area/DVGSN
class VirtualGCNTrainer(object):
    def __init__(self,
                 wind_size=52,
                 pred_step=1,
                 layer_num=2,
                 data_type='us',
                 split_param=[0.6, 0.2, 0.2],
                 seed=3,
                 mlp_layer_num=2,
                 gcn_layer_num=2,
                 alpha=0):
        self.setup_seed(seed)
        self.device = torch.device(
            'cuda' if torch.cuda.is_available() else 'cpu')

        print('VGCN')
        self.dataset = GlobalFlu(wind_size=wind_size,
                                 pred_step=pred_step,
                                 data_type=data_type,
                                 split_param=split_param)
        self.dataset.to_tensor()
        self.dataset.to_device(self.device)
        self.adj = generate_rvgsn_adj(self.dataset.node_size).to(self.device)
        self.epochs = 200
        self.count = 0
        self.loss_type = 'mse'
        self.alpha = alpha
        self.mlp_layer_num = mlp_layer_num
        self.gcn_layer_num = gcn_layer_num
        self.mid_channels = 256
        self.pred_nums = None
        self.min_loss = 1e10
        self.batch_size = 30
        self.build_model()

    def build_model(self):
        self.model = Model(node_num=self.dataset.node_size,
                           in_channels=self.dataset.node_feature_size,
                           out_channels=self.dataset.label_size,
                           mid_channels=self.mid_channels,
                           mlp_layer_num=self.mlp_layer_num,
                           gcn_layer_num=self.gcn_layer_num,
                           dropout=0.3,
                           bias=True).to(self.device)
        self.optimizer = torch.optim.Adam(self.model.parameters(), lr=1e-3)
        self.best_res = 0

    def setup_seed(self, seed):
        torch.manual_seed(seed)
        torch.cuda.manual_seed_all(seed)
        np.random.seed(seed)
        random.seed(seed)
        torch.backends.cudnn.deterministic = True

    def train(self):
        self.model.train()
        train_size = self.dataset.train_index.shape[0]
        shuffle_idx = torch.randperm(train_size)
        for idx in range(train_size // self.batch_size):
            self.optimizer.zero_grad()
            right_bound = min((idx + 1) * self.batch_size, train_size + 1)
            shuffle_batch_idx = shuffle_idx[idx * self.batch_size:right_bound]

            batch_idx = self.dataset.train_index[shuffle_batch_idx]
            batch_node_label = self.dataset.label_mat[batch_idx]

            out, adj = self.model(self.dataset.ft_mat, self.adj)
            out = out[batch_idx]

            if self.loss_type == 'mse':
                reg_loss = F.mse_loss(out, batch_node_label, reduction='mean')
            if self.loss_type == 'mape':
                reg_loss = self.mape_loss(out, batch_node_label)
            if self.loss_type == 'mae':
                reg_loss = self.mae_loss(out, batch_node_label)

            loss = reg_loss

            loss.backward()
            self.optimizer.step()

    def test(self):
        self.model.eval()
        pred, adj = self.model(self.dataset.ft_mat, self.adj)
        label = self.dataset.label_mat.to('cpu').detach().numpy()
        pred = pred.to('cpu').detach().numpy()

        train_mse, train_mae, train_mape = evaluate_regression(
            pred[self.dataset.train_index], label[self.dataset.train_index])

        valid_mse, valid_mae, valid_mape = evaluate_regression(
            pred[self.dataset.valid_index], label[self.dataset.valid_index])

        test_mse, test_mae, test_mape = evaluate_regression(
            pred[self.dataset.test_index], label[self.dataset.test_index])

        return train_mse, valid_mse, test_mse, train_mae, valid_mae, test_mae, \
               train_mape, valid_mape, test_mape, pred

    def mape_loss(self, pred, label):
        errors = torch.abs((pred - label) / label)
        errors = errors / label.size()[0]
        loss = torch.sum(errors)
        return loss

    def mae_loss(self, pred, label):
        errors = torch.abs(pred - label)
        loss = torch.mean(errors)
        return loss

    def print_best_res(self):
        train_mse, valid_mse, test_mse, train_mae, valid_mae, test_mae, \
        train_mape, valid_mape, test_mape, epoch = self.best_res
        msg_log = 'Epoch: {:03d}, MSE: {:.4f}, Val: {:.4f}, Test: {:.4f}, ' \
                  'MAE: {:.4f}, Val: {:.4f}, Test: {:.4f}, ' \
                  'MAPE: {:.4f}, Val: {:.4f}, Test: {:.4f}'.format(
            epoch, train_mse, valid_mse, test_mse, train_mae, valid_mae, test_mae, \
            train_mape, valid_mape, test_mape)
        print(msg_log)

    def start(self, display=True):
        self.test_acc_list = []
        for epoch in range(1, self.epochs):
            self.train()
            train_mse, valid_mse, test_mse, train_mae, valid_mae, test_mae, \
            train_mape, valid_mape, test_mape, pred = self.test()

            if valid_mse < self.min_loss:
                self.min_loss = valid_mse
                self.pred_nums = pred
                self.best_res = [train_mse, valid_mse, test_mse, train_mae, valid_mae, test_mae, \
                                 train_mape, valid_mape, test_mape]
                self.best_res.append(epoch)
            if display:
                mse_log = 'Epoch: {:03d}, MES Train: {:.4f}, Val: {:.4f}, Test: {:.4f}'
                print(mse_log.format(epoch, train_mse, valid_mse, test_mse))
                mae_log = 'Epoch: {:03d}, MAE Train: {:.4f}, Val: {:.4f}, Test: {:.4f}'
                print(mae_log.format(epoch, train_mae, valid_mae, test_mae))
                mape_log = 'Epoch: {:03d}, MAPE Train: {:.4f}, Val: {:.4f}, Test: {:.4f}'
                print(mape_log.format(epoch, train_mape, valid_mape,
                                      test_mape))
        self.print_best_res()
        train_mse, valid_mse, test_mse, train_mae, valid_mae, test_mae, \
        train_mape, valid_mape, test_mape, epoch = self.best_res
        return test_mse, test_mae, test_mape
コード例 #11
0
 def __init__(self, data_type='us', split_param=[0.6, 0.2, 0.2], wind_size=12, pred_step=1):
     print('Random Forest')
     self.n = 200
     self.dataset = GlobalFlu(data_type=data_type, split_param=split_param, wind_size=wind_size, pred_step=pred_step)
     self.model = RandomForestRegressor(n_estimators=self.n, max_depth=None, min_samples_leaf=1)