Sklearn RandomizedSearchCV,评估每个随机模型

问题描述

我想尝试优化 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...

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

解决方法

您可以通过调用 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 中的最佳参数组合,因此您需要在此循环中重新训练模型。