Sklearn:ElasticNet超参数调整的正确程序



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

提前感谢

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

正如我在开始时所说,我是这个领域的新手,因此任何建设性的评论都将受到欢迎。

Johnny

最新更新