(1)什么是随机森林?

  1. 集成学习方法:集成学习通过建立几个模型组合来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立的学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的方法作出预测。
  2. 随机森林:在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。

(2)随机森林建立多个决策树的过程

单个决策树建立过程如下:

  1. 对于N个样本,M个特征的数据
  2. 随机在N个样本中选择一个样本,重复N次;样本有可能重复。
  3. 随机在M个特征中选取m个特征,其中m<M,建立决策树;
  4. 采取bootstrap进行抽样。

为什么要随机抽样?

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

为什么要有放回的抽样?

       如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,每棵树的训练结果存在较大的差异。而随机森林最后的分类取决于多棵树(弱分类器)的投票结果。

(3)随机森林API:

sklearn.ensemble.RandomForestClassifier

随机森林样本分布不均衡_决策树

模型调参利器- GridSearchCV(网格搜索)

GridSearchCV的sklearn官方网址:

http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV

对上文中泰坦尼克号的案例使用随机森林预测示例:

from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.feature_extraction import DictVectorizer
# from sklearn.cross_validation import train_test_split  # 已经更新为下边api
from sklearn.model_selection import train_test_split,GridSearchCV
import pandas as pd

def forest():
    '''
    对泰坦尼克号预测生死
    数据地址:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt
    :return None
    '''

    # 读取数据
    titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    # 处理数据,找出特征值和目标值
    x = titan[["pclass", 'age', 'sex']]    #特征值
    y = titan[['survived']]                # 目标值

    # print(x)
    # 缺失值处理
    x['age'].fillna(x['age'].mean(), inplace=True)

    # 分割数据集到训练集合,测试集合.数据随机切分
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

    # 进行处理(特征工程)特征->类别-> one-hot编码
    dict = DictVectorizer(sparse=False)
    x_train = dict.fit_transform(x_train.to_dict(orient='records'))

    print(dict.get_feature_names())

    x_test = dict.fit_transform(x_test.to_dict(orient='records'))

    # print (x_train)

    # 随机森林进行预测(超参数调优)
    rf = RandomForestClassifier()

    param = {"n_estimators":[120,200,300,500,800,1200],'max_depth':[5,8,15,25,30]}

    # 网格搜索与交叉验证
    gc = GridSearchCV(rf, param_grid=param)
    gc.fit(x_train, y_train)

    print("准确率:",gc.score(x_test,y_test))

    print("查看选择的参数模型:",gc.best_params_)

    return None


if __name__== "__main__":
    forest()

(4)、随机森林的优点

      在当前所有的算法中,具有极好的准确率;

      能够有效的运行在大数据集上;

      能够处理具有高维特征的输入样本,而且不需要降维;

     能够评估各个特征在分类问题上的重要性。