Sklearn RandomizedSearchCV,评估每个随机模型
Sklearn RandomizedSearchCV, evaluate each random model
我想尝试优化 RandomForest 回归模型的参数,以便在准确性和预测速度之间找到最佳平衡点。
我的想法是使用随机网格搜索,并评估每个测试的随机参数配置的 speed/accuracy。
所以,我准备了一个参数网格,我可以在训练数据上运行 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 中仅保留最佳参数组合的训练模型,因此您需要在此循环中重新训练模型。
我想尝试优化 RandomForest 回归模型的参数,以便在准确性和预测速度之间找到最佳平衡点。 我的想法是使用随机网格搜索,并评估每个测试的随机参数配置的 speed/accuracy。
所以,我准备了一个参数网格,我可以在训练数据上运行 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 中仅保留最佳参数组合的训练模型,因此您需要在此循环中重新训练模型。