什么是决策树?
决策树是类似流程图的结构,其中每个内部节点表示对属性的“测试”(例如,硬币翻转是否出现在头部或尾部),每个分支代表测试的结果,并且每个叶节点表示class label(在计算所有属性后做出的决定)。
简而言之,决策树检查属性或属性集是否满足条件,并且基于检查结果,执行后续检查。树根据这些检查将数据分成不同的部分。
导入必要的Python库
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
import tflearn.data_utils as du
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
import seaborn as sns
from sklearn.metrics import confusion_matrix
from sklearn.externals.six import StringIO
from IPython.display import Image
from sklearn.tree import export_graphviz
import pydotplus
读取数据集
data = pd.read_csv('../input/column_3C_weka.csv')
这里使用的数据集是orthopedic patients的生物力学特征(https://www.kaggle.com/uciml/biomechanical-features-of-orthopedic-patients)
相关性是什么?
相关性是一个统计学术语,通常指的是两个变量之间的线性关系有多近。
例如,两个线性相关的变量(比如x和y, x = 2y)比两个非线性相关的变量(比如u和v, u = sqr(v))具有更高的相关性
可视化相关性
# Calculating the correlation matrix
corr = data.corr()
# Generating a heatmap
sns.heatmap(corr,xticklabels=corr.columns, yticklabels=corr.columns)
sns.pairplot(data)
在上面的两个图中,您可以清楚地看到具有较高相关性的自变量对具有比具有相对较小相关性的自变量具有更多线性散点图。
将数据集分割成自变量(x)和因变量(y)
x = data.iloc[:,:6].values
y = data.iloc[:,6].values
将数据集拆分为训练和测试数据
训练数据用于训练模型和测试数据以验证模型的性能
x_train , x_test, y_train, y_test = train_test_split(x, y, test_size = 0.25, random_state = 0)
缩放自变量
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)
建立决策树
这里的准则是熵。标准参数决定了函数来衡量分割的质量。当熵被用作准则时,每一次分割都试图减少数据那部分的随机性。
使用的另一个参数是max_depth。这决定了树的深度。
classifier = DecisionTreeClassifier(criterion = 'entropy', max_depth = 4)
classifier.fit(x_train, y_train)
对测试数据进行预测
y_pred = classifier.predict(x_test)
什么是混淆矩阵?
混淆矩阵是用于总结分类算法的性能的技术。如果每个类中的观察数量不等,或者数据集中有两个以上的类,则单独的分类准确性可能会产生误导。计算混淆矩阵可以让您更好地了解分类模型的正确性以及它所犯的错误类型
cm = confusion_matrix(y_test, y_pred)
accuracy = sum(cm[i][i] for i in range(3)) / y_test.shape[0]
print("accuracy = " + str(accuracy))
可视化决策树
dot_data = StringIO()
export_graphviz(classifier, out_file=dot_data,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())
构建没有max_depth参数的模型
classifier2 = DecisionTreeClassifier(criterion = 'entropy')
classifier2.fit(x_train, y_train)
y_pred2 = classifier2.predict(x_test)
cm2 = confusion_matrix(y_test, y_pred2)
accuracy2 = sum(cm2[i][i] for i in range(3)) / y_test.shape[0]
print("accuracy = " + str(accuracy2))
在没有max_depth参数的情况下可视化决策树
dot_data = StringIO()
export_graphviz(classifier2, out_file=dot_data,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png())
现在,考虑包含和不包含max_depth参数的树的叶子节点(终端节点)。您将注意到,在没有max_depth参数的情况下,树中的所有终端节点的熵都为零,而在有这个参数的情况下,树中的三个节点的熵为非零。这是因为在没有提到参数的情况下,递归地进行分割,直到终端节点的熵为零。