机器学习中Random Forest 随机森林小结(5步算法,11个优缺点,例子演示解决Kaggle高频竞赛题泰坦尼克沉船)

目录

一、基础介绍

二、优缺点分析

优点

缺点

三 . 如何建立随机森林?

四、怎样使用随机森林?

1)了解数据

2.  数据预处理

3)使用模型

4)评估

5)解释模型

五、怎样决定模型的参数?--网格搜索

六、总结


一、基础介绍

们将探索决策树,并且拓展它到随机森林。这种类型的模型,和我们之前见过的线性和逻辑回归不同,他们没有权重但是有很好的可解释性。随机森林属于 集成学习 中的 Bagging方法。由多个随机树构成,然后通过投票共同学习特征。

 

因为生长很深的树容易学习到高度不规则的模式,即overfit,在训练集上具有低bias和高variance的特点。随机森林是平均多个深决策树以降低variance的一种方法,其中,决策树是在一个数据集上的不同子集进行训练的,在最终的模型中通常会大大提高性能。

这有些像解决一道预测何时世界末日的难题,你给一个大学生解决,又给了一个在家里自学的人解决。两个人的解法很大概率是不一样的,你提取两个人解法的优势合起来就可以提高解答率。如果给100个人解答这道题目,如果有一些特征预测目标值的能力很强,那么这些特征就会被许多人所选择,这样就会导致树的强相关性。

机器学习中Random Forest 随机森林小结(5步算法,11个优缺点,例子演示解决Kaggle高频竞赛题泰坦尼克沉船)_第1张图片

二、优缺点分析

优点

  1. 特征很多的数据表现很好,无需做特征选择
  2. 它可以判断特征的重要程度
  3. 可以判断出不同特征之间的相互影响
  4. 不容易过拟合
  5. 训练速度比较快,容易做成并行方法
  6. 实现起来比较简单
  7. 对于不平衡的数据集来说,它可以平衡误差。
  8. 仅需比较少的数据预处理

缺点

  1. 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
  2. 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响。
  3. 当训练数据少于分类类别的时候表现很差。

三 . 如何建立随机森林?

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的方法。

1)了解数据

from sklearn.ensemble import RandomForestClassifier

导入数据:

机器学习中Random Forest 随机森林小结(5步算法,11个优缺点,例子演示解决Kaggle高频竞赛题泰坦尼克沉船)_第2张图片

2.  数据预处理

将数据分为文本数据和数字数据,文本数据是一些描述性质的,需要我们在提取特征分析。我们本文的重点是使用随机森林模型进行预测,不适用于文本数据处理。我们将去掉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

3)使用模型

# 初始化模型
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是怎么对树产生影响的,可以参照这个帖子。什么时候可以停止分裂?如果我们有一个很多特征的数据集,我们的决策树也会非常大。如果我们一直去分裂,我们终究会导致过拟合。所以这里有一些处理办法可以参考:

  1. 设置在叶子节点中的最少样本个数。
  2. 设置一个最大的深度(也就是从树根到叶子节点的最大距离)。
  3. 通过删除几乎没有信息增益的特征对决策树进行剪枝。

 

#训练
dtree.fit(X_train, y_train)

# 预测
pred_train = dtree.predict(X_train)
pred_test = dtree.predict(X_test)

4)评估

from sklearn.metrics import accuracy_score
# 正确率
train_acc = accuracy_score(y_train, pred_train)
test_acc = accuracy_score(y_test, pred_test)

输出正确率为0.7。

5)解释模型

# 特征重要性
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.0max_features='auto'max_leaf_nodes=None「最多叶子节点」,

 min_impurity_decrease=0.0min_impurity_split=Nonebootstrap=True

oob_score=Falsen_jobs=Nonerandom_state=Noneverbose=0

warm_start=Falseclass_weight=Noneccp_alpha=0.0max_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_

 然后间最佳的超参数输入随机森林模型拟合即可。

六、总结

本文讲述了随机森林的基础知识,优缺点,随机森林算法,怎样使用随机森林模型,和怎样寻找合适的模型参数。在学习随机森林前强烈推荐先学习决策树,了解有两个重要概念信息增益和熵的概念。对于随机森林使用中超参数的调节有重要的作用。

你可能感兴趣的:(机器学习,机器学习)