From b587a8eed2eb28f13d1392564cc3d2e0d675d82d Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Mon, 13 Mar 2017 20:47:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=86=B3=E7=AD=96=E6=A0=91?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AE=B9=EF=BC=8C=E5=81=9Appt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/python/03.DecisionTree/DTSklearn.py | 4 +- src/python/03.DecisionTree/DecisionTree.py | 6 ++- .../03.DecisionTree/DecisionTreePlot.py | 2 +- src/python/09.RegTrees/RTSklearn.py | 50 ++++++++++++++++++ src/python/09.RegTrees/treeExplore.py | 6 +-- testResult/tree.pdf | Bin 16586 -> 16177 bytes 6 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 src/python/09.RegTrees/RTSklearn.py diff --git a/src/python/03.DecisionTree/DTSklearn.py b/src/python/03.DecisionTree/DTSklearn.py index a4890961..1f451c61 100644 --- a/src/python/03.DecisionTree/DTSklearn.py +++ b/src/python/03.DecisionTree/DTSklearn.py @@ -51,7 +51,7 @@ def predict_train(x_train, y_train): return y_pre, clf -def show_precision_recall(x, clf, y_train, y_pre): +def show_precision_recall(x, y, clf, y_train, y_pre): ''' 准确率与召回率 参考链接: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_curve.html#sklearn.metrics.precision_recall_curve @@ -110,7 +110,7 @@ if __name__ == '__main__': y_pre, clf = predict_train(x_train, y_train) # 展现 准确率与召回率 - show_precision_recall(x, clf, y_train, y_pre) + show_precision_recall(x, y, clf, y_train, y_pre) # 可视化输出 show_pdf(clf) diff --git a/src/python/03.DecisionTree/DecisionTree.py b/src/python/03.DecisionTree/DecisionTree.py index 03a4d25f..e5f3d41b 100644 --- a/src/python/03.DecisionTree/DecisionTree.py +++ b/src/python/03.DecisionTree/DecisionTree.py @@ -7,9 +7,9 @@ Update on 2017-02-27 Decision Tree Source Code for Machine Learning in Action Ch. 3 @author: Peter Harrington/jiangzhonglian ''' -from math import log import operator -import DecisionTreePlot as dtPlot +from math import log +import decisionTreePlot as dtPlot def createDataSet(): @@ -130,7 +130,9 @@ def chooseBestFeatureToSplit(dataSet): prob = len(subDataSet)/float(len(dataSet)) newEntropy += prob * calcShannonEnt(subDataSet) # gain[信息增益] 值越大,意味着该分类提供的信息量越大,该特征对分类的不确定程度越小 + # 也就说: 列进行group分组后,对应的类别越多,信息量越大,那么香农熵越小,那么信息增益就越大,所以gain越大 infoGain = baseEntropy - newEntropy + # print 'infoGain=', infoGain, 'bestFeature=', i if (infoGain > bestInfoGain): bestInfoGain = infoGain bestFeature = i diff --git a/src/python/03.DecisionTree/DecisionTreePlot.py b/src/python/03.DecisionTree/DecisionTreePlot.py index 737e4d31..3c5c4d31 100644 --- a/src/python/03.DecisionTree/DecisionTreePlot.py +++ b/src/python/03.DecisionTree/DecisionTreePlot.py @@ -128,5 +128,5 @@ def retrieveTree(i): return listOfTrees[i] -myTree = retrieveTree(0) +myTree = retrieveTree(1) createPlot(myTree) diff --git a/src/python/09.RegTrees/RTSklearn.py b/src/python/09.RegTrees/RTSklearn.py new file mode 100644 index 00000000..72036a23 --- /dev/null +++ b/src/python/09.RegTrees/RTSklearn.py @@ -0,0 +1,50 @@ +#!/usr/bin/python +# coding:utf8 + +''' +Created on 2017-03-10 +Update on 2017-03-10 +author: jiangzhonglian +content: 回归树 +''' + +print(__doc__) + + +# Import the necessary modules and libraries +import numpy as np +from sklearn.tree import DecisionTreeRegressor +import matplotlib.pyplot as plt + + +# Create a random dataset +rng = np.random.RandomState(1) +X = np.sort(5 * rng.rand(80, 1), axis=0) +y = np.sin(X).ravel() +print X, '\n\n\n-----------\n\n\n', y +y[::5] += 3 * (0.5 - rng.rand(16)) + + +# Fit regression model +regr_1 = DecisionTreeRegressor(max_depth=2, min_samples_leaf=5) +regr_2 = DecisionTreeRegressor(max_depth=5, min_samples_leaf=5) +regr_1.fit(X, y) +regr_2.fit(X, y) + + +# Predict +X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis] +y_1 = regr_1.predict(X_test) +y_2 = regr_2.predict(X_test) + + +# Plot the results +plt.figure() +plt.scatter(X, y, c="darkorange", label="data") +plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2) +plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2) +plt.xlabel("data") +plt.ylabel("target") +plt.title("Decision Tree Regression") +plt.legend() +plt.show() diff --git a/src/python/09.RegTrees/treeExplore.py b/src/python/09.RegTrees/treeExplore.py index 26fd9a8b..aa394f5d 100644 --- a/src/python/09.RegTrees/treeExplore.py +++ b/src/python/09.RegTrees/treeExplore.py @@ -7,14 +7,14 @@ Update on 2017-03-08 Tree-Based Regression Methods Source Code for Machine Learning in Action Ch. 9 @author: jiangzhonglian ''' +import regTrees from Tkinter import * from numpy import * -import regTrees import matplotlib -matplotlib.use('TkAgg') -from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +matplotlib.use('TkAgg') def test_widget_text(root): diff --git a/testResult/tree.pdf b/testResult/tree.pdf index f2b728290b9ceb5f02f52eeaf196369a36f37412..6cb99e2008fc4289da8af9281d394f5995f58e52 100644 GIT binary patch delta 12068 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 )2H1JK>;_EjMC_jZ$Zo0cd6$O& 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