0

我給出了很多關於我用來編寫代碼的方法的信息。如果您只想閱讀我的問題,請跳至最後的引號。爲什麼我的關聯模型在數據集中找不到子組?

我正在研究一個項目,其目標是檢測一組患者中的亞羣。我認爲這聽起來像是使用關聯規則挖掘的絕好機會,因爲我目前正在就這個問題開展一門課。

我總共有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不同。字符串轉換函數將爲前面提到的示例創建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,看看是否有任何關聯規則。

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,如果所有東西都像筆記狀態一樣是隨機的,那麼應該是1。

Supp Conf Rule 
0.3 0.7 6x0 -> trt1 

即使我的代碼運行,我沒有得到任何接近應該預期的結果。這讓我相信我搞砸了一些東西,但我不確定它是什麼。

回答

0

經過一番研究,我意識到我的樣本量對於我所擁有的變量數量來說太小了。爲了真正使用我使用的方法,我需要更大的樣本量。實際上,我嘗試使用的方法是假設它將在數十萬或數百萬行的數據庫上運行。

相關問題