在 sklearn 中使用 StratifiedShuffleSplit 进行嵌套交叉验证

Nested cross validation with StratifiedShuffleSplit in sklearn

我正在处理二进制 class化问题,想执行嵌套交叉验证来评估 class化错误。我做嵌套CV的原因是样本量小(N_0 = 20,N_1 = 10),其中N_0,N_1是数字分别在 0 和 1 classes 中的实例数。

我的代码很简单:

>> pipe_logistic = Pipeline([('scl', StandardScaler()),('clf', LogisticRegression(penalty='l1'))])
>> parameters = {'clf__C': logspace(-4,1,50)}
>> grid_search = GridSearchCV(estimator=pipe_logistic, param_grid=parameters, verbose=1, scoring='f1', cv=5)
>> cross_val_score(grid_search, X, y, cv=5)

到目前为止,还不错。如果我想更改 CV 方案(在外部和内部 CV 循环中从随机拆分到 StratifiedShuffleSplit,我面临的问题是:如何传递 class 向量 y,因为它是 StratifiedShuffleSplit 函数所要求的?

天真:

>> grid_search = GridSearchCV(estimator=pipe_logistic, param_grid=parameters, verbose=1, scoring='f1', cv=StratifiedShuffleSplit(y_inner_loop, 5, test_size=0.5, random_state=0))
>> cross_val_score(grid_search, X, y, cv=StratifiedShuffleSplit(y, 5, test_size=0.5, random_state=0))

所以,问题是如何指定y_inner_loop ?

** 我的数据集有点不平衡 (20/10),我想保持这个分裂比例来训练和评估模型。

到目前为止,我已经解决了一些 ML 新手可能感兴趣的问题。在最新版本的 scikit-learn 0.18 中,交叉验证指标已移至 sklearn.model_selection 模块并(略微)更改了它们的 API。长话短说:

>> from sklearn.model_selection     import StratifiedShuffleSplit
>> sss_outer = StratifiedShuffleSplit(n_splits=5, test_size=0.4, random_state=15)
>> sss_inner = StratifiedShuffleSplit(n_splits=3, test_size=0.2, random_state=16)
>> pipe_logistic = Pipeline([('scl', StandardScaler()),('clf', LogisticRegression(penalty='l1'))])
>> parameters = {'clf__C': logspace(-4,1,50)}
>> grid_search = GridSearchCV(estimator=pipe_logistic, param_grid=parameters, verbose=1, scoring='f1', cv=sss_inner)
>> cross_val_score(grid_search, X, y, cv=sss_outer)

UPD 在最新版本中,我们不需要明确指定目标向量("y",最初是我的问题),而只需指定数字所需的拆分。