从头开始构建具有交叉验证的随机森林回归量

时间:2017-06-11 19:04:21

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

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

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

所以,让我们来解决我的问题。我将解释我的所有步骤并向我寻求帮助以解决我被困的问题:

SubDbContext newContext = new SubDbContext(string.Format(userDatabase, "sub_db_" + userId));
newContext.Countries.FirstOrDefault();
newContext.Cities.FirstOrDefault();

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

如果有人帮我解决Step5的一些基本代码,我会很感激。

谢谢&的问候,

Cagdas

2 个答案:

答案 0 :(得分: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 = RandomForestClassifier(n_estimators=100)

cv = model_selection.KFold(n_splits=3)

for train_index, test_index in kf.split(X):
    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文档是我见过的最好的文档之一。以下链接可以帮助您了解更多信息:

答案 1 :(得分:0)

在for循环中也应该是:

model = RandomForestRegressor(n_estimators=100)

for train_index, test_index in cv.split(X):