是bagging和决策树的结合
random forest(RF)=bagging+fully-grown CART decision tree
将所有决策树通过bagging的形式结合起来,避免单个决策树造成过拟合
获得不同的决策树的方式:
每一轮得到的树由不同的30个特征构成,每棵树不一样
选择的是一部分特征,属于低维映射
上面的bagging涉及到的bootstrap随机抽取数据集训练不同的模型的过程,是不是和交叉验证比较像,下表是两者选取数据集合训练的比较:
有几点值得注意:
OOB类似于验证数据集(都是未参与训练的),那么是否能用OOB验证构建的模型g的好坏呢?可以!
例子:\((x_N,y_N)\)是\(g_2,g_3,g_T\)的OOB,那么\((x_N,y_N)\)在\(G_N^-(N)\)上的表现是:\(G_N^-(N)=average(g_2,g_3,g_T)\)
这个做法类似于留一法验证,每次只对一个样本验证其在所属的所有的OOB的g模型上的表现(不是单个模型)
特征选择:从d维特征到d‘特征的subset-transform,最终是由d’维特征进行模型训练。比如原来特征有10000个,选取300个,需要舍弃部分特征:
筛选:计算每个特征的重要性(权重),再根据重要性的排序进行选择。
【2】通过permutation方式,将原来的N个样本的第i个特征打乱(重新洗牌)
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.datasets import make_classification
# 构建数据集
>>> X, y = make_classification(n_samples=1000, n_features=4,
... n_informative=2, n_redundant=0,
... random_state=0, shuffle=False)
# 构建分类器
>>> clf = RandomForestClassifier(n_estimators=100, max_depth=2,
... random_state=0)
# 模型训练
>>> clf.fit(X, y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=2, max_features='auto', max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=None,
oob_score=False, random_state=0, verbose=0, warm_start=False)
# 获得每个特征的重要性分数
>>> print(clf.feature_importances_)
[0.14205973 0.76664038 0.0282433 0.06305659]
# 预测新数据
>>> print(clf.predict([[0, 0, 0, 0]]))
[1]