机器学习系列 - 随机森林(RF)


先记录一下使用方法,哇我真的吹爆scikit-learn这个库,之前想做pca分析,手动代码实现,用了一上午去复习方差协方差矩阵各种线代知识,然后发现scikit-learn直接提供了方法,好吧,对于小白来说总要多走走路才好,理解一下实现原理也不错,但是不妨碍scikit-learn这个是真的好用啊,什么都提供了,机器学习首选!!

1. scikit-learn - RangeForestClassifier

scikit-learn中和随机森林算法相关的类为RangeForestClassifier,相关官方文档讲解点击这里,这个类的主要参数和方法如下:
类的构造函数:

RandomForestClassifier(n_estimators=10,criterion=’gini’, max_depth=None,min_samples_split=2,min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None,
verbose=0, warm_start=False, class_weight=None)

说明:

参数(params):
    n_estimators:数值型取值
        森林中决策树的个数,默认是10

    criterion:字符型取值
        采用何种方法度量分裂质量,信息熵或者基尼指数,默认是基尼指数

    max_features:取值为int型, float型, string类型, or None(),默认"auto"
        寻求最佳分割时的考虑的特征数量,即特征数达到多大时进行分割。
        int:max_features等于这个int值
        float:max_features是一个百分比,每(max_features * n_features)特征在每个分割出被考虑。
        "auto":max_features等于sqrt(n_features)
        "sqrt":同等于"auto"时
        "log2":max_features=log2(n_features)
        None:max_features = n_features

    max_depth:int型取值或者None,默认为None
        树的最大深度

    min_samples_split:int型取值,float型取值,默认为2
        分割内部节点所需的最少样本数量
        int:如果是int值,则就是这个int值
        float:如果是float值,则为min_samples_split * n_samples

    min_samples_leaf:int取值,float取值,默认为1
        叶子节点上包含的样本最小值
        int:就是这个int值
        float:min_samples_leaf * n_samples

    min_weight_fraction_leaf : float,default=0.
        能成为叶子节点的条件是:该节点对应的实例数和总样本数的比值,至少大于这个min_weight_fraction_leaf值

    max_leaf_nodes:int类型,或者None(默认None)
        最大叶子节点数,以最好的优先方式生成树,最好的节点被定义为杂质相对较少,即纯度较高的叶子节点

    min_impurity_split:float取值 
        树增长停止的阀值。一个节点将会分裂,如果他的杂质度比这个阀值;如果比这个值低,就会成为一个叶子节点。

    min_impurity_decrease:float取值,默认0.
        一个节点将会被分裂,如果分裂之后,杂质度的减少效果高于这个值。

    bootstrap:boolean类型取值,默认True
        是否采用有放回式的抽样方式

    oob_score:boolean类型取值,默认False
        是否使用袋外样本来估计该模型大概的准确率

    n_jobs:int类型取值,默认1
        拟合和预测过程中并行运用的作业数量。如果为-1,则作业数设置为处理器的core数。

    class_weight:dict, list or dicts, "balanced"
        如果没有给定这个值,那么所有类别都应该是权重1
        对于多分类问题,可以按照分类结果y的可能取值的顺序给出一个list或者dict值,用来指明各类的权重.
        "balanced"模式,使用y值自动调整权重,该模式类别权重与输入数据中的类别频率成反比,
即n_samples / (n_classes * np.bincount(y)),分布为第n个类别对应的实例数。
        "balanced_subsample"模式和"balanced"模式类似,只是它计算使用的是有放回式的取样中取得样本数,而不是总样本数

该类的主要属性:

属性:
    estimators_:决策树列表
        拟合好的字分类器列表,也就是单个决策树

    classes_:array of shape = [n_features]
        类别标签列表

    n_classes_:int or list
        类别数量

    n_features:int
        拟合过程中使用的特征的数量

    n_outputs:int 
        拟合过程中输出的数量

    featrue_importances:特征重要程度列表
        值越大,说明越重要

    oob_score:array of shape = [n_features]
        使用oob数据集测试得到的得分数

    oob_decision_funtion_:array of shape = [n_features, n_classes]
        oob样本预测结果,每一个样本及相应结果对列表

该类的主要方法:

