如何正确应用随机森林?

Posted

技术标签:

【中文标题】如何正确应用随机森林?【英文标题】:How to apply random forest properly? 【发布时间】:2017-10-23 18:10:02 【问题描述】:

我是机器学习和 python 的新手。现在我正在尝试应用随机森林来预测目标的二进制结果。在我的数据中,我有 24 个预测变量(1000 个观察值),其中一个是分类的(性别),其他的都是数字的。在数字值中,有两种类型的值,即欧元的货币量(非常倾斜和缩放)和数字(来自 atm 的交易数量)。我已经改变了大规模特征并进行了插补。最后,我检查了相关性和共线性,并在此基础上删除了一些特征(因此我有 24 个特征。)现在,当我实现 RF 时,它在训练集中总是完美的,而根据交叉验证,比率不是那么好。即使在测试集中应用它,它也会给出非常低的召回值。我该如何解决这个问题?

def classification_model(model, data, predictors, outcome):
    # Fit the model:
    model.fit(data[predictors], data[outcome])

    # Make predictions on training set:
    predictions = model.predict(data[predictors])

    # Print accuracy
    accuracy = metrics.accuracy_score(predictions, data[outcome])
    print("Accuracy : %s" % "0:.3%".format(accuracy))

    # Perform k-fold cross-validation with 5 folds
    kf = KFold(data.shape[0], n_folds=5)
    error = []
    for train, test in kf:
        # Filter training data
        train_predictors = (data[predictors].iloc[train, :])

        # The target we're using to train the algorithm.
        train_target = data[outcome].iloc[train]

        # Training the algorithm using the predictors and target.
        model.fit(train_predictors, train_target)

        # Record error from each cross-validation run
        error.append(model.score(data[predictors].iloc[test, :], data[outcome].iloc[test]))

    print("Cross-Validation Score : %s" % "0:.3%".format(np.mean(error)))

    # Fit the model again so that it can be refered outside the function:
    model.fit(data[predictors], data[outcome])



outcome_var = 'Sold'
model = RandomForestClassifier(n_estimators=20)
predictor_var = train.drop('Sold', axis=1).columns.values
classification_model(model,train,predictor_var,outcome_var)

#Create a series with feature importances:
featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False)
print(featimp)

outcome_var = 'Sold'
model = RandomForestClassifier(n_estimators=20, max_depth=20, oob_score = True)
predictor_var = ['fet1','fet2','fet3','fet4']
classification_model(model,train,predictor_var,outcome_var) 

【问题讨论】:

【参考方案1】:

在随机森林中,很容易过拟合。要解决此问题,您需要更严格地进行参数搜索以了解要使用的最佳参数。 [这里](http://scikit-learn.org/stable/auto_examples/model_selection/randomized_search.html ) 是有关如何执行此操作的链接:(来自 scikit 文档)。

这是过度拟合,您需要搜索适用于模型的最佳参数。该链接提供了用于超参数估计的网格和随机搜索的实现。 并且通过这个麻省理工学院人工智能讲座获得深入的理论方向也会很有趣:https://www.youtube.com/watch?v=UHBmv7qCey4&t=318s。

希望这会有所帮助!

【讨论】:

感谢您的帖子和链接。事实上,我已经尝试过 GridSearchCV 并在使用最佳参数时观察到相对更好的结果。我的主要问题是特别是回忆值。即使它改善得很好。但最终它仍然过拟合。我会继续寻找。 你尝试过随机搜索吗! 直到你提到我才知道!我去看看。

以上是关于如何正确应用随机森林?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 parRF 方法使随机森林运行得更快

如何更改 R 中随机森林的分割标准?

如何在 Caret 中绘制随机森林(游侠)树

RandomForest随机森林算法

分类算法 - 随机森林

在 Python 中为随机森林选择正确的分布