【问题标题】:Training subset in Kfold sklearnKfold sklearn 中的训练子集
【发布时间】:2018-08-14 08:32:38
【问题描述】:

有没有办法使用 sklearn 实现的 kf = KFold(n_splits=10) 的 10 个 Kfolds 中的 8 个中的训练子集来训练模型?

我想将我的数据分成三个子集:训练、验证和测试(我认为这可以通过使用 train_test_split 两次来完成......)。

训练集用于拟合模型,验证集用于调整参数,测试集用于评估最终模型的泛化误差。

但我想知道是否有一种方法可以只用 10 次中的 8 次进行训练并获得错误/准确度,在 1 次中对其进行验证,最后在最后一次进行测试,以获得错误/准确性。

我的想法见下文:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=1)
clf = tree.DecisionTreeClassifier(criterion = "entropy", max_depth = 3)
kf = KFold(n_splits=10, shuffle = False, random_state = 0) #define number of splits
kf.get_n_splits(X) #to check how many splits will be done.
for train, test in kf.split(X_train, y_train):

【问题讨论】:

  • “调整参数”到底是什么意思?您是指分类器的超参数吗?

标签: python scikit-learn


【解决方案1】:

根据您的问题,我的理解是您想省略一个或多个子集。在这种情况下,您可以使用Leave One Out (LOO)Leave P Out (LPO) 保留一个或多个数据子集。

【讨论】:

    【解决方案2】:

    你应该改变这一行

    X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=1)
    

    X_test, X_val, y_test, y_val = train_test_split(X_test, y_test, test_size=0.5, random_state=1)
    

    得到你想要的。第一个train_test_split 拆分为0.8,0.2 用于训练、测试。接下来是在0.1,0.1 测试中拆分0.2,val。

    然后:

    model.fit(X_train, y_train)
    print(sklearn.metrics.classification_report(model.predict(X_val, y_val))) 
    

    根据此报告,您可以检查是否继续使用测试数据或更改超参数以在验证集上获得更高的分数。

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2017-12-12
      • 2016-10-14
      • 2018-05-21
      • 1970-01-01
      • 2019-06-02
      • 2021-06-28
      • 2014-05-06
      • 1970-01-01
      相关资源
      最近更新 更多