【发布时间】:2021-07-17 12:36:42
【问题描述】:
我正在执行一个分类任务,它本质上是在进行算法配置,即尝试选择一种配置(或“模式”),这可能会使解决问题的算法在最快的时间内完成。
我正在学习根据问题实例的特征对“最佳”配置进行分类。我看到 scikit-learn 使您能够create your own scoring function 用于调整模型。但是score_func 只将真实标签和预测标签作为输入。
是否可以识别预测来自数据集中的哪一行(传递给此自定义记分器时)?这样我就可以计算出预测(“错误”)配置的性能影响并相应地对模型进行评分。基本上有时“错误”的选择仍然非常好并且接近最佳,但是当分类标签完全基于最佳配置时,天真的分类无法知道这一点。
这是一个人为的例子来说明我正在尝试做的事情
import random as rnd
import pandas as pd
rnd.seed('hello')
probs = [f'instance_{i}' for i in range(6)]
confs = ('analytic', 'bruteforce', 'hybrid')
times = [(p,c,60*rnd.random()) for p in probs for c in confs]
df_alltimes = pd.DataFrame(times, columns=('problem', 'config', 'time'))
print(df_alltimes)
bestrows = df_alltimes.groupby(['problem'])['time'].idxmin()
dataset = df_alltimes.loc[bestrows,['config']].\
rename(columns={'config':'best_config'})
feats = [[rnd.random() for p in range(len(probs))] for f in range(5) ]
for i in range(len(feats)):
dataset[f'feature_{i}'] = feats[i]
print(dataset)
df_alltimes:
problem config time
0 instance_0 analytic 15.307044
1 instance_0 bruteforce 36.742846
2 instance_0 hybrid 35.053416
3 instance_1 analytic 57.781358
4 instance_1 bruteforce 31.723275
5 instance_1 hybrid 8.080238
6 instance_2 analytic 4.211297
7 instance_2 bruteforce 24.034830
8 instance_2 hybrid 39.073023
9 instance_3 analytic 36.325485
10 instance_3 bruteforce 14.717841
11 instance_3 hybrid 57.103908
12 instance_4 analytic 7.358539
13 instance_4 bruteforce 10.805536
14 instance_4 hybrid 2.605044
15 instance_5 analytic 0.489870
16 instance_5 bruteforce 42.888858
17 instance_5 hybrid 58.634073
dataset:
best_config feature_0 feature_1 feature_2 feature_3 feature_4
0 analytic 0.645388 0.641626 0.975619 0.680713 0.209235
5 hybrid 0.993443 0.221038 0.893763 0.408532 0.254791
6 analytic 0.263872 0.142887 0.264538 0.166985 0.800054
10 bruteforce 0.155023 0.601300 0.258767 0.614732 0.850529
14 hybrid 0.766183 0.993692 0.597047 0.401482 0.275133
15 analytic 0.386327 0.065699 0.349115 0.370136 0.357329
我正在使用带有dataset 的sklearn,其中X 将是特征列,y 将是best_config 列。在此示例中,instance_0 的“错误”选择几乎同样糟糕,但对于 instance_1,两个错误选择并非同样糟糕。所以我希望我的自定义记分器能够以某种方式反映这一点。这可能吗?
【问题讨论】:
-
您的问题(以及您在这里所说的“配置”到底是什么意思)完全不清楚。您“希望根据带有预测标签的算法的性能对预测进行评分” - 这就是我们常规对任何评分函数所做的事情。跨度>
-
谢谢@desertnaut,我会尽量用词更好。在你引用的句子中,我不是在谈论分类算法,而是标签是运行另一个问题解决算法的配置/模式。我有所有配置的时间数据,所以当一个配置被选择时,sklearn 分类只知道它是否是我预先标记为“最佳”的分类。但如果我能以某种方式查找时间,我可以说任何预测都“接近于好”。
-
请不要在 cmets 中提供此类澄清 - 而是相应地编辑和更新您的问题。
-
是的,我正在努力——因此“我会尽量用更好的措辞”。我将尝试更全面地充实我的问题并相应地编辑原始问题。谢谢。
标签: machine-learning scikit-learn