随机森林
随机森林 - RandomForestClassifier
在了解随机森林之前,得先了解一下:集成学习方法
集成学习是通过建立几个模型组合来解决单一问题的预测。 它的工作原理是生成多个分类器/模型 , 各自独立的学习和作出预测。 这些预测最后结合成单一的预测,因此优于任何一个单一分类器作出的预测。
什么是随机森林?
定义:在机器学习中,随机森林是一个包含了多个决策树的分类器,并且输出的类别是由个别树输出的类别的众数而定的。
例:你训练了10棵树,其中8个结果为True,2个树的结果为False , 那么最终结果会是True。
随机森林的创建过程
- 用N来表示训练样本的个数,M表示特征数目
- 一次随机选出一个样本,重复N次 # 使用后会放回,可能会出现重复#
- 随机选出m个特征, m<M ,建立决策树
- 采用有放回样本,也叫bootstrap抽样
问题来了,为什么要随机抽样训练集?
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也完全一样的。
为什么要有放回的抽样?
如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是有“偏移的”,都是“绝对的”,也就是说每棵树训练出来都是有很大差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票决定的。
随机森林API 👉 👇
sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion='gini',max_depth=none,bootstrap=True,random_state=None) - 随机森林分类器 - n_estimators: 森林里的树木数量 120 200 300 500 800 1200 - criterion: string ,可选,分割特征的测量方法 - max_depth: 可选, 树的最大深度 5 ,8 ,15,25,30 - max_features='auto',每个决策树的最大特征数量 - bootstrap: 是否在构建树时使用有放回抽样
## 案例 ## 泰坦尼克号
# titanic passenger # 导入相应API import pandas as pd from sklearn.ensemble import RandomForestClassifier # 随机森林 from sklearn.model_selection import train_test_split , GridSearchCV #数据分割器,网格搜索 from sklearn.feature_extraction import DictVectorizer # 字典提取 from sklearn.tree import DecisionTreeClassifier # 决策树 # 1. 读取数据 titan =pd.read_csv("titanic passenger list.csv") # 2.处理数据,筛选特征值,目标值 x = titan[['pclass','age','sex']] y = titan['survived'] # 3.缺失值处理 x['age'].fillna(x['age'].mean(),inplace=True) # 4.分割数据集 x_train , x_test , y_train , y_test =train_test_split(x,y,test_size=0.25) # 5.特征工程 类别特征-> one hot编码 dv = DictVectorizer(sparse=False) x_train = dv.fit_transform(x_train.to_dict(orient='records')) # 训练集 x_test = dv.transform(x_test.to_dict(orient='records')) # 测试集 # 6.随机森林进行预测--(加上超参数调优) rfc = RandomForestClassifier() #不指定参数,使用网格交叉搜索 param = {'n_estimators':[120,200,300,500,800],'max_depth':[5,8,15,25,30]} #指定参数 # 7.网格交叉搜索 gc =GridSearchCV(rfc , param_grid=param , cv=2) # cv 几则交叉搜索,2则只为案例演示 gc.fit(x_train , y_train) # 随机森林训练
## 查看准确率,最佳模型 ## 加入超参数得出
print("准确率:",gc.score(x_test,y_test)) print("最好的模型:",gc.best_params_) # 那么每次的准确率会不一样,有高有低是怎么回事呢? # 因为每次都是对数据集随机分割的,所以每次训练的准确率也会有所不同
随机森林总结 👉 只有优点
- 在当前的算法中具有极好的准确率
- 能够有效的运行在大数据集上
- 能够处理高纬度特征的输入样本,不需要降维 #因为在建树的过程就是随机抽取特征值
- 能够评估各个特征在分类问题上的重要性