机器学习之随机森林

概念理解:

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。利用相同的训练数搭建多个独立的分类模型,然后通过投票的方式,以少数服从多数的原则作出最终的分类决策。例如, 如果你训练了5个树, 其中有4个树的结果是True, 1个数的结果是False, 那么最终结果会是True.

在前面的决策当中我们提到,一个标准的决策树会根据每维特征对预测结果的影响程度进行排序,进而决定不同的特征从上至下构建分裂节点的顺序,如此以来,所有在随机森林中的决策树都会受这一策略影响而构建的完全一致,从而丧失的多样性。所以在随机森林分类器的构建过程中,每一棵决策树都会放弃这一固定的排序算法,转而随机选取特征。

算法学习:

根据下列算法而建造每棵树:

  • 用N来表示训练用例(样本)的个数,随机在N个样本中选择一个样本。
  • 输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M,M表示总特征数目。
  • 从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
  • 对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。

 

 

 

 

 为什么要随机抽取训练集?

  • 如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的。

为什么要有放回的抽样?

  • 如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都没有交集。这样每棵树都是“有偏的”,也就是说每棵树训练出来的结果都是由很大的差异。而随机森林随后分类取决于多棵树的投票表决。

 

API:sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=‘gini’, max_depth=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None)

 

继续以上一篇泰坦尼克号乘客的例子演示:

上代码:

 1 import sklearn
 2 import pandas as pd
 3 from sklearn.feature_extraction import DictVectorizer
 4 from sklearn.model_selection import train_test_split
 5 from sklearn.ensemble import RandomForestClassifier
 6 from sklearn.model_selection import GridSearchCV
 7 
 8 #pd.set_option('display.max_columns',15)
 9 def decision():
10     '''
11     决策树对泰坦尼克号进行预测
12     :return: None
13     '''
14 
15     #获取数据
16     titian = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')
17 
18     #数据处理,找出特征值和目标值
19     x = titian[['pclass','age','sex']]
20     y = titian['survived']
21 
22     #缺失值处理
23     x['age'].fillna(x['age'].mean(), inplace=True)
24 
25     #分割数据集到训练集和测试集
26     x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.25)
27 
28     #进行处理(特征工程) 特征 -》类别 -》 one_hot编码
29     dict = DictVectorizer(sparse=False)
30     x_train= dict.fit_transform(x_train.to_dict(orient='records'))
31     print(dict.get_feature_names())
32 
33     x_test = dict.transform(x_test.to_dict(orient='records'))
34     print(x_train)
35 
36     #随机森林预测
37     rf = RandomForestClassifier()
38 
39     #超参数调优
40     param = {'n_estimators': [120,200,300,500,800,1200], 'max_depth':[5,8,15,25,30]}
41 
42     #网格搜索与交叉验证
43     gc = GridSearchCV(rf, param_grid=param)
44     gc.fit(x_train,y_train)
45 
46     print("准确率: ", gc.score(x_test,y_test))
47     print('查看选择的参数模型:', gc.best_params_)
48 
49     return None
50 
51 if __name__ == '__main__':
52     decision()

结果:

 

 

 

 随即森林的优点:

  • 在当前所有算法中,具有极好的准确率
  • 能够有效的运行在大数据集上(训练集和特征选取)
  • 能够处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性
posted @ 2019-12-25 11:11  牛公的跑奔  阅读(467)  评论(0编辑  收藏  举报
总访问量:AmazingCounters.com