如果这个问题是基本的,我很抱歉,但是我已经阅读了文档并且我无法弄清楚处理这个问题的简单规范方法是什么,尽管这可能是因为我对熊猫很新。
我有一个DataFrame df
代表一系列系统step
的时间序列数据(其中时间由score
s测量),由超参数paramA
参数化和paramB
。
数据的合成样本如下:
| paramA | paramB | score | step |
----------------------------------
| A | c | .8 | 10 |
| B | e | .2 | 10 |
| A | f | .1 | 40 |
| C | c | .9 | 10 |
| B | e | .3 | 20 |
| B | c | .3 | 10 |
| A | c | .7 | 20 |
| C | f | .4 | 60 |
| ... | ... | ... | ... |
我想做以下事情:
对于每个模型(即数据集中每个可能的超参数对),找到具有最高分的行。我目前正在这样做:
df.groupby([df.paramA, df.paramB]).score.max()
我现在想要得到我在上一步中获得最大值的顶级k
模型的时间序列。
显然,我可以在上一步中手动查找最高评分模型,使用k
单独查询获取k
数据框,但这感觉缓慢且不优雅。我假设这是一种更聪明的方法。
再次道歉,如果这很简单,但是以任何方式解决这个问题的任何帮助,而不是我目前想到的蛮力方式,都将受到赞赏。
答案 0 :(得分:2)
要回答第一个问题,首先要创建一组唯一的模型,使用每个模型的参数集初始化一个空字典,然后用最高分数的索引填充字典:
pairs = pd.Series(zip(df.paramA, df.paramB)).unique()
models = {(A, B): None for A, B in pairs}
for A, B in pairs:
models[(A, B)] = df.loc[((df.paramA == A) & (df.paramB == B)), 'score'].idxmax()
>>> models
{('A', 'c'): 0,
('A', 'f'): 2,
('B', 'c'): 5,
('B', 'e'): 4,
('C', 'c'): 3,
('C', 'f'): 7}
获取得分最高的k
型号:
k = 5 # Top number of models to return
m = [(v, k_) for k_, v in models.iteritems()]
m.sort(reverse=True)
top_models = [model[1] for model in m[:k]]
>>> top_models
[('C', 'f'), ('B', 'c'), ('B', 'e'), ('C', 'c'), ('A', 'f')]