【问题标题】:Sklearn RandomizedSearchCV, evaluate each random modelSklearn RandomizedSearchCV,评估每个随机模型
【发布时间】:2021-05-04 04:30:05
【问题描述】:

我想尝试优化 RandomForest 回归模型的参数,以便在准确度和预测速度之间找到最佳平衡点。 我的想法是使用随机网格搜索,并评估每个测试随机参数配置的速度/准确性。

所以,我准备了一个参数网格,我可以在训练数据上运行 k-fold cv

    ## parameter grid for random search
    n_estimators = [1, 40, 80, 100, 120]
    max_features = ['auto', 'sqrt']
    max_depth = [int(x) for x in np.linspace(10, 110, num = 11)]
    max_depth.append(None)
    min_samples_split = [2, 5, 10]
    min_samples_leaf = [1, 2, 4]
    bootstrap = [True, False]
    random_grid = {'n_estimators': n_estimators,
               'max_features': max_features,
               'max_depth': max_depth,
               'min_samples_split': min_samples_split,
               'min_samples_leaf': min_samples_leaf,
               'bootstrap': bootstrap}

    rf = RandomForestRegressor()
    rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=2, n_jobs = -1)
    rf_random.fit(X_train, y_train)


我找到了获取最佳模型参数的方法,方法是:

rf_random.best_params_

但是,我想遍历所有随机模型,检查它们的参数值,在测试集上评估它们并将参数值、准确性和速度写入并输出数据帧,例如:

for model in rf_random:
   start_time_base = time.time()
   y_pred = model.predict(X_test) -> evaluate the current random model on the test data
   time = (time.time()-start_time_base)/X_test.shape[0]
   rmse = mean_squared_error(y_test, y_pred, squared=False)
   params = something to get the values of the parameters for this model
   
   write to dataframe...

有没有办法做到这一点?为了清楚起见,我问的是模型和参数的迭代,而不是写入数据框部分:) 我应该采用完全不同的方法吗?

【问题讨论】:

    标签: python scikit-learn grid-search gridsearchcv


    【解决方案1】:

    您可以通过调用rf_random.cv_results_ 获得想要使用模型参数和CV 结果创建的df,您可以立即将其放入df:all_results = pd.DataFrame(rf_random.cv_results_)

    每次我看到它在实践中使用时,它都被视为您正在寻找的所有指标的一个很好的衡量标准;您在问题中描述的内容是不必要的。但是,如果您想完成上面描述的内容(即针对保留的测试集进行评估而不是交叉验证),则可以通过此 df 并在循环中定义每个参数组合的模型:

    for i in range(len(all_results)):
    
        model = RandomForestRegressor(n_estimators = all_results['n_estimators'][i],
                                      max_features = all_results['max_features'][i],
                                      ...)
        
        model.fit(X_train, y_train)
    
        start_time_base = time.time()
        y_pred = model.predict(X_test) -> evaluate the current random model on the test data
        time = (time.time()-start_time_base)/X_test.shape[0]
    
        # Evaluate predictions however you see fit
    

    由于在 RandomizedSearchCV 中只为最佳参数组合保留训练模型,因此您需要在此循环中重新训练模型。

    【讨论】:

    • 这听起来不错,但我特别需要评估每个模型的推理速度,这就是为什么我打算在之后的测试集上做这件事。我是否在 rf_random.cv_results_ 中获得任何有关它的信息?
    • 您也可以在我提供的循环中执行此操作,只需在再次训练模型后启动计时器即可。我已经相应地编辑了代码。
    • 是的,我想知道我是否可以在这一点上避免循环,考虑到 - 正如你所指出的 - 我需要再次重新训练每个模型。谢谢!
    • 对。 cv_results_ 确实包括每个模型的拟合平均数和标准差以及得分时间。但是,如果您想使用保持测试集,则需要重新训练,因为模型对象并未全部保存。
    • 作为后续行动,我确实使用了 cv_results 的结果来选择一堆更“有前途”的模型,就速度/准确性的权衡而言,我重新训练并只评估测试集上的那些。再次感谢您的大力帮助!
    猜你喜欢
    • 2021-06-11
    • 2019-08-02
    • 2015-08-02
    • 2021-05-22
    • 2017-03-24
    • 2016-02-20
    • 2020-03-06
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多