本文概要
- 为什么要使用决策树?
- 决策树名词术语
- 属性选择措施
- 修剪:获得一个最佳决策树
- 决策树的优点
- 决策树的缺点
- 决策树的Python实现
- 决策树是一种监督学习技术,可用于分类和回归的问题,但主要是最好解决的分类问题。它是一个树形结构的分类器,其中内部节点表示的数据集的特征,分支表示决策规则和各叶节点表示的结果。
- 决策树,有两个节点,这是决策节点和叶节点。决策节点用于做出任何决定,并有多个分支,而叶节点是这些决定的输出,并且不包含任何进一步的分支。
- 该决定或测试的给定数据集的功能的基础上进行的。
- 这是一个让所有的可能的解决方案基于给定条件的问题/决定的图形表示。
- 因为,类似于树,它的根节点,扩展了分叉,构建一个树状结构开始它被称为决策树。
- 为了建立一棵树,我们使用CART算法,它代表分类回归树算法。
- 决策树简单地问一个问题,并根据答案(是/否),进一步树拆分成子树。
- 下图说明了决策树的一般结构:
文章图片
为什么要使用决策树?有在机器学习各种算法,因此选择对给定数据集和问题的最佳算法是主要的一点要记住,而创建一个机器学习模型。下面是两个原因使用决策树:
- 决策树通常模仿人类的思维能力,同时作出决定,所以很容易理解。
- 决策树背后的逻辑可以很容易地理解,因为它显示了一个树形结构。
在决策树,用于预测类的给定数据集,该算法从树的根节点开始。这个算法根属性的值与记录(实际数据集)属性进行比较,并且,基于该比较,如下所述分支和跳转到下一个节点。
对于下一个节点,该算法再次比较与其他子节点的属性值,并进一步移动。它继续这个过程,直到它到达树的叶节点。整个过程可以使用下面的算法来更好地理解:
- 第1步:开始根节点树S,其中包含完整的数据集说。
- 步骤2:使用属性选择度量(ASM)查找数据集中的最好的属性。
- 步骤3:划分在S成包含了最好的属性可能值的子集。
- 步骤4:生成决策树节点,其中包含了最好的属性。
- 第五步:递归使使用的数据集的子集,新的决策树步骤创建-3。直至达到一个阶段,你不能进一步分类的节点,并呼吁最终节点为叶节点继续这个过程。
文章图片
属性选择措施尽管实现决策树,主要问题出现是如何选择最好的属性根节点和子节点。因此,要解决这样的问题有一个被称为属性选择的措施或ASM技术。通过这个测试,我们可以很容易地选择了树的节点最好的属性。有两种流行的技术ASM,它们是:
- 信息增益
- 基尼系数
- 信息增益是基于属性数据集的分割后的变化在熵的测量。
- 它计算多少信息的功能,为我们提供有关的类。
- 据了解增益值,我们分裂的节点,构建决策树。
- 决策树算法总是试图最大化信息增益值,并且具有最高信息增益的节点/属性会先被分割。它可以使用下面的公式来计算:
Information Gain= Entropy(S)- [(Weighted Avg) *Entropy(each feature)
熵:熵是一个度量标准来衡量在一个给定的属性中的杂质。它规定了数据的随机性。熵可以计算为:
Entropy(s)= -P(yes)log2 P(yes)- P(no) log2 P(no)
哪里,
- S =样品的总数目
- 是的P(是)=概率
- P(无)=无概率
- 基尼系数是在创建在CART(分类回归树)算法的决策树使用杂质或纯度的量度。
- 与低基尼系数的属性应当优选相比于高基尼系数为。
- 它不仅创造二元分割,和CART算法使用基尼系数,以创建二元分割。
- 基尼系数可以使用下面的公式来计算:
Gini Index= 1- ∑jPj2
修剪:获得一个最佳决策树【机器学习决策树分类算法】清理是删除从树上不必要的节点,以获得最佳的判断树的过程。
将过大的树增加过度拟合的风险,和一个小的树可能无法捕获所有的数据集的重要特征。因此,降低了学习树的大小而不降低精度的技术被称为修剪。主要有使用两种类型的树木的修剪技术:
- 价格的综合修剪
- 减少错误修剪。
- 这很容易理解,因为它遵循其同时使在现实生活中的任何决定人类遵循相同的过程。
- 它可以解决决策相关的问题是非常有用的。
- 它有助于思考一个问题的所有可能的结果。
- 有相对于??其他算法数据清洗较少要求。
- 决策树包含了许多层,这使得它复杂。
- 它可能有过学习问题,可使用随机森林算法来解决。
- 欲了解更多类标签,决策树的计算复杂度可能增加。
步骤也将保持不变,这给出如下:
- 数据前处理步骤
- 拟合决策树算法训练集
- 预测测试结果
- 结果的测试精度(混淆矩阵的创建)
- 可视化测试集的结果。
下面是用于预处理步骤的代码:
# importing libraries
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd#importing datasets
data_set= pd.read_csv('user_data.csv')#Extracting Independent and dependent Variable
x= data_set.iloc[:,[2,3]].values
y= data_set.iloc[:,4].values# Splitting the dataset into training and test set.
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test= train_test_split(x,y,test_size= 0.25,random_state=0)#feature Scaling
from sklearn.preprocessing import StandardScaler
st_x= StandardScaler()
x_train= st_x.fit_transform(x_train)
x_test= st_x.transform(x_test)
在上面的代码中,我们已经预先处理的数据。当我们已加载的数据集,给出如下:
文章图片
2.装修决策树算法训练集
现在,我们将拟合模型训练集。为此,我们将从sklearn.tree库导入DecisionTreeClassifier类。下面是它的代码:
#Fitting Decision Tree classifier to the training set
From sklearn.tree import DecisionTreeClassifier
classifier= DecisionTreeClassifier(criterion='entropy',random_state=0)
classifier.fit(x_train,y_train)
在上面的代码中,我们已经创建了一个分类器对象,在此我们已经通过两个主要参数;
- “标准=‘熵’:标准是用来测量分裂,其是通过熵给出的信息计算出的增益的质量。
- random_state = 0″ :用于生成随机的状态。
Out[8]:
DecisionTreeClassifier(class_weight=None,criterion='entropy',max_depth=None,max_features=None,max_leaf_nodes=None,min_impurity_decrease=0.0,min_impurity_split=None,min_samples_leaf=1,min_samples_split=2,min_weight_fraction_leaf=0.0,presort=False,random_state=0,splitter='best')
3.预测的测试结果
现在,我们将预测的测试集的结果。我们将创建一个y_pred新的预测向量。下面是它的代码:
#Predicting the test set result
y_pred= classifier.predict(x_test)
输出:
在下面的输出图像,所述预测的输出和实际测试输出中给出。我们可以清楚地看到,有在预测矢量一些值,这是从真正的矢量值不同。这是预测误差。
文章图片
4.结果的测试精度(混淆矩阵的创建)
在上面的输出,我们已经看到有一些不正确的预测,所以如果我们想知道正确和不正确的预测数,我们需要使用混淆矩阵。下面是它的代码:
#Creating the Confusion matrix
from sklearn.metrics import confusion_matrix
cm= confusion_matrix(y_test,y_pred)
输出:
文章图片
另外,在上述输出图像,我们可以看到混淆矩阵,其具有6 + 3 = 9个不正确的预测and62 + 29 = 91正确的预测。因此,我们可以说,相对于其他分类模型,决策树分类取得了良好的预测。
5.可视化训练集的结果:
在这里,我们将可视化训练集的结果。以可视化的训练集中的结果,我们将绘制决策树分类的图表。分类器将是或否预测谁已经购买或不购买的SUV车,因为我们在Logistic回归所做的用户。下面是它的代码:
#Visulaizing the trianing set result
from matplotlib.colors import ListedColormap
x_set,y_set = x_train,y_train
x1,x2 = nm.meshgrid(nm.arange(start = x_set[:,0].min() - 1,stop = x_set[:,0].max() + 1,step=0.01),nm.arange(start = x_set[:,1].min() - 1,stop = x_set[:,1].max() + 1,step = 0.01))
mtp.contourf(x1,x2,classifier.predict(nm.array([x1.ravel(),x2.ravel()]).T).reshape(x1.shape),alpha = 0.75,cmap = ListedColormap(('purple','green' )))
mtp.xlim(x1.min(),x1.max())
mtp.ylim(x2.min(),x2.max())
fori,j in enumerate(nm.unique(y_set)):
mtp.scatter(x_set[y_set == j,0],x_set[y_set == j,1],c = ListedColormap(('purple','green'))(i),label = j)
mtp.title('Decision Tree Algorithm (Training set)')
mtp.xlabel('Age')
mtp.ylabel('Estimated Salary')
mtp.legend()
mtp.show()
输出:
文章图片
以上输出是从其他分类模型完全不同。它具有被根据年龄和估计的薪水可变分割数据集都垂直线和水平线。
正如我们所看到的,树是试图捕捉每个数据集,这是过度拟合情况。
6.可视化测试集结果:
的测试集结果的可视化将类似于训练集的可视化不同的是训练集合将与测试集来替换。
#Visulaizing the test set result
from matplotlib.colors import ListedColormap
x_set,y_set = x_test,y_test
x1,x2 = nm.meshgrid(nm.arange(start = x_set[:,0].min() - 1,stop = x_set[:,0].max() + 1,step=0.01),nm.arange(start = x_set[:,1].min() - 1,stop = x_set[:,1].max() + 1,step = 0.01))
mtp.contourf(x1,x2,classifier.predict(nm.array([x1.ravel(),x2.ravel()]).T).reshape(x1.shape),alpha = 0.75,cmap = ListedColormap(('purple','green' )))
mtp.xlim(x1.min(),x1.max())
mtp.ylim(x2.min(),x2.max())
fori,j in enumerate(nm.unique(y_set)):
mtp.scatter(x_set[y_set == j,0],x_set[y_set == j,1],c = ListedColormap(('purple','green'))(i),label = j)
mtp.title('Decision Tree Algorithm(Test set)')
mtp.xlabel('Age')
mtp.ylabel('Estimated Salary')
mtp.legend()
mtp.show()
输出:
文章图片
正如我们上面的图片中看到,有紫色区域,反之亦然内的一些绿色数据点。所以,这些都是我们在混淆矩阵已经讨论了不正确的预测。
推荐阅读
- 机器学习随机森林算法
- 线性回归VS Logistic回归
- 机器学习的回归VS分类
- 朴素贝叶斯分类器
- 支持向量机(SVM)算法
- k近邻(KNN)算法
- Logistic回归机器学习
- 机器学习的分类算法
- 机器学习多项式回归