Pandas + Scikit 学习:分层 k 折问题

Posted

技术标签:

【中文标题】Pandas + Scikit 学习:分层 k 折问题【英文标题】:Pandas + Scikit learn : issue with stratified k-fold 【发布时间】:2015-09-23 06:59:55 【问题描述】:

当与 Dataframe 一起使用时,来自 scikit-learn 的 StratifiedKFold 返回一个从 0 到 n 的索引列表,而不是来自 DF 索引的值列表。有办法改变吗?

例如:

df = pd.DataFrame()
df["test"] = (0, 1, 2, 3, 4, 5, 6)
df.index   = ('a', 'b', 'c', 'd', 'e', 'f', 'g')
for i, (train, test) in enumerate(StratifiedKFold(df.index)):
    print i, (train, test)

给予:

0 (array([], dtype=64), array([0,1,2,3,4,5,6])
1 (array([0,1,2,3,4,5,6]), array([], dtype=64))
2 (array([0,1,2,3,4,5,6]), array([], dtype=64))

我希望返回 df 的索引,而不是 df 的长度范围...

【问题讨论】:

为什么这是一个问题,请注意,您的索引被分配 str 值的事实在这里无关紧要。你应该使用整数数组来索引你的df,你可以在这里使用iloc 嗯,我有一个原始 df,其索引范围从 0 到 274,然后我将其二次采样到 0 到 30=> 所以我有 30 个介于 0 和 274 之间的数字。然后我做 tratifiedkfold在这个子矩阵上,得到从 0 到 30 的数字,而我的索引范围从 0 到 274....这意味着我从 kfolds 中得到了一些 'nan' 值... 你能发布代码来重现这个吗,谢谢 不幸的是我无法将粘贴复制到互联网:( 【参考方案1】:

你得到的数字只是StratifiedKFold选择的df.index的索引。

要将其更改回 DataFrame 的索引,只需

for i, (train, test) in enumerate(StratifiedKFold(df.index)):
    print i, (df.index[train], df.index[test])

给了

0 (Index([], dtype='object'), Index([u'a', u'b', u'c', u'd', u'e', u'f', u'g'], dtype='object'))
1 (Index([u'a', u'b', u'c', u'd', u'e', u'f', u'g'], dtype='object'), Index([], dtype='object'))
2 (Index([u'a', u'b', u'c', u'd', u'e', u'f', u'g'], dtype='object'), Index([], dtype='object'))

【讨论】:

以上是关于Pandas + Scikit 学习:分层 k 折问题的主要内容,如果未能解决你的问题,请参考以下文章

Scikit-Learn 中的分层标记 K 折交叉验证

一种热编码标签和分层 K 折交叉验证

如何在 scikit-learn 中使用 k 折交叉验证来获得每折的精确召回?

如何计算分层 K 折交叉验证的不平衡数据集的误报率?

在 MLPClassification Python 中实现 K 折交叉验证

如果我们在管道中包含转换器,来自 scikit-learn 的“cross_val_score”和“GridsearchCV”的 k 折交叉验证分数是不是存在偏差?