决策树实现

189 阅读2分钟

DecisionTreeClassifier

from sklearn import tree
clf = tree.DecisionClassifier()
clf = tree.fit(x_train,y_train)
result = clf.score(X_test,y_text)

1.分类树的基本参数列表

1.criterion
一些数学公式

信息熵公式 :Entropy(X)=i=1nPilog2PiEntropy(X) = -\sum _{i=1}^{n}{P_ilog_2{P_i}}

基尼系数公式 : Gini(X)=i=1nPi(1Pi)=1i=1nPi2Gini(X)= \sum_{i=1}^{n}{P_i(1 - P_i)} =1- \sum_{i=1}^{n}{P_i^2}

这是一个衡量分类效果的参数叫不纯度,通常来说不纯度越低分类效果越好,可以通过数学方法证明子节点不纯度是低于父节点的,叶子节点的不纯度是最低的,对于这个参数,sklearn提供了两个不同的选择,输入entropy使用信息熵,gini使用基尼指数

当使用信息熵是,sklearn实际上计算的是信息熵的增益,就是从父节点到子节点信息熵的差值,信息熵一定程度上精度更高而速度更慢(也就是取对数计算过程速度慢),而基尼系数适合比较大量的数据

使用示例

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
​
import pandas as pd
import graphviz
​
wine = load_wine()
#  wine包含基本的data和target两个属性
catD = pd.concat([pd.DataFrame(wine.data), pd.DataFrame(wine.target)], axis=1)
#  将多个DataFrame进行拼接 axis = 1 表示列拼接 也就是增加列的维度,这样仅仅用于print查看
print(catD)
​
x_train, x_test, y_train, y_test = train_test_split(wine.data, wine.target, test_size=0.2)
​
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(x_train, y_train)
score = clf.score(x_test, y_test)
print("accuracy:", score)
​
dot_data = tree.export_graphviz(clf)
graph = graphviz.Source(dot_data)
print(graph)
2.random_state

随机种子,不多描述

3.spliter
clf = tree.DecisionTreeClassifier(
    criterion="entropy",
    random_state=30,
    splitter="random"
)

使用splitter 有两种参数,random或者best,splitter="best"'以使用最佳特征分割(默认),或者'splitter="random"'以使用随机特征分割

2.决策树剪支

防止过拟合的方式

1.max_depth

限制树的最大深度,超过设定深度剪去

2.min_samples_leaf & min_samples_split

min_samples_leaf 这个参数指定了一个叶子节点(终端节点)最少需要包含多少个样本点才能被创建。如果某节点分割后某个子节点中的样本数少于这个值,则不会继续分割。

min_samples_split它定义了在内部节点进行分割时,该节点所包含的样本数量至少要达到多少才会尝试对其进行分割

3.max_features & min_impurity_decrease

max_features 限制分支个数

min_impurity_decrease 限制信息增益,如果没达到就不分支

3.重要属性和接口

# 返回每个测试点样本所在的叶子节点索引
clf.apply(Xtest)
# predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)
# 返回每个特征的重要性
clf.feature_importances_