5 months ago

1.随机森林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)森林里的树木数量120,200,300,500,800,1200
criteria:string,可选(default =“gini”)分割特征的测量方法
max_depth:integer或None,可选(默认=无)树的最大深度 5,8,15,25,30
max_features="auto”,每个决策树的最大特征数量
If "auto", then max_features=sqrt(n_features).
If "sqrt", then max_features=sqrt(n_features) (same as "auto").
If "log2", then max_features=log2(n_features).
If None, then max_features=n_features.
bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
min_samples_split:节点划分最少样本数
min_samples_leaf:叶子节点的最小样本数
超参数:n_estimator, max_depth, min_samples_split,min_samples_leaf

2.实现随机森林算法

from sklearn.ensemble import RandomForestClassifier
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
def random_forest(titan):
    """
    随机森林进行乘客生存预测
    :return:
    """
    # 1、获取数据
    # titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    # 2、数据的处理
    x = titan[['pclass', 'age', 'sex']]

    y = titan['survived']

    # print(x , y)
    # 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取
    x['age'].fillna(x['age'].mean(), inplace=True)

    # 对于x转换成字典数据x.to_dict(orient="records")
    # [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]

    dict = DictVectorizer(sparse=False)

    x = dict.fit_transform(x.to_dict(orient="records"))
    
    print(dict.get_feature_names())
    print(x)

    # 分割训练集合测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # 进行决策树的建立和预测
    rf = RandomForestClassifier(n_estimators=10, max_depth=5)

    rf.fit(x_train, y_train)

    # print("预测的准确率为:", rf.score(x_test, y_test))

    return rf.score(x_test, y_test)

3.多次迭代求取平均值

import matplotlib.pyplot as plt
def score_avg(func,num):
    score_sum=0
    a=[]
    b=[]
    for i in range(1,num+1):
        score_sum += func(titan)
        # 每10次查看一下准确率
        #if i%10==0:
        score_ave = score_sum/(i)
        a.append(i)
        b.append(score_ave)
    # 获取最终的准确率
    print(score_ave)
    # 将准确率变化过程展示出来
    plt.plot(a,b)
    plt.grid()
    plt.show()

4.运行结果

num=5000
score_avg(random_forest,num)


从1000次之后,准确率收敛到0.823
随机森林中有各种超参数,可以使用网格搜索进行调优

5.结论

1)在当前所有算法中,具有极好的准确率
2)集成学习方法可以应用于所有的算法,比如之前学的K近邻和朴素贝叶斯(可惜没有现成的API供调用)
3)集成学习方法可以把预测的准确性在原有算法的基础上提高1%-2%,运算复杂度大大提升,所以关键在于原有算法的准确性

← 【机器学习】决策树的简单实现与树的结构导出 【Tensorflow笔记】placeholder ,varialble,constant的区别 →