我正在研究一个二元分类问题,并希望执行嵌套交叉验证来评估分类错误。我做嵌套CV的原因是样本量小(N_0 = 20, N_1 = 10),其中N_0, N_1分别是0和1类的实例数。
我的代码很简单:
>> 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),我面临的问题是:我如何通过类向量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",这是我最初的问题),而只需要指定所需拆分的数量。