Sklearn:ElasticNet超参数调整的正确步骤

2024-04-25 05:35:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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)

先谢谢你


Tags: 数据模型alphatruel1参数trfit
1条回答
网友
1楼 · 发布于 2024-04-25 05:35:44

我是这方面的初学者,但我很乐意分享我的ElasticNet超参数调优方法。我建议改为使用随机搜索CV。以下是我正在编写的当前代码的一部分:

#                       -
# 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=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_ 

其优点是,在随机搜索CV中,迭代次数可以预先确定。测试点的选择是随机的,但比GridSearchCV(测试所有可能的组合)快90%(在某些情况下)

我正在对其他回归器使用相同的方法,如RandomForests和GradientBoosting,它们的参数网格要复杂得多,运行时需要更多的计算机能力

正如我在开始时所说,我对这一领域还不熟悉,因此欢迎提出任何建设性意见

约翰尼

相关问题 更多 >