我是这方面的初学者,但我很乐意分享我的 ElasticNet 超参数调优方法。我建议改用 RandomizedSearchCV。这是我现在正在编写的当前代码的一部分:
#-----------------------------------------------
# input:
# X_train, X_test, Y_train, Y_test: datasets
# Returns:
# R² and RMSE Scores
#-----------------------------------------------
# Standardize data before
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# define grid
params = dict()
# values for alpha: 100 values between e^-5 and e^5
params['alpha'] = np.logspace(-5, 5, 100, endpoint=True)
# values for l1_ratio: 100 values between 0 and 1
params['l1_ratio'] = np.arange(0, 1, 0.01)
警告:您正在测试 100 x 100 = 10 000 种可能的组合。
# Create an instance of the Elastic Net Regressor
regressor = ElasticNet()
# Call the RanddomizedSearch with Cross Validation using the chosen regressor
rs_cv= RandomizedSearchCV(regressor, params, n_iter = 100, scoring=None, cv=5, verbose=0, refit=True)
rs_cv.fit(X_train, Y_train.values.ravel())
# Results
Y_pred = rs_cv.predict(X_test)
R2_score = rs_cv.score(X_test, Y_test)
RMSE_score = np.sqrt(mean_squared_error(Y_test, Y_pred))
return R2_score, RMSE_score, rs_cv.best_params_
优点是在 RandomizedSearchCV 中可以提前预定迭代次数。要测试的点的选择是随机的,但比 GridSearchCV(测试所有可能的组合)快 90%(在某些情况下)。
我对 RandomForests 和 GradientBoosting 等其他回归器使用相同的方法,它们的参数网格要复杂得多,并且需要更多的计算机能力来运行。
正如我一开始所说,我是这个领域的新手,所以欢迎任何建设性的意见。
强尼