def gbm(X, Y, M=50, gradient=gradient_quad): N = len(Y) Model = [np.mean(Y)] for m in range(M): print '%d:%f' % (m, RSS(Model, X, Y)) residual = np.zeros(N) for i in range(N): residual[i] = gradient(Model, X[i], Y[i]) #print residual new_tree = RegressionTree.buildtree(X, residual, max_depth=1) print 'New tree builded.' #fit(Model, new_tree) print 'Tree fited.' Model.append(new_tree) print '%d:%f' % (m, RSS(Model, X, Y)) return Model
def predict(Model, x, v=0.05): f = Model[0] for model in Model[1:]: res = RegressionTree.predict(x, model) f += res*v return f
right = x+(w1+w2)/2 draw.text((x-20,y-10), str(tree.col)+':'+str(tree.value), (0, 0, 0)) draw.line((x, y, left+w1/2, y+100), fill=(255, 0, 0)) draw.line((x, y, right-w2/2, y+100), fill=(255, 0, 0)) drawnode(draw, tree.left_child, left+w1/2, y+100) drawnode(draw, tree.right_child, right-w2/2, y+100) else: txt = '%d' % tree.result draw.text((x-20, y), txt, (0, 0, 0)) if __name__ == '__main__': inputs, output, Ttype = prostate.loaddata() train_data, train_out, test_data, test_out = RegressionTree.cookdata(inputs, output, Ttype) P = len(train_data[0]) print 'Training...' Model = gbm(train_data, train_out) print 'Trained!' total = 0. for i in range(len(test_data)): res = predict(Model, test_data[i]) print res, test_out[i] total += (res-test_out[i])**2 print total/len(test_out) print '**************************' im = relative_importance(Model, P) for key in im.keys(): print key, im[key]