我很抱歉,如果这个问题是基本的,但是我已经完成了文档,我很难弄清楚如何处理这个问题的简单规范方法是什么,尽管这可能是因为我是熊猫的新手。
i具有一系列系统的score
s的时间序列数据(通过step
s测量时间)的数据框df
,由HyperParameters 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 |
| ... | ... | ... | ... |
我想做以下操作:
1。查找最高评分模型
对于每个模型(即,对于数据集中的每对超参数对),请找到具有最高分数的行。我目前正在这样做:
df.groupby([df.paramA, df.paramB]).score.max()
2。提取最高得分子的时间序列
我现在想获得我在上一步中获得的最大值k
型号的时间序列。
显然,我可以在上一步中手动查找最高的评分模型,使用k
单独的查询获取CC_7数据范围,但这感觉很慢且不高。我假设有一种更聪明的方法。
再次表示,如果这很简单,但是以聪明的方式解决这个问题,而不是我目前想到的蛮力。
要回答问题一个,首先创建一组唯一的模型,使用每个模型的参数集初始化一个空词典,然后用最大分数的索引填充词典:
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')]