【问题标题】:Pandas + Scikit learn : issue with stratified k-foldPandas + Scikit 学习:分层 k 折问题
【发布时间】: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' 值...
  • 你能发布代码来重现这个吗,谢谢
  • 不幸的是我无法将粘贴复制到互联网:(

标签: pandas scikit-learn cross-validation


【解决方案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'))

【讨论】:

    猜你喜欢
    • 2020-09-02
    • 2013-05-03
    • 2017-01-11
    • 2018-03-12
    • 2020-03-24
    • 1970-01-01
    • 2018-10-21
    • 2016-12-20
    • 2016-05-06
    相关资源
    最近更新 更多