随机森林
丹丹

基本介绍

  1. 从原始训练数据集中,应⽤bootstrap⽅法有放回地随机抽取k个新的⾃助样本集,并由此构建k棵分类回归树,每次未被抽到的样本组成了K个袋外数据(out-of-bag,BBB)
  2. 设有n个特征,则在每⼀棵树的每个节点处随机抽取m个特征,通过计算每个特征蕴含的信息量,特征中选择⼀个最具有分类能⼒的特征进⾏节点分裂
  3. 每棵树最⼤限度地⽣长, 不做任何剪裁
  4. 将⽣成的多棵树组成随机森林, ⽤随机森林对新的数据进⾏分类,分类结果按树分类器投票多少⽽定

RandomForestClassifier

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.ensemble import RandomForestClassifier          # 导入随机森林的包
from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
iris_data = iris['data']
iris_label = iris['target']
iris_target_name = iris['target_names']
X = np.array(iris_data)
Y = np.array(iris_label)

x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.25)

clf = RandomForestClassifier()
clf = clf.fit(x_train, y_train)
/anaconda3/lib/python3.7/site-packages/sklearn/ensemble/forest.py:246: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22.
  "10 in version 0.20 to 100 in 0.22.", FutureWarning)
1
2
3
4
5
6
7
8
9
from sklearn.metrics import roc_curve, auc

y_pred = clf.predict(x_test)

false_positive_rate, true_positive_rate, thresholds = roc_curve(
y_test, y_pred, pos_label=2)

roc_auc = auc(false_positive_rate, true_positive_rate)
roc_auc
0.9821428571428571

调参

  • n_estimators: int 默认10
  • criterion:gini” or “entropy”(default=”gini”)表示使用基尼不纯度还是信息增益来计算属性,来选择最合适的节点
  • max_depth:(default=None)设置树的最大深度,默认为None,直到使每一个叶节点只有一个类别,或是达到min_samples_split
  • min_samples_split:默认2,int(可以被分割的所含最小样本数),float(总样本的百分比)
  • min_samples_leaf:默认1,int或float,叶子节点所含最少样本数
  • min_weight_fraction_leaf:(default=0) 叶子节点所需要的最小权值(当样本采样权重设置时才有意义,叶子节点的权重为属于该节点的所有样本权重和)
  • max_features:(default=”auto”) 每次找最好的分割点是可以考虑的特征数
  • max_leaf_nodes:最大叶节点数 和树的最大深度同样作用
  • bootstrap:是否有放回采样,默认True
  • oob_score:默认False,是否使用袋外数据统计泛华误差。利用在某次决策树训练中没有被采样选中的数据对该单个模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错
  • n_jobs:默认1.可并行job数。-1代表有多少job=core
  • random_state:如果给定相同的参数和训练数据,random_state的确定值将始终产生相同的结果
  • verbose:(default=0) 是否显示任务进程
  • warm_start:False热启动,决定是否使用上次调用该类的结果然后增加新的
  • class_weight:None,各个label的权重

参考:

  1. 从机器学习到深度学习:基于Scikit-learn与TensorFlow的高效开发实战
  2. sklearn 随机森林分类iris花
  3. 快速理解bootstrap,bagging,boosting-三个概念