Sklearn:预定义分割的自定义得分手

时间:2018-02-27 19:57:23

标签: python machine-learning scikit-learn

我希望通过使用train_test_split将预设分数与手动计算(可以这么说)进行比较,确保我的自定义分数函数符合预期。

然而我似乎无法将这种分裂传递给cross_val_score。默认情况下,它使用3倍交叉验证,我无法模仿它使用的分割。我认为答案在于cv参数,但我无法弄清楚如何以正确的形式传递一个iterable。

1 个答案:

答案 0 :(得分: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)