我正在使用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)提前谢谢你
发布于 2021-01-23 16:53:13
我是这方面的初学者,但我很乐意与您分享我的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)警告:您正在测试100x100=10000种可能的组合。
# 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等其他回归程序使用同样的方法,他们的参数网格要复杂得多,需要更多的计算机能力才能运行。
正如我在开始时所说的那样,我是这个领域的新手,所以欢迎任何有建设性的意见。
约翰尼
https://stackoverflow.com/questions/65338511
复制相似问题