python-3.x - 如何处理从嵌套交叉验证获得的网格搜索的 best_score?

标签 python-3.x optimization machine-learning scikit-learn cross-validation

我使用带有嵌套交叉验证的 GridSearch 优化了 RandomForest。 之后,我知道,使用最佳参数,我必须在对样本外数据进行预测之前训练整个数据集。

我必须拟合模型两次吗?通过嵌套交叉验证然后使用样本外数据来找到准确度估计?

请检查我的代码:

#Load data
for name in ["AWA"]:
for el in ['Fp1']:
    X=sio.loadmat('/home/TrainVal/{}_{}.mat'.format(name, el))['x']
    s_y=sio.loadmat('/home/TrainVal/{}_{}.mat'.format(name, el))['y']
    y=np.ravel(s_y)

    print(name, el, x.shape, y.shape) 
    print("")


#Pipeline
clf = Pipeline([('rcl', RobustScaler()),
                ('clf', RandomForestClassifier())])   

#Optimization
#Outer loop
sss_outer = StratifiedShuffleSplit(n_splits=2, test_size=0.1, random_state=1)
#Inner loop
sss_inner = StratifiedShuffleSplit(n_splits=2, test_size=0.1, random_state=1)


# Use a full grid over all parameters
param_grid = {'clf__n_estimators': [10, 12, 15],
              'clf__max_features': [3, 5, 10],
             }


# Run grid search
grid_search = GridSearchCV(clf, param_grid=param_grid, cv=sss_inner, n_jobs=-1)
#FIRST FIT!!!!!
grid_search.fit(X, y)
scores=cross_val_score(grid_search, X, y, cv=sss_outer)

#Show best parameter in inner loop
print(grid_search.best_params_)

#Show Accuracy average of all the outer loops 
print(scores.mean())

#SECOND FIT!!!
y_score = grid_search.fit(X, y).score(out-of-sample, y)
print(y_score)

最佳答案

您需要了解一些事情。

当您进行“第一次拟合”时,将根据 sss_inner cv 拟合 gird_search 模型,并将结果存储在 grid_search.best_estimator_ 中(即最好的根据 sss_inner 折叠中测试数据的分数进行估计)。

现在您正在 cross_val_score(嵌套)中使用 grid_search。 “首次拟合”中的拟合模型在这里没有用处。 cross_val_score克隆估计器,对来自 sss_outer 的折叠调用 grid_search.fit() (这意味着来自 sss_outer 的训练数据将呈现给grid_search,后者将再次根据sss_inner进行分割)并呈现在sss_outer测试数据上的分数。 cross_val_score 中的模型未拟合。

现在,在“第二次适合”中,您将再次像“第一次适合”中那样适合。不需要这样做,因为它已经安装好了。只需调用grid_search.score()。它将在内部从 best_estimator_ 调用 score()

您可以查看my answer here了解有关使用网格搜索进行嵌套交叉验证的更多信息。

关于python-3.x - 如何处理从嵌套交叉验证获得的网格搜索的 best_score?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42742102/

相关文章:

python - 币安 future 测试网上的空头订单导致 APIError(ReduceOnly 订单被拒绝)

python - python 中的碰撞形状

c - 快速逐字节替换 if

python - 当 max_depth 给定 1 时,sklearn DecsionTreeClassifier 如何选择输出值?

python - 将分类数据从 CSV 加载到 Scikit-Learn 以进行机器学习

python - 如何返回类中列表的迭代

python - 如何将字典列表转换为字符串

optimization - 神经网络的高变异性损失

python - 如何在 Python 中模仿 dict 的节省空间的版本?

python - Deep-Learning Nan loss 原因