方法:
    apply(X):用构造好的森林中的树对数据集X进行预测,返回每棵树预测的叶子节点。所以结果应该是二维矩阵,
行为样本第几个样本,列为每棵树预测的叶子节点。 

    decision_path(X):返回森林中的决策路径

    fit(X, y[, sample_weight]):用训练数据集(x, y)来构造森林

    get_params([deep]):获得分类器的参数

    predict(X):预测X的类别

    predict_log_proba(X):预测X的类的对数概率,和predict_proba类似,只是取了对数

    predict_proba(X):预测X的类别的概率。输入样本的预测类别概率被计算为森林中树木的平均预测类别概率。
单个树的类概率是叶中同一类的样本的比率。因为叶子节点并不是完全纯净的,它也有杂质,
不同种类所占恶比率是不一样的,但肯定有一类纯度很高。返回值是array of shape = [n_samples, n_classes]

    score(X, y[,sample_weight]):返回给定的数据集(数据集指定了类别)的预测准确度

    set_params(**params):设置决策树的参数

参考:scikit-learn中随机森林使用详解

2. Demo - 处理印第安人糖尿病诊断问题

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import numpy as np

# 导入数据
dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',')
# 分割输入x和输出Y
x = dataset[:, 0: 8]
Y = dataset[:, 8]

feature_train, feature_test, target_train, target_test = train_test_split(x, Y, test_size=0.2, random_state=56)

rf_model = RandomForestClassifier(n_estimators=100)
rf_model.fit(feature_train, target_train)
predict_results = rf_model.predict(feature_test)

print(accuracy_score(predict_results, target_test))

结果:
在这里插入图片描述

3. 使用GridSearchCV调参

官方API
1)引入GridSearchCV

from sklearn.model_selection import GridSearchCV

2)调参1:n_estimators
弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,并且n_estimators到一定的数量后,再增大n_estimators获得的模型提升很小,所以一般选择一个适中的数值,默认是100。

param_test1 = {'n_estimators': range(80, 201, 10)}
gsearch1 = GridSearchCV(estimator=RandomForestClassifier(min_samples_split=100,
                                                         min_samples_leaf=20, max_depth=8, max_features='sqrt',
                                                         random_state=10),
                        param_grid=param_test1, scoring='roc_auc', cv=5)
gsearch1.fit(x, Y)
print(gsearch1.best_params_, gsearch1.best_score_)

结果:在这里插入图片描述
3)接着对决策树最大深度max_depth和内部节点再划分所需最小样本数min_samples_split进行网格搜索

# 调参2:max_depth,min_samples_split
param_test2 = {'max_depth': range(3, 14, 2), 'min_samples_split': range(50, 201, 20)}
gsearch2 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170,
                                                         min_samples_leaf=20, max_features='sqrt', oob_score=True,
                                                         random_state=10),
                        param_grid=param_test2, scoring='roc_auc', iid=False, cv=5)
gsearch2.fit(x, Y)
print(gsearch2.best_params_, gsearch2.best_score_)

结果:
在这里插入图片描述
4)对内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf一起调参

# 调参3:min_samples_split,min_samples_leaf
param_test3 = {'min_samples_split': range(80, 150, 20), 'min_samples_leaf': range(10, 60, 10)}
gsearch3 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170, max_depth=7,
                                                         max_features='sqrt', oob_score=True, random_state=10),
                        param_grid=param_test3, scoring='roc_auc', iid=False, cv=5)
gsearch3.fit(x, Y)
print(gsearch3.best_params_, gsearch3.best_score_)

结果:
在这里插入图片描述
5)对最大特征数max_features调参

# 调参:max_features
param_test4 = {'max_features': range(3, 8, 1)}
gsearch4 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170, max_depth=7, min_samples_split=80,
                                                         min_samples_leaf=10, oob_score=True, random_state=10),
                        param_grid=param_test4, scoring='roc_auc', iid=False, cv=5)
gsearch4.fit(x, Y)
print(gsearch4.best_params_, gsearch4.best_score_)

结果:
在这里插入图片描述参考:机器学习之集成学习(七)随机森林scikit-learn库
可见调参不一定是有用的

4. 随机森林理论学习

参考:[Machine Learning & Algorithm] 随机森林(Random Forest)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章