Scikit learn sklearn中分层HuffleSplit的嵌套交叉验证

Scikit learn sklearn中分层HuffleSplit的嵌套交叉验证,scikit-learn,cross-validation,Scikit Learn,Cross Validation,我正在处理一个二进制分类问题,希望执行嵌套交叉验证来评估分类错误。我之所以使用嵌套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

我正在处理一个二进制分类问题,希望执行嵌套交叉验证来评估分类错误。我之所以使用嵌套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),我面临的问题是:如何传递StratifiedShuffleSplit函数所需的类向量y

天真地:

>> 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\u内部循环


**我的数据集有点不平衡(20/10)我希望保留此分割比率,以便对模型进行培训和评估。

到目前为止,我解决了一些ML新手可能感兴趣的问题。在最新版本的scikit learn 0.18中,交叉验证指标已移至sklearn.model_选择模块,并已发生了(轻微)变化他们的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”,这是我最初的问题),而只需要指定所需拆分的数量。

是的,这在旧版本中是不可能的,这就是我们更改它的原因;)太棒了!谢谢另一个快速问题:如何使用不同的“交叉值”指标?我可以使用产生单个数字的指标(精度、f1等)。我想知道是否可以输出矩阵度量,例如混淆矩阵?在
GroupKFold
中的
groups
参数也有类似的问题(您需要指定内部组)。我一直在手动执行此操作。有点离题,但是@arnold klein,我正在努力理解它是如何实现嵌套CV的——您能给我一些提示来理解此代码吗?@ScottEdwards2000,请查看我的答案以获取完整的代码片段。嵌套CV有两个阶段:外部循环和内部循环。外部循环(在我的例子中是'sss_outer')将整个数据集分割成5个块(顺便说一句,您不一定要使用'StratifiedShuffleSplit'),然后内部循环将每个块分割成3个块,作为训练集和测试集进行迭代(与通常的CV一样)。我的代码中的嵌套CV在一行中实现:'>>cross_val_score(grid_search,X,y,CV=sss_outer)',它对我们的模型进行5次评估(作为sss_outer~5)。超参数C(逆正则化强度)在内部交叉验证上进行调整,它通过“sss\u-inner”定义,并作为“grid\u-search”函数中的参数传递:'>>grid\u-search=GridSearchCV(估计器=管道逻辑,参数网格=参数,冗余=1,评分='f1',cv=sss\u-inner)'',因此,“cross\u-val-score”有效地计算了5次(5个代理模型)在“grid_search”(网格搜索)中调整内部CV循环的模型。此外,我强烈建议阅读Sebastian Raschka关于机器学习的Python@ArnoldKlein在您的第一条评论中—“将整个数据集拆分为5个块(顺便说一句,不一定要使用'StratifiedShuffleSplit'),然后,内部循环将每个区块分成3个区块,作为训练集和测试集进行迭代(通常CV会这样做)“我想你不是指每个区块,而是指将外部循环的剩余4个区块分成内部循环中的3个区块?至少,我认为嵌套CV是这样工作的。