【华为云技术分享】【Python算法】分类与预测——决策树
1.决策树定义
决策树方法在分类、预测、规则提取等领域有着广泛的应用。20 世纪 70 年代后期和 80 年代初期,机器学习研究者 J.Ross Quinlan 提出了 ID3 算法以后,决策树就在机器学习与数据挖掘领域取得了巨大的发展。Quinlan 后来又提出了 C4.5,这成为了新的监督学习算法。1984年,几位统计学专家提出了 CART 分类算法。ID3 和 CART 算法几乎同时被提出,但都是采用的类似的方法从训练样本中学习决策树。决策树是一种树状结构,它的每个叶节点对应一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同值将其划分成若干个子集,而对于非纯的叶节点,多数类的标号给出到达这个节点的样本所属的类。构造决策树的核心的问题是在每一步中如何选择适当的属性对样本进行拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树其实是一个自上而下,分而治之的过程。
2.常用决策树算法
常用的决策树算法有三种,分别是 ID3 算法、C4.5 算法、CART 算法三种。
(1) ID3 算法:此算法的核心在于决策树的各级节点上,使用信息增益方法作为属性的选择标准,来帮助确定生成每个节点时所应采取的合适属性;
(2) C4.5 算法:此决策树生成算法相对于 ID3 算法的重要改进是使用信息增益率来选择节点属性,此算法可以克服ID3算法的不足。ID3算法只使用于离散的描述属性,而 C4.5 算法既能够处理离散的描述属性,又能够处理连续的描述属性;
(3) CART 算法:CART 决策树是一种十分有效的非参数分类和回归方法,它通过构建树、修剪树、评估树来构建一个二叉树,当终结点是连续变量时,该树为回归树;当终结点是分类变量时,该树为分类树。
3.决策树基本思想及内容
决策树的基本思想是,迭代式的根据字段的不同值将数据分成不同的组,再评估分组后组内的同性值,如果需要则继续分成不同的组。此方法的优点特别明显,它有较好的可解释性,并且在非线性环境下性能较好。但它也有缺点,如果缺少修剪或者交叉验证很容易过拟合。
4.决策树的使用基本流程
(1) 将所有数据放在同一个组中;
(2) 找出最佳的字段分割(split);
(3) 将数据在这个分割(称为节点)上分成两组(称为叶子);
(4) 继续上两步直到组包含的样本过少或者组内差异已经足够小。
5.决策树计算公式及语法
决策树有几个衡量分组内差异性的常用指标,包括基尼系数(Gini index)、差异(deviance) 或信息增量(information gain)。基尼系数的计算公式如下,在使用此计算公式时,若结果为 0 则表示发分组绝对同质,若为 0.5 则表示该分组绝对异质:
差异或信息增益的计算公式如下,在使用此计算公式时,若结果为 0 则表示该分组绝对同质,若为 1 则表示该分组绝对异质:
决策树的方法即可用于分类也可用于回归,本实验主要介绍的是决策树分类。
5.实验操作
5.1.操作系统
操作机:Linux_Ubuntu
操作机默认用户:root
5.2.实验工具
5.2.1.python
Python是一种计算机程序设计语言。是一种动态的、面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。Python已经成为最受欢迎的程序设计语言之一。自从2004年以后,python的使用率呈线性增长。2011年1月,它被TIOBE编程语言排行榜评为2010年度语言。
由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。
众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下3个十分经典的科学计算扩展库:NumPy、SciPy和matplotlib,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。
5.2.2.Numpy
NumPy系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。
5.2.3.scikit-learn
scikit-learn,Python 中的机器学习,简单高效的数据挖掘和数据分析工具,可供大家使用,可在各种环境中重复使用,建立在 NumPy,SciPy 和 matplotlib 上开放源码,可商业使用 - BSD license。
5.2.4.Matplotlib
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。
5.2.5.pandas
Python Data Analysis Library 或 pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
5.3导入所需要的库:numpy,matplotlib.pyplot,pandas
代码如下:
1 # Importing the libraries 2 import numpy as np 3 import matplotlib.pyplot as plt 4 import pandas as pd
5.4.加载数据集
代码如下:
1 # Importing the dataset 2 dataset = pd.read_csv('数据集路径') 3 X = dataset.iloc[:, [2, 3]].values 4 y = dataset.iloc[:, 4].values
注意:实验中以数据集的实际地址为准。
实验中已经带有相应数据集,点击左下“数据”标识,对数据集的地址进行查看复制。我们直接将地址复制并放入上述代码中进行加载就可以了。
注意:如果在自己的实际生产中,要以自己的数据地址为准。
如下给出数据,可将数据创建响相应的数据集用于字日常训练,也可在实验平台中数据集模块下的的“社交网络测试数据集”中进行查看。
其具体数据内容如下:
见附件!!!
5.5.将数据集分割为训练集和测试集
代码如下:
1 # Splitting the dataset into the Training set and Test set 2 from sklearn.model_selection import train_test_split 3 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
5.6.特征缩放
代码如下:
1 # Feature Scaling 2 from sklearn.preprocessing import StandardScaler 3 sc = StandardScaler() 4 X_train = sc.fit_transform(X_train) 5 X_test = sc.transform(X_test)
5.7.使用决策树对数据进行处理
代码如下:
1 # Fitting the Decision Tree to the Training set 2 from sklearn.tree import DecisionTreeClassifier 3 classifier = DecisionTreeClassifier(criterion = 'entropy', random_state = 0) 4 classifier.fit(X_train, y_train)
5.8.对测试集进行分类:
代码如下:
1 # Predicting the Test set results 2 y_pred = classifier.predict(X_test)
5.9.制造混淆矩阵来评估分类器性能:
代码如下:
1 # Making the Confusion Matrix 2 from sklearn.metrics import confusion_matrix 3 cm = confusion_matrix(y_test, y_pred)
5.10.绘制训练数据分类结果:
1 # Visualising the Training set results 2 from matplotlib.colors import ListedColormap 3 X_set, y_set = X_train, y_train 4 X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), 5 np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) 6 plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), 7 alpha = 0.75, cmap = ListedColormap(('red', 'green'))) 8 plt.xlim(X1.min(), X1.max()) 9 plt.ylim(X2.min(), X2.max()) 10 for i, j in enumerate(np.unique(y_set)): 11 plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], 12 c = ListedColormap(('orange', 'blue'))(i), label = j) 13 plt.title('Classifier (Training set)') 14 plt.xlabel('Age') 15 plt.ylabel('Estimated Salary') 16 plt.legend() 17 plt.show()
训练数据分类结果如下:
5.11.绘制测试数据分类结果:
1 # Visualising the Test set results 2 from matplotlib.colors import ListedColormap 3 X_set, y_set = X_test, y_test 4 X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01), 5 np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01)) 6 plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape), 7 alpha = 0.75, cmap = ListedColormap(('red', 'green'))) 8 plt.xlim(X1.min(), X1.max()) 9 plt.ylim(X2.min(), X2.max()) 10 for i, j in enumerate(np.unique(y_set)): 11 plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1], 12 c = ListedColormap(('orange', 'blue'))(i), label = j) 13 plt.title('Classifier (Test set)') 14 plt.xlabel('Age') 15 plt.ylabel('Estimated Salary') 16 plt.legend() 17 plt.show()
测试数据分类结果如下:
作者:Micker