[英]Why does my association model find subgroups in a dataset when there shouldn't any?
我提供了許多有關編寫代碼的方法的信息。 如果您只想閱讀我的問題,請跳至最后的引號。
我正在做一個項目,目標是檢測一組患者中的亞人群。 我認為這聽起來像是使用關聯規則挖掘的絕佳機會,因為我目前正在就該主題進行課程。
我總共有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
轉換我的數據,然后我簡單地使用了interger部分來進行最終分類。
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。 字符串轉換函數將為前面提到的示例創建14x1和20x1。
在此之后,我將所有內容以籃子格式寫入文件
def create_basket(list_of_lists, headers):
#for filename in os.listdir("."):
# if filename.e
if 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
即使我的代碼運行,我也無法獲得接近預期的結果。 這使我相信自己搞砸了,但不確定是什么。
經過研究,我意識到我的樣本量對於我擁有的變量數量來說太小了。 為了真正使用我所使用的方法,我需要一個更大的樣本量。 實際上,我嘗試使用的方法是在假設該方法可以在具有數十萬或數百萬行的數據庫上運行的前提下開發的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.