Fork me on GitHub

分类算法之随机森林

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

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

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

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

  • 在当前所有算法中,具有极好的准确率
  • 能够有效地运行在大数据集上
  • 能够处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性
  • 对于缺省值问题也能够获得很好得结果

 

posted @ 2020-06-21 13:43  iveBoy  阅读(1230)  评论(0编辑  收藏  举报
TOP