Advertisement
glavinova

[СНЗ] Аблација

Jul 9th, 2020
2,050
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.17 KB | None | 0 0
  1. """ Аблација Problem 6 (2 / 2)
  2. Во науката за анализа на податоци откако ќе биде истрениран модел врз податочно множество базирано на неколку карактеристики, често се прави експеримент кој се нарекува аблација (отстранување). Целта на овој експеримент е да се одреди која од карактеристиките има најмногу влијание врз точноста на моделот, а со тоа и која е најклучна карактеристика - од која најмногу зависи класната припадност на примероците.
  3.  
  4. За оваа задача во променливата dataset ви е дадено податочно множество кое се однесува на цвеќиња наречени Iris. Секој ред од множеството се однесува на едно од трите класи на цвеќиња означени со 0, 1 и 2. За секое цвеќе има четири карактеристики кои се однесуваат на должината и ширината на неговите листови. Ова податочно множество го делите на два дела: тренирачко множество со првите 80% од редиците и тестирачко множество со останатите 20% од податоците.
  5.  
  6. Од стандарден влез се чита индексот на една колона од податочното множество во променливата column_ind. Ваша задача е да направите две дрва на одлука, така што првото дрво на одлука ќе ги користи сите карактеристики од податочното множество, додека второто дрво на одлука ќе го користи множеството каде што е отстранета колоната со индекс column_ind. Пресметајте точност со двете дрва и на стандарден излез испечатете ја точноста на двете дрва. """
  7.  
  8. from math import log
  9. dataset = [
  10.     [6.3, 2.9, 5.6, 1.8, 0],
  11.     [6.5, 3.0, 5.8, 2.2, 0],
  12.     [7.6, 3.0, 6.6, 2.1, 0],
  13.     [4.9, 2.5, 4.5, 1.7, 0],
  14.     [7.3, 2.9, 6.3, 1.8, 0],
  15.     [6.7, 2.5, 5.8, 1.8, 0],
  16.     [7.2, 3.6, 6.1, 2.5, 0],
  17.     [6.5, 3.2, 5.1, 2.0, 0],
  18.     [6.4, 2.7, 5.3, 1.9, 0],
  19.     [6.8, 3.0, 5.5, 2.1, 0],
  20.     [5.7, 2.5, 5.0, 2.0, 0],
  21.     [5.8, 2.8, 5.1, 2.4, 0],
  22.     [6.4, 3.2, 5.3, 2.3, 0],
  23.     [6.5, 3.0, 5.5, 1.8, 0],
  24.     [7.7, 3.8, 6.7, 2.2, 0],
  25.     [7.7, 2.6, 6.9, 2.3, 0],
  26.     [6.0, 2.2, 5.0, 1.5, 0],
  27.     [6.9, 3.2, 5.7, 2.3, 0],
  28.     [5.6, 2.8, 4.9, 2.0, 0],
  29.     [7.7, 2.8, 6.7, 2.0, 0],
  30.     [6.3, 2.7, 4.9, 1.8, 0],
  31.     [6.7, 3.3, 5.7, 2.1, 0],
  32.     [7.2, 3.2, 6.0, 1.8, 0],
  33.     [6.2, 2.8, 4.8, 1.8, 0],
  34.     [6.1, 3.0, 4.9, 1.8, 0],
  35.     [6.4, 2.8, 5.6, 2.1, 0],
  36.     [7.2, 3.0, 5.8, 1.6, 0],
  37.     [7.4, 2.8, 6.1, 1.9, 0],
  38.     [7.9, 3.8, 6.4, 2.0, 0],
  39.     [6.4, 2.8, 5.6, 2.2, 0],
  40.     [6.3, 2.8, 5.1, 1.5, 0],
  41.     [6.1, 2.6, 5.6, 1.4, 0],
  42.     [7.7, 3.0, 6.1, 2.3, 0],
  43.     [6.3, 3.4, 5.6, 2.4, 0],
  44.     [5.1, 3.5, 1.4, 0.2, 1],
  45.     [4.9, 3.0, 1.4, 0.2, 1],
  46.     [4.7, 3.2, 1.3, 0.2, 1],
  47.     [4.6, 3.1, 1.5, 0.2, 1],
  48.     [5.0, 3.6, 1.4, 0.2, 1],
  49.     [5.4, 3.9, 1.7, 0.4, 1],
  50.     [4.6, 3.4, 1.4, 0.3, 1],
  51.     [5.0, 3.4, 1.5, 0.2, 1],
  52.     [4.4, 2.9, 1.4, 0.2, 1],
  53.     [4.9, 3.1, 1.5, 0.1, 1],
  54.     [5.4, 3.7, 1.5, 0.2, 1],
  55.     [4.8, 3.4, 1.6, 0.2, 1],
  56.     [4.8, 3.0, 1.4, 0.1, 1],
  57.     [4.3, 3.0, 1.1, 0.1, 1],
  58.     [5.8, 4.0, 1.2, 0.2, 1],
  59.     [5.7, 4.4, 1.5, 0.4, 1],
  60.     [5.4, 3.9, 1.3, 0.4, 1],
  61.     [5.1, 3.5, 1.4, 0.3, 1],
  62.     [5.7, 3.8, 1.7, 0.3, 1],
  63.     [5.1, 3.8, 1.5, 0.3, 1],
  64.     [5.4, 3.4, 1.7, 0.2, 1],
  65.     [5.1, 3.7, 1.5, 0.4, 1],
  66.     [4.6, 3.6, 1.0, 0.2, 1],
  67.     [5.1, 3.3, 1.7, 0.5, 1],
  68.     [4.8, 3.4, 1.9, 0.2, 1],
  69.     [5.0, 3.0, 1.6, 0.2, 1],
  70.     [5.0, 3.4, 1.6, 0.4, 1],
  71.     [5.2, 3.5, 1.5, 0.2, 1],
  72.     [5.2, 3.4, 1.4, 0.2, 1],
  73.     [5.5, 2.3, 4.0, 1.3, 2],
  74.     [6.5, 2.8, 4.6, 1.5, 2],
  75.     [5.7, 2.8, 4.5, 1.3, 2],
  76.     [6.3, 3.3, 4.7, 1.6, 2],
  77.     [4.9, 2.4, 3.3, 1.0, 2],
  78.     [6.6, 2.9, 4.6, 1.3, 2],
  79.     [5.2, 2.7, 3.9, 1.4, 2],
  80.     [5.0, 2.0, 3.5, 1.0, 2],
  81.     [5.9, 3.0, 4.2, 1.5, 2],
  82.     [6.0, 2.2, 4.0, 1.0, 2],
  83.     [6.1, 2.9, 4.7, 1.4, 2],
  84.     [5.6, 2.9, 3.6, 1.3, 2],
  85.     [6.7, 3.1, 4.4, 1.4, 2],
  86.     [5.6, 3.0, 4.5, 1.5, 2],
  87.     [5.8, 2.7, 4.1, 1.0, 2],
  88.     [6.2, 2.2, 4.5, 1.5, 2],
  89.     [5.6, 2.5, 3.9, 1.1, 2],
  90.     [5.9, 3.2, 4.8, 1.8, 2],
  91.     [6.1, 2.8, 4.0, 1.3, 2],
  92.     [6.3, 2.5, 4.9, 1.5, 2],
  93.     [6.1, 2.8, 4.7, 1.2, 2],
  94.     [6.4, 2.9, 4.3, 1.3, 2],
  95.     [6.6, 3.0, 4.4, 1.4, 2],
  96.     [6.8, 2.8, 4.8, 1.4, 2],
  97.     [6.7, 3.0, 5.0, 1.7, 2],
  98.     [6.0, 2.9, 4.5, 1.5, 2],
  99.     [5.7, 2.6, 3.5, 1.0, 2],
  100.     [5.5, 2.4, 3.8, 1.1, 2],
  101.     [5.4, 3.0, 4.5, 1.5, 2],
  102.     [6.0, 3.4, 4.5, 1.6, 2],
  103.     [6.7, 3.1, 4.7, 1.5, 2],
  104.     [6.3, 2.3, 4.4, 1.3, 2],
  105.     [5.6, 3.0, 4.1, 1.3, 2],
  106.     [5.5, 2.5, 4.0, 1.3, 2],
  107.     [5.5, 2.6, 4.4, 1.2, 2],
  108.     [6.1, 3.0, 4.6, 1.4, 2],
  109.     [5.8, 2.6, 4.0, 1.2, 2],
  110.     [5.0, 2.3, 3.3, 1.0, 2],
  111.     [5.6, 2.7, 4.2, 1.3, 2],
  112.     [5.7, 3.0, 4.2, 1.2, 2],
  113.     [5.7, 2.9, 4.2, 1.3, 2],
  114.     [6.2, 2.9, 4.3, 1.3, 2],
  115.     [5.1, 2.5, 3.0, 1.1, 2],
  116.     [5.7, 2.8, 4.1, 1.3, 2],
  117.     [6.4, 3.1, 5.5, 1.8, 0],
  118.     [6.0, 3.0, 4.8, 1.8, 0],
  119.     [6.9, 3.1, 5.4, 2.1, 0],
  120.     [6.8, 3.2, 5.9, 2.3, 0],
  121.     [6.7, 3.3, 5.7, 2.5, 0],
  122.     [6.7, 3.0, 5.2, 2.3, 0],
  123.     [6.3, 2.5, 5.0, 1.9, 0],
  124.     [6.5, 3.0, 5.2, 2.0, 0],
  125.     [6.2, 3.4, 5.4, 2.3, 0],
  126.     [4.7, 3.2, 1.6, 0.2, 1],
  127.     [4.8, 3.1, 1.6, 0.2, 1],
  128.     [5.4, 3.4, 1.5, 0.4, 1],
  129.     [5.2, 4.1, 1.5, 0.1, 1],
  130.     [5.5, 4.2, 1.4, 0.2, 1],
  131.     [4.9, 3.1, 1.5, 0.2, 1],
  132.     [5.0, 3.2, 1.2, 0.2, 1],
  133.     [5.5, 3.5, 1.3, 0.2, 1],
  134.     [4.9, 3.6, 1.4, 0.1, 1],
  135.     [4.4, 3.0, 1.3, 0.2, 1],
  136.     [5.1, 3.4, 1.5, 0.2, 1],
  137.     [5.0, 3.5, 1.3, 0.3, 1],
  138.     [4.5, 2.3, 1.3, 0.3, 1],
  139.     [4.4, 3.2, 1.3, 0.2, 1],
  140.     [5.0, 3.5, 1.6, 0.6, 1],
  141.     [5.9, 3.0, 5.1, 1.8, 0],
  142.     [5.1, 3.8, 1.9, 0.4, 1],
  143.     [4.8, 3.0, 1.4, 0.3, 1],
  144.     [5.1, 3.8, 1.6, 0.2, 1],
  145.     [5.5, 2.4, 3.7, 1.0, 2],
  146.     [5.8, 2.7, 3.9, 1.2, 2],
  147.     [6.0, 2.7, 5.1, 1.6, 2],
  148.     [6.7, 3.1, 5.6, 2.4, 0],
  149.     [6.9, 3.1, 5.1, 2.3, 0],
  150.     [5.8, 2.7, 5.1, 1.9, 0],
  151. ]
  152.  
  153.  
  154. def unique_counts(rows):
  155.     results = {}
  156.     for row in rows:
  157.         r = row[len(row) - 1]
  158.         if r not in results:
  159.             results[r] = 0
  160.         results[r] += 1
  161.     return results
  162.  
  163.  
  164. def entropy(rows):
  165.     log2 = lambda x: log(x) / log(2)
  166.     results = unique_counts(rows)
  167.     ent = 0.0
  168.     for r in results.keys():
  169.         p = float(results[r]) / len(rows)
  170.         ent = ent - p * log2(p)
  171.     return ent
  172.  
  173.  
  174. class DecisionNode:
  175.     def __init__(self, col=-1, value=None, results=None, tb=None, fb=None):
  176.         self.col = col
  177.         self.value = value
  178.         self.results = results
  179.         self.tb = tb
  180.         self.fb = fb
  181.  
  182.  
  183. def compare_numerical(row, column, value):
  184.     return row[column] >= value
  185.  
  186.  
  187. def compare_nominal(row, column, value):
  188.     return row[column] == value
  189.  
  190.  
  191. def divide_set(rows, column, value):
  192.     if isinstance(value, int) or isinstance(value, float):
  193.         split_function = compare_numerical
  194.     else:
  195.         split_function = compare_nominal
  196.     set1 = [row for row in rows if
  197.             split_function(row, column, value)]
  198.     set2 = [row for row in rows if
  199.             not split_function(row, column, value)]
  200.     return set1, set2
  201.  
  202.  
  203. def build_tree(rows, scoref=entropy):
  204.     if len(rows) == 0:
  205.         return DecisionNode()
  206.     current_score = scoref(rows)
  207.     best_gain = 0.0
  208.     best_criteria = None
  209.     best_sets = None
  210.  
  211.     column_count = len(rows[0]) - 1
  212.     for col in range(0, column_count):
  213.         column_values = {}
  214.         for row in rows:
  215.             column_values[row[col]] = 1
  216.  
  217.         for value in column_values.keys():
  218.             (set1, set2) = divide_set(rows, col, value)
  219.             p = float(len(set1)) / len(rows)
  220.             gain = current_score - p * scoref(set1) - (1 - p) * scoref(set2)
  221.             if gain > best_gain and len(set1) > 0 and len(set2) > 0:
  222.                 best_gain = gain
  223.                 best_criteria = (col, value)
  224.                 best_sets = (set1, set2)
  225.     if best_gain > 0:
  226.         true_branch = build_tree(best_sets[0], scoref)
  227.         false_branch = build_tree(best_sets[1], scoref)
  228.         return DecisionNode(col=best_criteria[0], value=best_criteria[1],
  229.                             tb=true_branch, fb=false_branch)
  230.     else:
  231.         return DecisionNode(results=unique_counts(rows))
  232.  
  233.  
  234. def print_tree(tree, indent=''):
  235.     if tree.results:
  236.         print(str(tree.results))
  237.     else:
  238.         print(str(tree.col) + ':' + str(tree.value) + '? ')
  239.         # Се печатат True гранките, па False гранките
  240.         print(indent + 'T->', end='')
  241.         print_tree(tree.tb, indent + '  ')
  242.         print(indent + 'F->', end='')
  243.         print_tree(tree.fb, indent + '  ')
  244.  
  245.  
  246. def classify(observation, tree):
  247.     if tree.results:
  248.         return tree.results
  249.     else:
  250.         value = observation[tree.col]
  251.         if isinstance(value, int) or isinstance(value, float):
  252.             compare = compare_numerical
  253.         else:
  254.             compare = compare_nominal
  255.  
  256.         if compare(observation, tree.col, tree.value):
  257.             branch = tree.tb
  258.         else:
  259.             branch = tree.fb
  260.  
  261.         return classify(observation, branch)
  262.  
  263.  
  264.  
  265.  
  266. if __name__ == "__main__":
  267.     column_ind = int(input())
  268.  
  269.     # Vashiot kod tuka
  270.  
  271.     trainData1 = dataset[: int(len(dataset)*0.8)]
  272.     trainData2 = list()
  273.  
  274.     test_set1 = dataset[int(len(dataset)*0.8) :]
  275.     test_set2 = list()
  276.  
  277.     for train_sample in trainData1:
  278.         sample = [train_sample[i] for i in range(len(train_sample)) if i != column_ind]
  279.         trainData2.append(sample)
  280.  
  281.     for train_sample in test_set1:
  282.         sample = [train_sample[i] for i in range(len(train_sample)) if i != column_ind]
  283.         test_set2.append(sample)
  284.  
  285.     tree1 = build_tree(trainData1, entropy)
  286.     tree2 = build_tree(trainData2, entropy)
  287.  
  288.     correctSamples1, correctSamples2= 0, 0
  289.  
  290.     for test_sample in test_set1:
  291.         true_class = test_sample[-1]
  292.         result1 = classify(test_sample, tree1)
  293.         res = sorted(list(result1.items()),key=lambda x: x[1], reverse=True)[0][0]
  294.         if res == true_class:
  295.             correctSamples1 += 1
  296.     for test_sample in test_set2:
  297.         true_class= test_sample[-1]
  298.         result2 = classify(test_sample, tree2)
  299.         res = sorted(list(result2.items()),key=lambda x: x[1],reverse=True)[0][0]
  300.         if res == true_class:
  301.             correctSamples2 += 1
  302.  
  303.     accuracy1 = correctSamples1/len(test_set1)
  304.     accuracy2 = correctSamples2 / len(test_set2)
  305.  
  306.     print("Tochnost so prvoto drvo na odluka: " + str(accuracy1))
  307.     print("Tochnost so vtoroto drvo na odluka: " + str(accuracy2))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement