分类——组合算法之装袋:随机森林以及Python实现

前面的博客讲到装袋(bagging)是一种一次性综合多个基本分类器的预测结果,进行多数表决(分类)或取均值(回归)的组合算法。
装袋又称自助聚集:以均匀概率有放回从原训练数据集中挑选出与原数据集相同数量的样本作为当前基本分类器的训练数据集(自主样本集, 大约含有原数据集63.2%的样本),重复k次建立k个基本分类器。注意,自助样本集通常含有重复元素。

算法简介

随机森林(Random Forest):是以决策树作为基本分类器的装袋算法。

特征的选择

随机输入(RI):特征较多时,每个基本分类器随机选择n个特征参与训练。
随机组合(RC): 特征较少时,随机抽取L个特征,在[-1,1]上的均匀分布产生这L个特征的系数,线性组合成新的特征。(经测试,RC比较耗时)

算法流程

  • Input: 训练数据集(X,y),树的数目n_tree,特征的个数n_fea,阈值epsilon,每棵树最大训练步骤maxstep
  • Output: 随机森林组合分类器
  • Step1: 随机抽取特征以及自助样本集
  • Step2: 构建CART树,并训练

代码

"""
随机森林算法,组合算法bagging(装袋)的一种
"""
from collections import defaultdict
import numpy as np
import math
from cart_clf import CART_CLF


class RandomForest:
    def __init__(self, n_tree=6, n_fea=None, ri_rc=True, L=None, epsilon=1e-3, min_sample=1):
        self.n_tree = n_tree
        self.n_fea = n_fea  # 每棵树中特征的数量
        self.ri_rc = ri_rc  # 判定特征的选择选用RI还是RC, 特征比较少时使用RC
        self.L = L # 选择RC时,进行线性组合的特征个数
        self.tree_list = []  # 随机森林中子树的list

        self.epsilon = epsilon
        self.min_sample = min_sample  # 叶节点含有的最少样本数

        self.D = None  # 输入数据维度
        self.N = None

    def init_param(self, X_data):
        # 初始化参数
        self.D = X_data.shape[1]
        self.N = X_data.shape[0]
        if self.n_fea is None:
            self.n_fea = int(math.log2(self.D) + 1)  # 默认选择特征的个数
        return

    def extract_fea(self):
        # 从原数据中抽取特征(RI)或线性组合构建新特征(RC)
        if self.ri_rc:
            if self.n_fea > self.D:
                raise ValueError('the number of features should be lower than dimention of data while RI is chosen')
            fea_arr = np.random.choice(self.D, self.n_fea, replace=False)
        else:
            fea_arr = np.zeros((self.n_fea, self.D))
            for i in range(self.n_fea):
                out_fea = np.random.choice(self.D, self.L, replace=False)
                coeff = np.random.uniform(-1, 1, self.D)  # [-1,1]上的均匀分布来产生每个特征前的系数
                coeff[out_fea] = 0
                fea_arr[i] = coeff
        return fea_arr

    def extract_data(self, X_data, y_data):
        # 从原数据中有放回的抽取样本,构成每个决策树的自助样本集
        fea_arr = self.extract_fea()  # col_index or coeffs
        inds = np.unique(np.random.choice(self.N, self.N))  # row_index, 有放回抽取样本
        sub_X = X_data[inds]
        sub_y = y_data[inds]
        if self.ri_rc:
            sub_X = sub_X[:, fea_arr]
        else:
            sub_X = sub_X @ fea_arr.T
        return sub_X, sub_y, fea_arr

    def fit(self, X_data, y_data):
        # 训练主函数
        self.init_param(X_data)
        for i in range(self.n_tree):
            sub_X, sub_y, fea_arr = self.extract_data(X_data, y_data)
            subtree = CART_CLF(epsilon=self.epsilon, min_sample=self.min_sample)
            subtree.fit(sub_X, sub_y)
            self.tree_list.append((subtree, fea_arr))  # 保存训练后的树及其选用的特征,以便后续预测时使用
        return

    def predict(self, X):
        # 预测,多数表决
        res = defaultdict(int)  # 存储每个类得到的票数
        for item in self.tree_list:
            subtree, fea_arr = item
            if self.ri_rc:
                X_modify = X[fea_arr]
            else:
                X_modify = (np.array([X]) @ fea_arr.T)[0]
            label = subtree.predict(X_modify)
            res[label] += 1
        return max(res, key=res.get)


if __name__ == '__main__':
    from sklearn.datasets import load_iris

    data = load_iris()
    X_data = data['data']
    y_data = data['target']
    from machine_learning_algorithm.cross_validation import validate

    g = validate(X_data, y_data, ratio=0.2)
    for item in g:
        X_train, y_train, X_test, y_test = item
        RF = RandomForest(n_tree=50, n_fea=2, ri_rc=True)
        RF.fit(X_train, y_train)
        score = 0
        for X, y in zip(X_test, y_test):
            if RF.predict(X) == y:
                score += 1
        print(score / len(y_test))

代码注解:CART代码参见博客机器学习——CART分类与回归

我的GitHub
注:如有不当之处,请指正。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
基于Python随机森林插值算法是一种用于处理GIS数据的插值方随机森林是一种集合学习方,可以用于分类和回归。它将多个决策树组合在一起,每棵树的参数都不相同,然后将每棵树的预测结果取平均值,这样既能保留决策树的效果,又可以降低过拟合的风险。随机森林算法可以通过使用Python中的scikit-learn库来实现。 要了解更多关于随机森林算法的细节,可以查看scikit-learn官方文档提供的链接:。在该链接中,您可以找到随机森林算法的具体用、参数设置和示例代码等信息。 使用Python随机森林插值算法进行GIS数据处理可以带来很多优点。首先,随机森林算法可以自动处理缺失值和异常值,使得数据处理更加稳健。其次,随机森林算法可以进行特征选择,排除无关特征,提高了模型的准确性。另外,随机森林算法在处理高维数据时也表现出色。最后,随机森林算法可以通过调整参数来达到更好的性能。 因此,基于Python随机森林插值算法是一种强大的工具,可以用于处理GIS数据,并取得较好的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [python与GIS数据处理——随机森林算法插值](https://blog.csdn.net/yuanzhoulvpi/article/details/123171224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [算法笔记(9)-随机森林算法Python代码实现](https://blog.csdn.net/li1873997/article/details/124782603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值