【发布时间】:2021-11-06 01:41:48
【问题描述】:
对于一组受试者,我有一个范围为 0-100 的连续变量,表示受试者状态 cont_attribute 的量化。对于每个主题,我还有一个序数变量,将主题状态的读者注释表示为四种状态之一(例如 1、2、3、4)class_label。 cont_attribute 的值在类之间重叠。我的目标是离散化cont_attribute,以便优化与类的一致性。
在离散化cont_attribute时,可以将任意阈值x1、x2、x3直接应用于连续变量,以产生四个序数类别的bin,并且可以评估与读者注释类的一致性:
cohen_kappa_score((pd.cut(df['cont_attribute'],bins=[0, x1, x2, x3, 100], labels=['1','2','3','4']).astype('int'))
, df['class_label'].astype('int'))
我发现了几个连续变量离散化的选项,例如 Jenks natural break 和 sklearn Kmeans,尽管这些选项没有考虑到类。
我尝试了什么:
我尝试使用 scipy.optimize.minimize 优化上面的函数以产生最大值。这里对于两个类之间的每个阈值,我使用较大类的最小值和较小类的最大值作为找到这些类之间各自最佳截止点的范围。使用这种方法我遇到了一个问题,提示:
ValueError: bins 必须单调增加。
def objfunc(grid):
x1, x2, x3 = grid
return (cohen_kappa_score((pd.cut(df.cont_attribute,bins=[0, x1, x2, x3, 100],labels=['1','2','3','4'], duplicates='drop').astype('int'))
, df['class_label'].astype('int'))) * (-1);
grid = (slice(df[(df['class_label'] == 2)]['cont_attribute'].min(), df[(df['class_label'] == 1)]['cont_attribute'].max(), 0.5), (slice(df[(df['class_label'] == 3)]['cont_attribute'].min(), df[(df['class_label'] == 2)]['cont_attribute'].max(), 0.5), (slice(df[(df['class_label'] == 4)]['cont_attribute'].min(), df[(df['class_label'] == 3)]['cont_attribute'].max(), 0.5))
solution = brute(objfunc, grid, finish=None,full_output = True)
solution
在 python 中,是否有一种直接的方法来优化阈值x1、x2、x3 并考虑与类的一致性(监督离散化)?或者,如何使用 scipy.optimize.minimize 重写上述函数以产生最大值?
【问题讨论】:
-
我相信你是正确的,大多数截止确定代码是在假设你不知道你想要的分类的情况下设计的,而是试图确定它。那么,我认为你是在正确的轨道上。您只需要确定要优化的混淆矩阵的度量。例如,假阳性等同于假阴性。不过,我可以直接回答最后一个问题。 f(x) 的最小值是 -f(x) 的最大值。
-
谢谢,我想我能够按照编辑的方式重写函数,尽管我在对连续变量应用剪切时遇到了问题。
-
我可以将上述方法应用于其他函数,以根据先决条件优化精度或其他相关系数。分箱问题仍然存在。
标签: python scipy binning scipy-optimize-minimize discretization