zoukankan      html  css  js  c++  java
  • 分类算法之随机森林

    一、集成学习方法之随机森林

      集成学习通过建立几个模型组合来解决单一模型预测的问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。

    1、什么是随机森林

      随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。假设你训练了n棵树,其中有n-2棵树的结果类别是1,2棵树的结果的类别是2,那么最后的类别结果就是1。

    2、随机森林创建流程

    在创建随机森林之前,我们需要先知道随机森林中单棵决策树的创建流程:

    • 随机在N个样本中以有放回抽样的方式,取样N次(样本有可能重复)
    • 随机在M个特征中选出m个特征(m<M)

    可以以这种方式创建多棵树,显然每棵树的样本和特征大多不一样。

      值得注意的是上面的抽样是:有放回的抽样,如果不是有放回的抽样,这样每棵树的训练样本都是不同,之间也没有交集,也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树的投票表决。

    二、集成学习API

    1、class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None)

    上述就是随机森林的分类器,其中:

    • n_estimators:integer,optional(default = 10) 森林里的树木数量
    • criteria:string,可选(default =“gini”)分割特征的测量方法
    • max_depth:integer或None,可选(默认=无)树的最大深度
    • bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样

    2、实例

    import pandas as pd
    from sklearn.model_selection import train_test_split,GridSearchCV
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.ensemble import RandomForestClassifier
    
    
    
    def decision():
        """
        决策树对泰坦尼克号乘客进行生死预测
        :return: None
        """
        # 读取数据
        data = pd.read_csv("./data/决策树数据/data.csv")
    
        # 选取特征值、目标值
        x = data[['pclass', 'age', 'sex']]
        y = data['survived']
    
        # 处理缺失值
        x['age'].fillna(x['age'].mean(), inplace=True)
        print(x)
        """
         pclass        age     sex
          1st  29.000000  female
          1st   2.000000  female
        ...
        """
        # 分割数据集为训练集和测试集
        x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
    
        # 特征工程,pclass与sex都是非数字的值,所以需要将其值得类别进行one-hot编码,使用字典抽取,age值不变
        dict = DictVectorizer(sparse=False)
        x_train = dict.fit_transform(x_train.to_dict(orient='records'))
        x_test = dict.transform(x_test.to_dict(orient='records'))
        print(dict.get_feature_names())  # ['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female', 'sex=male']
        print(x_train)
        """
        [[32.          0.          0.          1.          0.          1.        ]
          ...
         [58.          1.          0.          0.          1.          0.        ]
         [35.          0.          1.          0.          0.          1.        ]
         [31.19418104  0.          0.          1.          0.          1.        ]]
    
        """
        # 用随机森林进行预测(超参数调优)
        rf = RandomForestClassifier()
    
        param = {"n_estimators":[120, 200, 300, 500],"max_depth":[5, 8, 15]}
        # 网格搜索与交叉验证
        gc = GridSearchCV(rf,param_grid=param,cv=2)
        gc.fit(x_train,y_train)
    
        # 准确率
        print(gc.score(x_test,y_test))
    
        #参数模型
        print(gc.best_params_)
        """
        {'max_depth': 5, 'n_estimators': 300}
        """
    
    if __name__ == '__main__':
        decision()

    随机森林几乎没有什么缺点,它有以下的优点:

    • 在当前所有算法中,具有极好的准确率
    • 能够有效地运行在大数据集上
    • 能够处理具有高维特征的输入样本,而且不需要降维
    • 能够评估各个特征在分类问题上的重要性
    • 对于缺省值问题也能够获得很好得结果
  • 相关阅读:
    阿里fastjson工具类
    poi导出excel2007版本
    java 利用poi 实现excel合并单元格后出现边框有的消失的解决方法
    spring整合atomikos实现分布式事务
    彻底理解ThreadLocal
    kubernetes架构和组件
    Promethues实战-简易教程系列
    Celery
    对称加密,非对称加密,证书机制
    Git diff
  • 原文地址:https://www.cnblogs.com/shenjianping/p/13171037.html
Copyright © 2011-2022 走看看