将一堆数字属性转化为一个总分数

8

这种情况经常出现,令人惊讶的是似乎没有标准解决方案。假设我有一堆数值属性--可以想象使用这个来根据像学生/教师比率或污染等多个组成部分得分来排名大学或城市--并且想把它们转换为单个得分。

我想拿一些例子进行插值以获得一致的评分函数。

也许有标准的多维曲线拟合或数据平滑库之类的东西,使此过程变得简单明了?

更多例子:

  • 将两个血压数字转换为一个得分,表示您的血压接近最佳状态
  • 将身体尺寸测量转换为一个单一的度量,表示您离理想身材有多远
  • 将一组时间(100米短跑等)转换为某种运动的健康得分

5
没有一个通用的评分函数,您需要提供其定义。如果存在这样的函数,每个人都会同意什么是最好的编程语言、流行歌曲、运动员、电影、汽车等等。 - unutbu
好的,我没有表达清楚,我的意思是通过示例来提供它,然后进行插值。我想象一个迭代过程,在这个过程中你为特定的示例决定一些分数,然后查看新示例的分数。如果你不同意任何一个分数,那么你就调整它们并将它们添加到参考集中,并计算一个新的评分函数。反复迭代直到满意为止。 - dreeves
4
我想也许你正在寻找监督式机器学习回归算法 - unutbu
任何一个单一的分数总是/应该偏向于它所用于的目的,因此您首先需要知道将使用哪些有效属性,然后根据分数属性依赖性开始构建评分函数。例如BMI计算以特定方式结合测量值(但当你想要真正的BMI而不是平均值时,公式会因种族或地理位置而异)。我知道的唯一通用解决方案是用许多例子来学习神经/模糊网络,了解什么是好的,什么是坏的... - Spektre
@dreeves,你知道分数应该是什么样子的吗?你知道正确的排名应该与分数一致吗? - Artem Sobolev
是的,我们可以假设我们(即人类)知道排名。实际上,让我们假设我们对分数的一切都了如指掌。因此,对于任何示例,我们都可以准确地说出给定示例的分数应该是多少。让我们还假设,就像@aothman的答案中所述,每个属性都是好的或坏的--即对分数产生积极或消极的影响。 - dreeves
5个回答

6
tl;dr: 请查看HiScore。它将允许您快速编写和维护表现合理的评分功能。
要实例化您的简单示例,假设您有一个应用程序,它接收一组距离和时间作为输入,并希望将它们映射到1-100分。例如,您得到(1.2英里,8:37),您想返回,比如64
典型的方法是选择几个基础函数,然后玩弄这些基础函数的系数,以获得“正确”的分数。例如,您可能具有以每英里分钟为线性基础函数,以及针对距离的其他基础函数(也许在距离和平方根距离方面都是线性的)。您甚至可以使用例如径向基函数,以获取您输入范围内更复杂的表达能力。(这与其他答案中提出的ML算法(如SVM等)非常相似。)
这种方法通常非常快,但是有许多缺点。首先,您必须正确选择基础函数,这对于更抽象和表达式更强的函数可能很困难。其次,您会发现您的分数很快会变得僵化:如果您发现某个输入被错分了,找出如何更改它并确保其余的评分功能“正确”将是一个挑战。第三,添加另一个属性到分数(例如,如果运动员是男性或女性)可能很困难,因为您可能会发现需要向您的基础中添加更多术语。最后,这种方法没有明确保证您的分数将表现聪明 - 取决于您选择的基础函数和系数,在7:03里跑一英里的人可能得到比在7:01里跑1.1英里的人更高的分数
通过HiScore,我编写了一个Python库来解决类似的问题。使用HiScore,您可以标记带有分数的参考集项目,然后它会生成一个智能插值穿过这些分数的评分函数。例如,您可以取您应用程序的最后100个输入,与几个最极端的输入组合(也许在(距离,时间)空间中取提交的输入的凸包),对其进行标记,并使用HiScore生成合理的评分函数。如果它提供了您不同意的分数,只需将其添加到具有正确标签的参考集中并重新创建评分函数,因为HiScore保证插值通过参考集。
HiScore的一个属性是你的属性需要是单调的,或者总是增加或减少。对于“运行时间”设置来说,这不是问题,因为得分应该随着距离的增加而上升(对于固定时间),随着时间的增加而下降(对于固定距离)。HiScore的单调性让你有信心得分会按预期行事;它保证了在7:03内跑完一英里的人得分不会高于在7:01内跑1.1英里的人。
你提出的血压设置很有趣,因为它不是单调的。低血压是不好的,但高血压也是不好的。但你仍然可以在这里使用HiScore:只需将每个测量分成“高血压”和“低血压”组件,其中至少一个为零。例如,160的收缩压读数将被映射到60的属性和0的属性中。得分应该在这两个新属性中都下降,因此这种方法将一个非单调的二维问题(具有属性和)转化为一个单调的四维问题(具有属性)。 (这个技巧类似于帮助将线性规划转化为标准形式的技巧。)

