Tradaboost_R2模型源码

class Tradaboost_R2:
    def __init__(self, base_estimator=DecisionTreeRegressor(), epoch=10):
        """
        base_estimator:基学习器
        epoch:迭代轮数
        """
        self.base_estimator = base_estimator  # 基学习器可以自行选择XGB,LGMB等
        self.epoch = epoch
        self.regressors = []

    def fit(self, x_source, x_target, y_source, y_target):
        # 将源域和目标域转化为数组
        x_train = np.concatenate((x_source, x_target), axis=0)
        y_train = np.concatenate((y_source, y_target), axis=0)
        x_train = np.asarray(x_train, order='C')
        y_train = np.asarray(y_train, order='C')
        y_source = np.asarray(y_source, order='C')
        y_target = np.asarray(y_target, order='C')
        row_source = x_source.shape[0]
        row_target = x_target.shape[0]

        # 初始化权重
        weight_source = 1 * np.ones([row_source, 1]) / row_source  # 这边源域和目标域的初始化权重可以自行优化
        weight_target = 1 * np.ones([row_target, 1]) / row_target
        weights = np.concatenate((weight_source, weight_target), axis=0)
        # 初始化beta和result
        beta = 1 / (1 + np.sqrt(2 * np.log(row_source / self.epoch)))
        bata_T = np.zeros([1, self.epoch])
        result = np.ones([row_source + row_target, self.epoch])
        for i in range(self.epoch):
            # 令sum(weights)=1
            weights = self._calculate_weight(weights)
            print(f'-----The weights of epoch {i} is-----:', weights, sep='\n')
            # 拟合学习器
            self.base_estimator.fit(x_train, y_train, sample_weight=weights[:, 0])
            self.regressors.append(copy.deepcopy(self.base_estimator))
            result[:, i] = self.base_estimator.predict(x_train)
            # print(result[:, i])
            # 计算误差率
            error_rate = self._calculate_error_rate(y_target, result[row_source:, i], weights[row_source:, :])
            # print(f'-----The accuracy of epoch {i} is-----:', xgb_mape(y_target,result[row_source:, i]), sep='\n')
            if error_rate > 0.5:
                error_rate = 0.5
            if error_rate <= 1e-10:
                self.epoch = i
                print("Early stopping...")
                break
            bata_T[0, i] = error_rate / (1 - error_rate)
            # 更新权重
            D_t = np.abs(np.array(result[:, i]) - np.array(y_train)).max()
            for j in range(row_target):
                weights[row_source + j] = weights[row_source + j] * np.power(bata_T[0, i], -(np.abs(result[row_source + j, i] - y_target[j]) / D_t))  # 权重的更新方式可以优化,根据需求加快或者放慢权重的更新速度
            for j in range(row_source):
                weights[j] = weights[j] * np.power(beta, np.abs(result[j, i] - y_source[j]) / D_t)

    def predict(self, test):
        result = np.ones([test.shape[0], self.epoch + 1])
        predict = np.ones([test.shape[0]])
        i = 0
        # 每一轮迭代都预测一次测试集
        for regressor in self.regressors:
            pred = regressor.predict(test)
            result[:, i] = pred
            i += 1
        # 通过集成来获取最终预测结果
        for j in range(test.shape[0]):
            predict[j] = np.sum(
                result[j, int(np.floor(self.epoch / 2)):self.epoch]) / (self.epoch - int(np.floor(self.epoch / 2)))  # 结果部分也可以自行优化,可选择最后k次结果进行融合
        return predict

    def _calculate_weight(self, weights):
        sum_weight = np.sum(weights)
        return np.asarray(weights / sum_weight, order='C')

    def _calculate_error_rate(self, y_target, y_predict, weight):
        total = np.abs(y_target - y_predict).max()
        return np.sum(weight[:, 0] * np.abs(y_target - y_predict) / total)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Tradaboost.r2是一种基于传统AdaBoost算法的改进版本。传统的AdaBoost算法是一种集成学习算法,通过迭代训练多个弱分类器,再将这些弱分类器进行线性组合形成强分类器。而Tradaboost.r2则在传统AdaBoost算法的基础上进行了改进,使其在分类思想和算法性能上更加优化。 Tradaboost.r2的主要改进包括两个方面:分类器权重更新和样本权重更新。 传统AdaBoost算法中,分类器的权重更新是根据分类器预测结果和真实结果之间的差异来确定的。而Tradaboost.r2为每个分类器引入了一个估计权重,在分类器迭代过程中,根据分类器的真实准确率和估计准确率之间的差距,对分类器权重进行动态调整。这样做的目的是尽可能地减小集成分类器的错误率,提高整体性能。 样本权重更新方面,传统AdaBoost算法在每一轮迭代中都将误分类样本的权重增大,以便在下一次迭代中更加关注这些被误分类的样本。而Tradaboost.r2则采用了一种动态调整样本权重的策略,根据样本的预测准确率和估计准确率之间的差距来对样本权重进行更新。这样可以使得算法更加关注那些被错误分类的关键样本,提高整体的分类准确率。 通过以上两方面的改进,Tradaboost.r2在分类的效果和性能上都有很好的提升。它可以有效地处理高维、离散、连续和缺失数据的分类问题。此外,Tradaboost.r2还具有良好的鲁棒性,在噪声干扰较大的情况下也能获得较好的分类结果。 总的来说,Tradaboost.r2是一种基于传统AdaBoost算法改进的分类算法,通过分类器权重更新和样本权重更新策略,提高了分类准确率和整体性能,具有较强的适应性和鲁棒性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值