模块sklarn.tree
sklearn中决策树的类都在“tree”这个模块之下,这个模块总共包含五个类:
tree.DecisionTreeClassifier | 分类树 |
tree.DecisionTreeRegressor | 回归树 |
tree.export_graphviz | 将生成的决策树导出为DOT格式 |
tree.ExtraTreeClassifier | 高随机版本的分类树 |
tree.ExtraTreeRegressor | 高随机版本的回归树 |
分类树对应的代码
from sklearn import tree
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train, y_train)
result = clf.score(X_test, y_test)
DecisionTreeClassifier
重要参数
criterion
不纯度越低,决策树对训练集的拟合越好
树中的每个节点都会有一个不纯度,子节点的不纯度一定小于父节点的不纯度
entropy 信息熵
gini 基尼系数
信息熵对不纯度更加敏感,对不纯度的惩罚最强,但在实际应用中,两者效果基本相同。
criterion如何影响模型?
确定不纯度的计算方法,找出最佳节点和最佳分枝,不纯度越低,决策树对训练集的拟合越好。
决策树的基本流程:
- 计算全部特征的不纯度指标
- 选取不纯度指标最优的特征来分枝
- 在第一个特征的分枝下,计算全部特征的不纯度指标
- 选取不纯度指标最优的特征继续分枝
导入需要的算法库和模块
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target),axis=1])
Xtrain, Xtest, ytrain, ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy",random_state=1,splitter="random")
clf = clf.fit(Xtrain, ytrain)
score = clf.score(Xtest, ytest)
import graphviz
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=wine.feature_names,
class_names=wine.target_names,
filled=True, # 填充颜色,表示特定的某个类别
rounded=True, # 圆角框
special_characters=True)
graph = graphviz.Source(dot_data)
graph
clf.feature_importances_
[*zip(wine.feature_name,clf.feature_importances_)]
random:高纬度时随机性会表现更明显,低维度的数据,随机性几乎不会显现
splitter=“random"(默认best):分枝时会更加随机,树会更深,对训练集的拟合将会降低。
为了让决策树有更好的泛化性,需要对决策树进行剪枝。
- max_depth
限制树的最大深度,超过设定深度的树枝全部剪掉
- min_sample_leaf
min_samples_leaf限定一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则,分枝就不会发生,或者按照每个子节点包含min_samples_leaf个样本去分。
- min_sample_split
min_samples_splits限定一个节点必须包含至少min_samples_splits个训练样本,这个节点才被允许分枝,否则,分枝就不会发生。
- max_features
限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃
- min_impurity_decrease
限制信息增益的大小,信息增益小于设定数值的分枝不会发生
确定最优的剪枝参数
import matplotlib.pyplot as plt
test = []
for i in range(10):
clf = tree.DecisionTreeClassifier(max_depth = i + 1)
clf = clf.fit(Xtrain, ytrain)
score = clf.score(Xtest, ytest)
test.append(score)
plt.plot(range(1,11),test,color="red",label="max_depth")
plt.legend()
plt.show()
目标权重参数
- class_weight
完成样本标签平衡的参数,给少量的标签更多的权重,模型向偏向少数类的方向建模
- min_weight_fraction_leaf
基于权重的剪枝参数,用基于权重的预修剪标准优化树结构,确保叶节点至少包含样本权重的总和的一小部分。
重要属性和接口
# apply返回每个测试样本所在的叶子节点的索引
clf.apply(Xtest)
# predict返回每个测试样本的分类/回归结果
clf.predict(Xtest)