📅  最后修改于: 2020-09-28 05:54:25             🧑  作者: Mango
注意:决策树可以包含分类数据(YES / NO)和数字数据。
机器学习中有多种算法,因此在创建机器学习模型时要记住的重点是为给定的数据集和问题选择最佳算法。以下是使用决策树的两个原因:
决策树算法如何工作?
在决策树中,为了预测给定数据集的类别,算法从树的根节点开始。该算法将根属性的值与记录(真实数据集)属性进行比较,并根据比较结果跟随分支并跳转到下一个节点。
对于下一个节点,该算法再次将属性值与其他子节点进行比较,并进一步移动。它继续该过程,直到到达树的叶节点为止。使用以下算法可以更好地理解整个过程:
示例:假设某候选人有工作机会,并且想要决定是否应接受该工作机会。因此,为解决此问题,决策树从根节点开始(ASM的Salal属性)。根节点根据相应的标签进一步分为下一个决策节点(与办公室的距离)和一个叶节点。下一个决策节点进一步分为一个决策节点(Cab设备)和一个叶子节点。最后,决策节点分为两个叶节点(接受要约和拒绝要约)。考虑下图:
在实施决策树时,主要问题是如何为根节点和子节点选择最佳属性。因此,为了解决这些问题,存在一种称为属性选择度量或ASM的技术。通过这种测量,我们可以轻松地为树的节点选择最佳属性。 ASM有两种流行的技术,它们是:
Information Gain= Entropy(S)- [(Weighted Avg) *Entropy(each feature)
熵:熵是度量给定属性中的杂质的度量。它指定数据的随机性。熵可以计算为:
哪里,
修剪是从树中删除不必要的节点以便获得最佳决策树的过程。
太大的树会增加过度拟合的风险,而小的树可能无法捕获数据集的所有重要特征。因此,在不降低精度的情况下减小学习树的大小的技术被称为修剪。主要使用两种类型的树木修剪技术:
现在,我们将使用Python实现决策树。为此,我们将使用先前分类模型中使用的数据集“ user_data.csv”。通过使用相同的数据集,我们可以将决策树分类器与其他分类模型(例如KNN SVM,LogisticRegression等)进行比较。
步骤也将保持不变,如下所示:
以下是预处理步骤的代码:
# 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)
在上面的代码中,我们已经对数据进行了预处理。加载数据集的位置,其表示为:
现在,我们将模型拟合到训练集。为此,我们将从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)
在上面的代码中,我们创建了一个分类器对象,在其中传递了两个主要参数:
以下是此输出:
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')
现在我们将预测测试集的结果。我们将创建一个新的预测向量y_pred。下面是它的代码:
#Predicting the test set result
y_pred= classifier.predict(x_test)
输出:
在下面的输出图像中,给出了预测输出和实际测试输出。我们可以清楚地看到,预测向量中存在一些与实际向量值不同的值。这些是预测错误。
在上面的输出中,我们看到了一些不正确的预测,因此,如果我们想知道正确和不正确的预测的数量,则需要使用混淆矩阵。下面是它的代码:
#Creating the Confusion matrix
from sklearn.metrics import confusion_matrix
cm= confusion_matrix(y_test, y_pred)
输出:
在上面的输出图像中,我们可以看到混淆矩阵,该矩阵具有6 + 3 = 9个错误的预测和62 + 29 = 91个正确的预测。因此,可以说与其他分类模型相比,决策树分类器做出了很好的预测。
在这里,我们将可视化训练集结果。为了可视化训练集结果,我们将为决策树分类器绘制图形。分类器将为购买或未购买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()
输出:
以上输出与其余分类模型完全不同。它具有垂直线和水平线,它们根据年龄和估计的薪水变量划分数据集。
如我们所见,树正试图捕获每个数据集,这是过度拟合的情况。
测试集结果的可视化将类似于训练集的可视化,只是训练集将替换为测试集。
#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()
输出:
如上图所示,紫色区域中有一些绿色数据点,反之亦然。因此,这些是我们在混淆矩阵中讨论的错误预测。