【问题标题】:Sklearn: Correct procedure for ElasticNet hyperparameter tuningSklearn:ElasticNet 超参数调整的正确程序
【发布时间】:2021-03-28 00:20:14
【问题描述】:

我正在使用 ElasticNet 来拟合我的数据。为了确定超参数(l1,alpha),我使用了 ElasticNetCV。使用获得的超参数,我将模型重新调整到整个数据集以供生产使用。我不确定这在机器学习方面是否正确,如果是的话,我是如何做到的。代码“有效”并且大概做了它应该做的,但我想确定它也是正确的。 我的程序是:

X_tr, X_te, y_tr, y_te = train_test_split(X,y)
optimizer = ElasticNetCV(l1_ratio = [.1,.5,.7,.9,.99,1], n_alphas=400, cv=5, normalize=True)
optimizer.fit(X_tr, y_tr)
best = ElasticNet(alpha=optimizer.alpha_, l1_ratio=optimizer.l1_ratio_, normalize=True)
best.fit(X,y)

提前谢谢你

【问题讨论】:

  • 为什么你认为这不是正确的方法?
  • 那里有太多的“教程”和“解释”,它们都有很大的不同,但我还没有看到它是这样做的。对我来说这是最有意义的,但我想看看其他人是否同意。

标签: python scikit-learn


【解决方案1】:

我是这方面的初学者,但我很乐意分享我的 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 等其他回归器使用相同的方法,它们的参数网格要复杂得多,并且需要更多的计算机能力来运行。

正如我一开始所说,我是这个领域的新手,所以欢迎任何建设性的意见。

强尼

【讨论】:

  • 优秀的第一个答案。
猜你喜欢
  • 2021-09-11
  • 2021-09-19
  • 2017-10-26
  • 2020-07-24
  • 1970-01-01
  • 2021-12-08
  • 2021-10-27
  • 2018-07-24
  • 1970-01-01
相关资源
最近更新 更多