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()

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

    • 在当前所有算法中,具有极好的准确率
    • 能够有效地运行在大数据集上
    • 能够处理具有高维特征的输入样本,而且不需要降维
    • 能够评估各个特征在分类问题上的重要性
    • 对于缺省值问题也能够获得很好得结果
  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/shenjianping/p/13171037.html
Copyright © 2011-2022 走看看