1
你需要教它正确的数值是什么。没有其他方法可以准确地确定正确解决方案。因此,正如您在上面的评论中所说,您需要一个人告诉它正确的值(或正确的方向)。
这正是监督式机器学习。您需要有一组分类值,然后通过给它一部分集合来训练算法,使其适应其值,并使用剩余的集合作为测量其准确性的标准。
其中一个例子是ANN(人工神经网络)和SVM(支持向量机)。

SVM

这里我们有一个例子,展示了SVM将模型拟合到具有2个值(表示为X和Y轴)且具有2个簇的数据上。你可以将红色看作高心脏病风险,将蓝色看作低心脏病风险,而这些值则是某种测量结果。
当然,在现实世界的例子中,您会有更高维度的值和更多的类别。
如果您需要答案以供自己使用,在某些情况下,您可以使用ANN算法中的值。

1
如果您能够为多个数值属性组合提供分数值来教授系统,那么您的问题确实是多元插值。很可能,您的情况是不规则数据点
如果您的样本点分布足够均匀,径向基函数插值是一个不错的起点。
插值将使您能够计算以前未见过的数值属性值的得分。请确保提供足够的训练数据来覆盖整个域,否则您可能会在某些地方得到毫无意义的估计值。实际上,它建立了一个函数S(X; X0,X1,X2,... Xn),其中X是未知的,Xi是已知的样本,具有已知的分数Si;插值是这样的,即S(Xi; X0,X1,X2,... Xn)= Si
你也可以考虑使用近似技术,构建一个函数,使得 S(Xi; X0, X1, X2, ... Xn) ~ Si 达到一定的精度。优点是这些函数更加平滑,实际上可以“修正”输入数据中的错误。
由于高维空间的本质和技术特定性,这些技术很难有标准解决方案,因此没有通用的“黑盒”技术。

1
径向基函数通常是逼近和插值的一个很好、平滑的解决方案。它们非常好的一点是,它们可以自然地扩展到任意维度。问题在于,如果单调性对您的应用程序很重要(通常对于评分来说是如此),它们复杂的函数形式使它们不适合。一种方法是通过检查一堆点的单调性来生成行约束,从而尝试诱导单调性。不幸的是,随着检查点数呈指数级增长,这会受到维数灾难的影响。 - aothman

0
也许你可以在不同的方法中使用概率方法。例如,查看以下8分钟的视频,C. Sagan使用Drake方程估计宇宙中其他先进文明存在的概率,基于几项(不同的)测量/估计。
类似地,您可以生成自己的估计,并根据此得分。

0

如果您的标签信息是序数(即排名数据),那么您应该使用学习排序方法之一。其中一个是SVM Rank

它的工作原理是:将数据集放入svmlight格式的文件中,并通过svm_rank_learn训练分类器。您可能需要调整参数,这可能会给您更好的准确性。然后,将另一个数据集(具有未知排名)馈送到svm_rank_classify中,将为您提供分数,您可以将其用于排名或单独使用。

另一件要提到的事情是,默认情况下SVM Rank使用线性核函数,这意味着评分函数将是属性的加权组合。您可以尝试其他内核(如径向基函数),但SVM Rank的作者警告您:

您原则上可以使用SVMrank中的内核选项'-t',就像在SVMlight中一样,但它非常缓慢,您最好使用SVMlight


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接