构建树的过程
直接按照以上步骤构建树容易产生过拟合的情况(训练出来的模型过于契合训练数据导致无法对测试数据进行分类)。
防止过拟合:减少模型的复杂度,简化决策树-->剪枝
在sklearn中决策树算法的重要参数
熵(Entropy):在信息论中,设离散随机变量X的概率分布为$P(X=x_i)=p_i i=1,2,3,...,n$ 则概率分布的熵(Entropy)的定义为
$$Entropy(p)=-\sum_^n$$
信息增益(Information Gain):描述了当使用Q进行编码时,再使用P进行编码的差异。在决策树算法中,信息增益是针对某个特征而言的,就是看一个特征A,系统有它和没它的时候信息量各是多少,两者的差值就是这个特征给系统带来的信息量,即增益
$$Gain(S,A)=Entropy(S)-\sum_{v \in Values(A)}{\frac{|S_v|}{|S|}Entropy(S_v)}$$
当熵中的概率由数据估计(特别是最大似然估计)得到时,所对应的熵称为经验熵(empirical entropy)。比如有10个数据,一共有两个类别,A类和B类。其中有7个数据属于A类,则该A类的概率即为十分之七。其中有3个数据属于B类,则该B类的概率即为十分之三。浅显的解释就是,这概率是我们根据数据数出来的。我们定义贷款申请样本数据表中的数据为训练数据集D,则训练数据集D的经验熵为H(D),|D|表示其样本容量,及样本个数。设有K个类Ck, = 1,2,3,…,K,|Ck|为属于类Ck的样本个数,因此经验熵公式就可以写为 :
$$Entropy(D) = - \sum_^{\frac{|c_k|}{|D|} log_2{\frac{|C_k|}{|D|}}}$$
加载数据以及调用所需的包
代码:
from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split import seaborn as sns from sklearn.metrics import accuracy_score iris = load_iris() print('特征名称:',iris.feature_names) print('类别:',iris.target_names)
输出结果:
特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 类别: ['setosa' 'versicolor' 'virginica']
数据处理
代码:
X = iris.data y = iris.target X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=1/4,random_state=0) print('数据集样本数:{},训练样本数:{},测试集样本数:{}'.format(len(X),len(X_train),len(X_test)))
输出结果:
数据集样本数:150,训练样本数:112,测试集样本数:38
建立模型
代码:
dt_model = DecisionTreeClassifier(max_depth=3)
训练模型
代码:
dt_model.fit(X_train,y_train)
测试模型
代码:
y_pred = dt_model.predict(X_test) acc = accuracy_score(y_test,y_pred) print('准确率:',acc)
输出结果:
准确率: 0.9736842105263158
我们在建立模型的时候设置的最大深度参数为3,我们看接下来看一看超参数对于模型的影响
我们分别将参数设置为2,3,4来对比一下训练集和测试集上的准确率
代码:
max_depth_values = [2,3,4] for max_depth_val in max_depth_values: dt_model = DecisionTreeClassifier(max_depth=max_depth_val) dt_model.fit(X_train,y_train) print('max_depth = ',max_depth_val) print('训练集上的准确率:{:.3f}'.format(dt_model.score(X_train,y_train))) print('测试集上的准确率:{:.3f}'.format(dt_model.score(X_test,y_test)))
得到结果:
max_depth = 2 训练集上的准确率:0.964 测试集上的准确率:0.895 max_depth = 3 训练集上的准确率:0.982 测试集上的准确率:0.974 max_depth = 4 训练集上的准确率:1.000 测试集上的准确率:0.974
由此可见当参数设置为4时在训练集和测试集上的准确率是最高的,那我们也可以再试着将参数加大看一看会有什么变化