随机森林

随机森林 - 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_)
# 那么每次的准确率会不一样,有高有低是怎么回事呢?
# 因为每次都是对数据集随机分割的,所以每次训练的准确率也会有所不同

 

 随机森林总结 👉 只有优点

  • 在当前的算法中具有极好的准确率
  • 能够有效的运行在大数据集上
  • 能够处理高纬度特征的输入样本,不需要降维  #因为在建树的过程就是随机抽取特征值
  • 能够评估各个特征在分类问题上的重要性

 

posted @ 2020-04-04 22:56  逍遥大帝  阅读(304)  评论(0编辑  收藏  举报