机器学习之随机森林
概念理解:
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。利用相同的训练数搭建多个独立的分类模型,然后通过投票的方式,以少数服从多数的原则作出最终的分类决策。例如, 如果你训练了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()
结果:
随即森林的优点:
- 在当前所有算法中,具有极好的准确率
- 能够有效的运行在大数据集上(训练集和特征选取)
- 能够处理具有高维特征的输入样本,而且不需要降维
- 能够评估各个特征在分类问题上的重要性
--------------------成功,肯定是需要一点一滴积累的--------------------