【问题标题】:Build a Random Forest regressor with Cross Validation from scratch从头开始构建具有交叉验证的随机森林回归器
【发布时间】:2017-11-13 05:37:23
【问题描述】:

我知道这是一个非常经典的问题,在这个论坛上可能会被多次回答,但是我找不到任何明确的答案来从头开始清楚地解释这一点。

首先,假设我的名为 my_data 的数据集有 4 个变量,例如 my_data = variable1, variable2, variable3, target_variable

那么,让我们来解决我的问题。我将解释我的所有步骤,并就我遇到的问题寻求您的帮助:

# STEP1 : split my_data into [predictors] and [targets]

predictors = my_data[[
'variable1',
'variable2',
'variable3'
]]


targets = my_data.target_variable

# STEP2 : import the required libraries

from sklearn import cross_validation
from sklearn.ensemble import RandomForestRegressor

#STEP3 : define a simple Random Forest model attirbutes

model = RandomForestClassifier(n_estimators=100)


#STEP4 : Simple K-Fold cross validation. 3 folds.

cv = cross_validation.KFold(len(my_data), n_folds=3,  random_state=30)

# STEP 5

在这一步,我想根据训练数据集拟合我的模型,然后 在测试数据集上使用该模型并预测测试目标。我还想计算所需的统计数据,例如 MSE、r2 等,以了解我的模型的性能。

如果有人帮助我了解 Step5 的一些基本代码行,我将不胜感激。

【问题讨论】:

    标签: machine-learning scikit-learn regression random-forest cross-validation


    【解决方案1】:

    首先,您使用的是 scikit 库的已弃用包 cross-validation。新包名为model_selection。所以我在这个答案中使用它。

    其次,您正在导入RandomForestRegressor,但在代码中定义RandomForestClassifier。我在这里使用RandomForestRegressor,因为您想要的指标(MSE、R2 等)仅针对回归问题定义,而不是分类。

    有多种方法可以做你想做的事。我假设由于您在这里尝试使用 KFold 交叉验证,因此您希望将每个折叠的遗漏数据用作测试折叠。为此,我们可以这样做:

    predictors = my_data[[
    'variable1',
    'variable2',
    'variable3'
    ]]
    
    
    targets = my_data.target_variable
    
    from sklearn import model_selection
    from sklearn.ensemble import RandomForestRegressor
    from sklearn import metrics
    
    model = RandomForestRegressor(n_estimators=100)
    
    cv = model_selection.KFold(n_splits=3)
    
    for train_index, test_index in kf.split(predictors):
        print("TRAIN:", train_index, "TEST:", test_index)
        X_train, X_test = predictors[train_index], predictors[test_index]
        y_train, y_test = targets[train_index], targets[test_index]
    
        # For training, fit() is used
        model.fit(X_train, y_train)
    
        # Default metric is R2 for regression, which can be accessed by score()
        model.score(X_test, y_test)
     
        # For other metrics, we need the predictions of the model
        y_pred = model.predict(X_test)
    
        metrics.mean_squared_error(y_test, y_pred)
        metrics.r2_score(y_test, y_pred)
    

    对于这一切,文档是您最好的朋友。 scikit-learn 文档是我见过的最好的文档之一。以下链接可以帮助您了解更多信息:

    【讨论】:

    • 模型被错误地当作分类器,应该是回归器
    • 为了保持一致,可能值得在这里添加X = my_data,除非我理解不正确
    【解决方案2】:

    同样在for循环中应该是:

    model = RandomForestRegressor(n_estimators=100)
    
    for train_index, test_index in cv.split(X):
    

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 2014-04-16
      • 2020-04-08
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 2019-09-15
      • 2021-06-05
      • 2019-08-19
      相关资源
      最近更新 更多