为什么我的关联模型在数据集中发现了不应该存在的子群体?

我提供了很多关于我编写代码所使用的方法的信息。如果你只想阅读我的问题,请跳到最后的引用部分。

我正在进行一个项目,目标是检测患者群体中的子群体。我认为这是一个使用关联规则挖掘的绝佳机会,因为我目前正在学习这门课程。

总共有42个变量,其中20个是连续变量,需要进行离散化。对于每个变量,我使用了Freedman-Diaconis规则来确定将一个组划分为多少个类别。

def Freedman_Diaconis(column_values):    #sort the list first    column_values[1].sort()    first_quartile = int(len(column_values[1]) * .25)    third_quartile = int(len(column_values[1]) * .75)    fq_value = column_values[1][first_quartile]    tq_value = column_values[1][third_quartile]    iqr = tq_value - fq_value    n_to_pow = len(column_values[1])**(-1/3)    h = 2 * iqr * n_to_pow    retval = (column_values[1][-1] - column_values[1][1])/h    test = int(retval+1)    return test

然后我使用了最小-最大归一化

def min_max_transform(column_of_data, num_bins):min_max_normalizer = preprocessing.MinMaxScaler(feature_range=(1, num_bins))data_min_max = min_max_normalizer.fit_transform(column_of_data[1])data_min_max_ints = take_int(data_min_max)return data_min_max_ints

来转换我的数据,然后我只取整数部分来获得最终的分类。

def take_int(list_of_float):ints = []for flt in list_of_float:    asint = int(flt)    ints.append(asint)return ints

接着我还编写了一个函数,用来将这个值与变量名结合起来。

def string_transform(prefix, column, index):transformed_list = []transformed = ""if index < 4:    for entry in column[1]:        transformed = prefix+str(entry)        transformed_list.append(transformed)else:    prefix_num = prefix.split('x')    for entry in column[1]:        transformed = str(prefix_num[1])+'x'+str(entry)        transformed_list.append(transformed)return transformed_list

这样做的目的是区分那些具有相同值但出现在不同列的变量。例如,对于变量x14的值为1,与变量x20的值为1的意义不同。字符串转换函数将为前述示例创建14×1和20×1。

之后,我将所有内容以篮式格式写入文件

def create_basket(list_of_lists, headers):#for filename in os.listdir("."):#    if filename.eif not os.path.exists('baskets'):    os.makedirs('baskets')down_length = len(list_of_lists[0])with open('baskets/dataset.basket', 'w') as basketfile:    basket_writer = csv.DictWriter(basketfile, fieldnames=headers)    for i in range(0, down_length):        basket_writer.writerow({"trt": list_of_lists[0][i], "y": list_of_lists[1][i], "x1": list_of_lists[2][i],                                "x2": list_of_lists[3][i], "x3": list_of_lists[4][i], "x4": list_of_lists[5][i],                                "x5": list_of_lists[6][i], "x6": list_of_lists[7][i], "x7": list_of_lists[8][i],                                "x8": list_of_lists[9][i], "x9": list_of_lists[10][i], "x10": list_of_lists[11][i],                                "x11": list_of_lists[12][i], "x12":list_of_lists[13][i], "x13": list_of_lists[14][i],                                "x14": list_of_lists[15][i], "x15": list_of_lists[16][i], "x16": list_of_lists[17][i],                                "x17": list_of_lists[18][i], "x18": list_of_lists[19][i], "x19": list_of_lists[20][i],                                "x20": list_of_lists[21][i], "x21": list_of_lists[22][i], "x22": list_of_lists[23][i],                                "x23": list_of_lists[24][i], "x24": list_of_lists[25][i], "x25": list_of_lists[26][i],                                "x26": list_of_lists[27][i], "x27": list_of_lists[28][i], "x28": list_of_lists[29][i],                                "x29": list_of_lists[30][i], "x30": list_of_lists[31][i], "x31": list_of_lists[32][i],                                "x32": list_of_lists[33][i], "x33": list_of_lists[34][i], "x34": list_of_lists[35][i],                                "x35": list_of_lists[36][i], "x36": list_of_lists[37][i], "x37": list_of_lists[38][i],                                "x38": list_of_lists[39][i], "x39": list_of_lists[40][i], "x40": list_of_lists[41][i]})

然后我使用Orange中的apriori包来查看是否存在任何关联规则。

rules = Orange.associate.AssociationRulesSparseInducer(patient_basket, support=0.3, confidence=0.3)print "%4s %4s  %s" % ("Supp", "Conf", "Rule")for r in rules:    my_rule = str(r)    split_rule = my_rule.split("->")    if 'trt' in split_rule[1]:        print 'treatment rule'        print "%4.1f %4.1f  %s" % (r.support, r.confidence, r)

使用这种技术,我在测试数据中发现了相当多的关联规则。

这就是我遇到问题的地方

当我阅读训练数据的注释时,有这样一条注释

…也就是说,患者对相同治疗的反应差异的唯一原因是随机噪声。因此,这个数据集中没有有意义的子群体…

我的问题是,

为什么我会得到多个关联规则,暗示存在子群体,而根据注释我应该什么也看不到呢?

我得到的提升值高于2,而如果一切都是随机的,像注释中所说的那样,应该是1。

Supp Conf  Rule 0.3  0.7  6x0 -> trt1

尽管我的代码可以运行,但我得到的结果与预期相差甚远。这让我认为我犯了某些错误,但我不知道是什么错误。


回答:

经过一些研究,我意识到我的样本量对于我拥有的变量数量来说太小了。我需要一个更大的样本量才能真正使用我使用的方法。实际上,我尝试使用的方法是假设将在拥有数十万或数百万行的数据库上运行而开发的。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注