目录
一、基础介绍
二、优缺点分析
优点
缺点
三 . 如何建立随机森林?
四、怎样使用随机森林?
1)了解数据
2. 数据预处理
3)使用模型
4)评估
5)解释模型
五、怎样决定模型的参数?--网格搜索
六、总结
们将探索决策树,并且拓展它到随机森林。这种类型的模型,和我们之前见过的线性和逻辑回归不同,他们没有权重但是有很好的可解释性。随机森林属于 集成学习 中的 Bagging方法。由多个随机树构成,然后通过投票共同学习特征。
因为生长很深的树容易学习到高度不规则的模式,即overfit,在训练集上具有低bias和高variance的特点。随机森林是平均多个深决策树以降低variance的一种方法,其中,决策树是在一个数据集上的不同子集进行训练的,在最终的模型中通常会大大提高性能。
这有些像解决一道预测何时世界末日的难题,你给一个大学生解决,又给了一个在家里自学的人解决。两个人的解法很大概率是不一样的,你提取两个人解法的优势合起来就可以提高解答率。如果给100个人解答这道题目,如果有一些特征预测目标值的能力很强,那么这些特征就会被许多人所选择,这样就会导致树的强相关性。
1)用N表示训练集的样本个数,M表示特征数目。
2)输入特征数目m,用于确定决策树上一个节点的决策结果;其中m應远小於M。
3)又放回的抽取随机N次,每次抽取一个,就形成了最终的N个样本。形成一个训练集(也称为bootstrap取樣),並用未抽到的用例样本(out of bag)作預測,評估其誤差。
4)对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征决定的。根据这m个特征,选取最佳的分裂方式。
5)按照步骤1-5建立大量的决策树,就形成随机森林了。
按照上面的步骤,我们用代码跑一遍,会有更清晰的理解了
举一个例子,我们有一群人的是否工作,年龄和是否结婚的数据,做一个模型,用来预测某一个人时高收入还是低收入:
data = pandas.DataFrame([
[0,4,20,0],
[0,4,60,2],
[0,5,40,1],
[1,4,25,1],
[1,5,35,2],
[1,5,55,1]
])
data.columns = ["high_income", "employment", "age", "marital_status"]
# 建立10个tree
tree_count = 10
# 每一个“bag”将会有60%的原来的训练集数据
bag_proportion = .6
predictions = []
for i in range(tree_count):
# We select 60% of the rows from train, sampling with replacement
# random_state设定让我们能够得到可重复的数据
# 我们将它设定为i而不是一个固定的数字,因为我们不希望每棵树木取得的数据是一样的
bag = train.sample(frac=bag_proportion, replace=True, random_state=i)
# 从bag中 拟合 decision tree 模型
clf = DecisionTreeClassifier(random_state=1, min_samples_leaf=2, splitter = "random", max_features = "auto")
clf.fit(bag[columns], bag["high_income"])
# 应用模型做预测
predictions.append(clf.predict_proba(test[columns])[:,1])
combined = numpy.sum(predictions, axis=0) / 10
rounded = numpy.round(combined)
#输出roc_auc_score
print(roc_auc_score(test["high_income"], rounded))
这是自己写的随机森林算法,怎样调用包中模型在实际的例子上应用呢?我们以Kaggle上热门竞赛题目”预测泰坦尼克号沉船生还的人”为例子,解释在实际例子中怎样使用随机森林算法。
数据来源于Kaggle,链接在这里。
如果导入sklearn.ensemble中的RandomForestClassifier可以使我们很方便快捷的训练并检测random foreast。它和DecisionTreeClassifier使用interface是一样的。其中两个parameter不一样,需要注意一下。一是 n_estimators是我们建立的tree的数量。 二是 boottrap,默认为True,即使用boortrap的方法。
from sklearn.ensemble import RandomForestClassifier
导入数据:
将数据分为文本数据和数字数据,文本数据是一些描述性质的,需要我们在提取特征分析。我们本文的重点是使用随机森林模型进行预测,不适用于文本数据处理。我们将去掉Name Ticket Cabin。
# 预处理
def preprocess(df):
# 删除掉含有空值的行
df = df.dropna()
# 删除基于文本的特征
features_to_drop = ["name", "cabin", "ticket"]
df = df.drop(features_to_drop, axis=1)
# pclass, sex, 和 embarked 是类别变量
# 我们将把字符串转化成浮点数,不再是逻辑回归中的编码变量
df['sex'] = df['sex'].map( {'female': 0, 'male': 1} ).astype(int)
df["embarked"] = df['embarked'].dropna().map( {'S':0, 'C':1, 'Q':2} ).astype(int)
return df
# 初始化模型
model = RandomForestClassifier(
n_estimators=args.n_estimators, criterion="entropy",
max_depth=args.max_depth, min_samples_leaf=args.min_samples_leaf)
你可以随意改动 max_depth 和 min_samples 来观察决策树。如果不知道 max_depth 和 min_samples是怎么对树产生影响的,可以参照这个帖子。什么时候可以停止分裂?如果我们有一个很多特征的数据集,我们的决策树也会非常大。如果我们一直去分裂,我们终究会导致过拟合。所以这里有一些处理办法可以参考:
- 设置在叶子节点中的最少样本个数。
- 设置一个最大的深度(也就是从树根到叶子节点的最大距离)。
- 通过删除几乎没有信息增益的特征对决策树进行剪枝。
#训练
dtree.fit(X_train, y_train)
# 预测
pred_train = dtree.predict(X_train)
pred_test = dtree.predict(X_test)
from sklearn.metrics import accuracy_score
# 正确率
train_acc = accuracy_score(y_train, pred_train)
test_acc = accuracy_score(y_test, pred_test)
输出正确率为0.7。
# 特征重要性
features = list(X_test.columns)
importances = forest.feature_importances_
std = np.std([tree.feature_importances_ for tree in forest.estimators_], axis=0)
indices = np.argsort(importances)[::-1]
num_features = len(importances)
# 打印
for i in indices:
print ("{0} - {1:.3f}".format(features[i], importances[i]))
输出:
sex - 0.503 age - 0.198 fare - 0.129 embarked - 0.086 parch - 0.037 sibsp - 0.031 pclass - 0.017
我们可以看到,模型拟合效果好不好,参数至关重要。
class
sklearn.ensemble.
RandomForestClassifier
(n_estimators=100,{建立多少个树} criterion='gini', {标准采用计算信息增益gini的方法}max_depth=None「树的深度」, min_samples_split=2,「分裂树最少两个数据」 min_samples_leaf=1,「叶子节点最少有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=None, random_state=None, verbose=0,
warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)[source]
from sklearn.model_selection import GridSearchCV
# 创建网格的参数
param_grid = {
'bootstrap': [True],
'max_depth': [10, 20, 50],
'max_features': [len(features)],
'min_samples_leaf': [3, 4, 5],
'min_samples_split': [4, 8],
'n_estimators': [5, 10, 50] # of trees
}
# 初始化随机森林
forest = RandomForestClassifier()
# 实例化网格搜索
grid_search = GridSearchCV(estimator=forest, param_grid=param_grid, cv=3,
n_jobs=-1, verbose=1)
# 网格搜索拟合数据
grid_search.fit(X_train, y_train)
# 查看最佳参数组合
grid_search.best_params_
然后间最佳的超参数输入随机森林模型拟合即可。
本文讲述了随机森林的基础知识,优缺点,随机森林算法,怎样使用随机森林模型,和怎样寻找合适的模型参数。在学习随机森林前强烈推荐先学习决策树,了解有两个重要概念信息增益和熵的概念。对于随机森林使用中超参数的调节有重要的作用。