我正在研究二进制分类问题,并希望执行嵌套交叉验证来评估分类错误。我正在做嵌套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),我希望保持这种分配比率,以便进行培训和评估模型。
答案 0 :(得分:1)
到目前为止,我已经解决了这个问题,这可能对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",这是我最初的问题),而只需要指定的数量分裂。