【问题标题】:Sklearn: Custom scorer on pre-defined splitSklearn:预定义拆分的自定义记分器
【发布时间】:2018-02-28 05:02:08
【问题描述】:

我想通过使用 train_test_split 在预定义的拆分上将其与手动计算(可以这么说)进行比较,确保我的自定义评分函数的行为符合预期。

但是我似乎无法将该拆分传递给cross_val_score。默认情况下,它使用 3 折交叉验证,我无法模仿它使用的拆分。我认为答案在于cv 参数,但我不知道如何以正确的形式传入可迭代对象。

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    如果您有预定义的拆分,您只需训练您的模型并将自定义评分函数应用于测试数据的预测以匹配计算。你不需要使用cross_val_score


    我很确定有更好更简单的方法,但这是我想出的,因为 cross_val_score 文档不是很清楚。

    你说得对,这与你如何使用cv 参数有关,而我使用了这种格式:An iterable yielding train, test splits

    这个想法是创建一个产生训练、测试拆分索引的对象,我提到了:http://fa.bianp.net/blog/2015/holdout-cross-validation-generator/

    假设您已经有一个火车测试拆分。我使用了sklearn 内置拆分并返回了索引:

    from sklearn.model_selection import cross_val_score
    X_train, X_valid, y_train, y_valid, indices_train, indices_test = train_test_split(train_X, train_y, np.arange(X_train.shape[0]), test_size=0.2, random_state=42)
    

    然后,我创建一个类来生成火车,使用来自train_test_split 的输出测试拆分索引:

    class HoldOut:
    
        def __init__(self, indices_train, indices_test):
            self.ind_train = indices_train
            self.ind_test = indices_test
    
        def __iter__(self):
            yield self.ind_train, self.ind_test
    

    然后您可以简单地将Holdout 对象传递给cv 参数:

    cross_val_score(RandomForestClassifier(random_state=42, n_estimators=10), train_X, train_y, 
                    cv=HoldOut(indices_train, indices_test), verbose=1)
    

    【讨论】:

      猜你喜欢
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 2020-08-04
      • 2019-11-16
      • 2019-10-30
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多