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 折交叉验证来获得每折的精确召回?
在 MLPClassification Python 中实现 K 折交叉验证
如果我们在管道中包含转换器,来自 scikit-learn 的“cross_val_score”和“GridsearchCV”的 k 折交叉验证分数是不是存在偏差?