Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- trainingData=[['slashdot','USA','yes',18,'None'],
- ['google','France','yes',23,'Premium'],
- ['google','France','yes',23,'Basic'],
- ['google','France','yes',23,'Basic'],
- ['digg','USA','yes',24,'Basic'],
- ['kiwitobes','France','yes',23,'Basic'],
- ['google','UK','no',21,'Premium'],
- ['(direct)','New Zealand','no',12,'None'],
- ['(direct)','UK','no',21,'Basic'],
- ['google','USA','no',24,'Premium'],
- ['slashdot','France','yes',19,'None'],
- ['digg','USA','no',18,'None'],
- ['google','UK','no',18,'None'],
- ['kiwitobes','UK','no',19,'None'],
- ['digg','New Zealand','yes',12,'Basic'],
- ['slashdot','UK','no',21,'None'],
- ['google','UK','yes',18,'Basic'],
- ['kiwitobes','France','yes',19,'Basic']]
- class decisionnode:
- def __init__(self, col=-1, value=None, results=None, tb=None, fb=None):
- self.col = col
- self.value = value
- self.results = results
- self.tb = tb
- self.fb = fb
- def sporedi_broj(value1, value2):
- return value1 >= value2
- def sporedi_string(value1, value2):
- return value1 == value2
- # In[43]:
- def get_compare_func(value):
- if isinstance(value, int) or isinstance(value, float):
- comparer = sporedi_broj
- else:
- comparer = sporedi_string
- return comparer
- def compare_values(v1, v2):
- sporedi = get_compare_func(v1)
- return sporedi(v1, v2)
- def divideset(rows, column, value):
- sporedi = get_compare_func(value)
- # print(split_function)
- # Divide the rows into two sets and return them
- set_false = []
- set_true = []
- for row in rows:
- uslov = sporedi(row[column], value)
- # print(column, value, row[column], uslov, row)
- if uslov:
- set_true.append(row)
- else:
- set_false.append(row)
- # print(len(set_true), len(set_false))
- # set_true = [row for row in rows if
- # split_function(row, column, value)] # za sekoj row od rows za koj split_function vrakja true
- # set_false = [row for row in rows if
- # not split_function(row, column, value)] # za sekoj row od rows za koj split_function vrakja false
- return (set_true, set_false)
- def uniquecounts(rows):
- d = {}
- for r in rows:
- # print(r[-1])
- d.setdefault(r[-1], 0)
- d[r[-1]] += 1
- return d
- from math import log
- log2 = lambda x: log(x) / log(2)
- def entropy(rows):
- results = uniquecounts(rows)
- # Now calculate the entropy
- ent = 0.0
- n = len(rows)
- for label, cnt in results.items():
- # print(r)
- p = float(cnt) / n
- # print(label, cnt, p)
- ent -= p * log2(p)
- return ent
- def info_gain(current_score, sets, scoref=entropy):
- m = sum([len(s) for s in sets])
- gain = current_score
- for s in sets:
- n = len(s)
- p = 1. * n / m
- gain -= p * scoref(s)
- return gain
- def buildtree(rows, scoref=entropy):
- if len(rows) == 0: return decisionnode()
- current_score = scoref(rows)
- # Set up some variables to track the best criteria
- best_gain = 0.0
- best_criteria = None
- best_sets = None
- column_count = len(rows[0]) - 1
- for col in range(0, column_count):
- # Generate the list of different values in
- # this column
- column_values = {}
- for row in rows:
- column_values[row[col]] = 1
- # Now try dividing the rows up for each value
- # in this column
- for value in column_values.keys():
- (set1, set2) = divideset(rows, col, value)
- # Information gain
- p = float(len(set1)) / len(rows)
- gain = current_score - p * scoref(set1) - (1 - p) * scoref(set2)
- if gain > best_gain and len(set1) > 0 and len(set2) > 0:
- best_gain = gain
- best_criteria = (col, value)
- best_sets = (set1, set2)
- # Create the subbranches
- if best_gain > 0:
- trueBranch = buildtree(best_sets[0])
- falseBranch = buildtree(best_sets[1])
- return decisionnode(col=best_criteria[0], value=best_criteria[1], tb=trueBranch, fb=falseBranch)
- else:
- return decisionnode(results=uniquecounts(rows))
- def printtree(tree, indent='',level=0):
- # Is this a leaf node?
- if tree.results != None:
- print(tree.results)
- else:
- # Print the criteria
- print(str(tree.col) + ':' + str(tree.value) + '? ' +'Level=%d' % (level))
- # Print the branches
- print(indent + 'T->'),
- printtree(tree.tb,indent +' ',level+1)
- print(indent+'F->'),
- printtree(tree.fb,indent+' ',level+1)
- def classify(observation, tree):
- if tree.results != None:
- # return tree.results
- if len(tree.results) == 1:
- return list(tree.results.keys())[0], 1.0
- else:
- inv = sorted([(cnt, label) for label, cnt in tree.results.items()], reverse=True)
- label = inv[0][1]
- cnt = inv[0][0]
- total_count = sum(tree.results.values())
- return label, cnt / total_count
- # return tree.results
- else:
- vrednost = observation[tree.col]
- if compare_values(vrednost, tree.value):
- branch = tree.tb
- else:
- branch = tree.fb
- return classify(observation, branch)
- if __name__ == "__main__":
- # referrer='slashdot'
- # location='US'
- # readFAQ='no'
- # pagesVisited=19
- # serviceChosen='None'
- referrer=input()
- location=input()
- readFAQ=input()
- pagesVisited=input()
- serviceChosen=input()
- testCase=[referrer, location, readFAQ, pagesVisited, serviceChosen]
- trainingData.append(testCase)
- t=buildtree(trainingData)
- printtree(t)
Advertisement
Add Comment
Please, Sign In to add comment