机器学习之随机森林算法

随机森林是一种集成学习方法

一、什么是集成学习方法?

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

二、什么是随机森林?

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。例如,如果你训练了5个树,其中有4个树的结果是True,1个树的结果为False,那么最终的投票结果就是True。

三、随机森原理的过程

两个随机(假设N个样本,M个特征)

  1. 训练集随机:从N个样本中随机有放回得抽样N个
    BootStrap(非前端框架):随机有放回的抽样

  2. 特征值随机:从M个特征中随机的抽取m个特征(M >> m)

为什么随机抽样?
答:如果不进行随机抽样,每颗树的训练集都一样,那么最终训练出来的树分类结果也是完全一样的;
为什么有放回抽样?
答:如果不是有放回的抽样,那么每颗树的训练样本是不一样的,都是没有交集的,这样每颗树都是有偏

四、随机森林API

sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion='gini',max_depth=None,bootstrap=True,random_state=None,min_samples_split=2)
- 随机森林分类器
- n_estimators:integer,optional(default=10)森林里的树木数量
- criterion:string,可选(default='gini')分割特征的测量方法
- max_depth:integer或None,可选(默认无)树的最大深度
- max_features='auto' 每个决策树的最大特征数量
	1.if 'auto',then max_feature=sqrt(n_features)
	2.if 'sqrt',then max_features=sqrt(n_features)(same as suto)
	3.if 'log2',then max_features=log2(n_features)
	4.if None,then max_features=n_features
- bootstrap:boolean,optional(default = True)在构建树时是否放回抽样
- min_samples_split:节点划分最少样本树
- min_samples_leaf:叶子节点最小样本数

代码如下所示(加入了超参数搜索):

import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier

def titanic_demo():
    # 1)、获取数据
    titanic = pd.read_csv("/Users/dengzhao/Desktop/数据集/titanic/train.csv")
    # 2)、筛选特征值和目标值
    x = titanic[["Pclass","Age","Sex"]]
    y = titanic["Survived"]
    # 3)、缺失值处理
    x["Age"].fillna(x["Age"].mean(),inplace=True)
    # 4、转换成字典
    x = x.to_dict(orient="records")
    # 5)、数据集的划分
    x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=22)# random_state随机数种子
    # 6)、字典特征抽取
    transfer = DictVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 7)、转换器
    estimator = RandomForestClassifier()
    # 8)、模型评价
    # 加如网格搜索和交叉验证
    # 参数准备
    param_dic = {"n_estimators": [120,200,300,500,800,1200],'max_depth':[5,8,10,12,14]}
    estimator = GridSearchCV(estimator, param_grid=param_dic, cv=3)
    estimator.fit(x_train, y_train)
    # 5)模型评估
    """评估方法1:直接比对真实值和预测值"""
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
    """评估方法2:计算准确率"""
    score = estimator.score(x_test, y_test)  # 相当于计算了预估器的准确率,因为这里本来是完全一致的
    print("准确率:\n", score)
    # 最佳参数:best_params_
    print("最佳参数\n", estimator.best_params_)
    # 最佳结果:best_score_
    print("最佳结果\n", estimator.best_score_)
    # 最佳估计器:best_estimator_
    print("最佳估计器\n", estimator.best_estimator_)
    # 交叉验证结果:cv_results_
    print("交叉验证结果\n", estimator.cv_results_)
    return

if __name__ == '__main__':
    titanic_demo()

结果如下:
准确率:
0.7623318385650224
最佳参数
{‘max_depth’: 5, ‘n_estimators’: 120}
最佳结果
0.8174093375887098
最佳估计器
RandomForestClassifier(max_depth=5, n_estimators=120)

五、总结

  • 在KNN,决策树等算法中,具有极好的准确率
  • 能够有效地运行在大数据集上,处理具有高维特征的输入样本,而且不需要降维
  • 能够评估各个特征在分类问题上的重要性

你可能感兴趣的:(机器学习,机器学习,算法,随机森林)