首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有验证集的超参数调优

带有验证集的超参数调优
EN

Data Science用户
提问于 2019-09-21 12:30:46
回答 1查看 6K关注 0票数 1

据我所知,如果我错了,请纠正我,当我有一个庞大的数据集时,使用交叉验证进行超参数调优是不可取的。因此,在这种情况下,最好将数据拆分到培训、验证和测试集中;然后使用验证集执行超参数调优。

在我正在编程的情况下,我想使用scikit,酵母数据集可以在:http://archive.ics.uci.edu/ml/datasets/yeast上获得;例如,调优历元数。

首先,根据我在这里看到的一个答案,我两次使用train_test_split来分离我的培训、验证和测试集。对于1500次最大迭代,我得到的损失图如下:

然后,我想使用我的验证集,其中包含不同值的列表,用于max迭代的超级参数。我得到的图如下(对于小于1500的max_iter值有一些不收敛的警告消息):

所以,我有第一个问题。对于3000的max_iter值,精度大约是64%,所以我应该为max_iter超参数选择这个值;这是正确的吗?从图中我可以看出,3000的红线也比其他比较选项的损失值要小。

到目前为止,我的计划如下:

代码语言:javascript
复制
import numpy as np
import pandas as pd
from sklearn import model_selection, linear_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.neural_network import MLPClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV

def readFile(file):
    head=["seq_n","mcg","gvh","alm","mit","erl","pox","vac","nuc","site"]
    f=pd.read_csv(file,delimiter=r"\s+")
    f.columns=head
    return f

def NeuralClass(X,y):
    X_train,X_test,y_train,y_test=model_selection.train_test_split(X,y,test_size=0.2)
    print (len(X)," ",len(X_train))
    X_tr,X_val,y_tr,y_val=model_selection.train_test_split(X_train,y_train,test_size=0.2)
    mlp=MLPClassifier(activation="relu",max_iter=1500)
    mlp.fit(X_train,y_train)
    print (mlp.score(X_train,y_train))
    plt.plot(mlp.loss_curve_)

    max_iter_c=[500,1000,2000,3000]
    for item in max_iter_c:
        mlp=MLPClassifier(activation="relu",max_iter=item)
        mlp.fit(X_val,y_val)
        print (mlp.score(X_val,y_val))
        plt.plot(mlp.loss_curve_)
    plt.legend(max_iter_c)

def main():
    f=readFile("yeast.data")
    list=["seq_n","site"]
    X=f.drop(list,1)
    y=f["site"]
    NeuralClass(X,y)

第二个问题,我的方法有效吗?我已经在网络上看到了很多信息,它们都指向跨验证来进行超参数调优,但是我想使用验证集来执行它。

有什么帮助吗?

警察。我尝试过早期停止,结果与我编程的方法相比,效果很差。

谢谢

EN

回答 1

Data Science用户

发布于 2019-09-22 00:40:53

在我看来,你是在手动迭代超参数。

scikit-learn有许多帮助函数,可以使用不同的策略轻松地遍历所有参数:https://scikit-learn.org/stable/modules/grid_Search.html#grid-搜索

其次,如果我是“手动”调优超参数,我会将我的数据分成3部分:训练、测试和验证(名称并不重要)。

我会改变我的超参数,用training data训练模型,用test data测试它。我会重复这个过程,直到我有了“最佳”参数,然后用validation data作为一个正常检查来运行它(应该有类似的分数)。

使用scikit-learn的S助手函数,我将数据分成两部分,使用GridSearchCV对一个部分,最后使用最好的参数(存储在属性best_estimator_中)对第二个部分进行正常检查。

代码语言:javascript
复制
# define parameter sweep
param_grid = { 'max_iter' : [100, 1000, 10000] }

# define grid search
clf = GridSearchCV(mlp, param_grid, cv=5)

# perform search
clf.fit(X, y)

# best estimator
clf._best_estimator

对于信息,每个评估器和它们各自的分数也是可用的属性(参见https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV),这意味着您可以检查每一份简历的结果,如果你想确保你得到了最好的参数。

正如你所看到的,你可以避免过多地思考简历是否是正确的方法,通过使用最终的验证集作为一个健全的检查。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/60547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档