在 sklearn 的 tree 模块中,决策树类既可以用于分类,又可以用于回归。其中,分类决策树的类名是 DecisionTreeClassifier,而回归决策树的类名是DecisionTreeRegressor。二者的参数定义几乎完全相同,但是意义不全相同。DecisionTreeClassifier 类的主要参数及含义如下:
- criterion:特征属性判别力的评价标准,取值可以是 gini(基尼指数)或 entropy(信息增益),默认值为 gini。
- splitter:取值为 best 或 random(默认)。best 是在所有特征中找最好的划分,适合样本量小的情况;而 random 是随机抽取部分特征,再在这些特征中找最好的划分。如果样本数据量非常大,应选择 random,以减少计算开销。
- max_features:划分时考虑的最大特征数。默认是 None,表示划分时考虑所有特征。一般来说,如果样本特征数不多,比如小于 50,推荐使用默认的 None。
- max_depth:决策树的最大深度,取值为整数或 None。设置决策树的最大深度时,深度越大,越容易过拟合,推荐树的深度范围为 5~20。
- min_samples_split:设置节点的最小样本数量,当样本数量小于此值时,节点将不会再划分。
- min_samples_leaf:限制叶子节点的最少样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
- min_weight_fraction_leaf:限制叶子节点所有样本的权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。该参数的默认值为 0,即不考虑权重问题。
- max_leaf_nodes:限制最大叶子节点数,可以用来防止过拟合,默认是 None,即不限制最大的叶子节点数。
- class_weight:指定样本各类别的权重,主要是为了防止在训练集中某些类别的样本过多导致训练的决策树过于偏向这些类别。这里可以自己指定各个样本的权重,如果使用 balanced,则算法会自己计算权重,样本量少的类别所对应的样本权重会高。
- min_impurity_split:限制决策树的增长,如果某节点的不纯度(如基尼系数、信息增益)小于这个阈值,则该节点不再生成子节点,即为叶子节点。
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets # 引入 sklearn 自带的数据集
from sklearn.tree import DecisionTreeClassifier # 引入决策树分类模块
# 转换数据
X ,Y= [],[] # 读取数据
fr = open("./knn.txt")
for line in fr.readlines():
line = line.strip().split()
X.append([int(line[0]),int(line[1])])
Y.append(int(line[-1]))
X=np.array(X) # 转换成 NumPy 数组,X 是特征属性集
y=np.array(Y) # y 是类别标签集
# 加载模型并进行分类可视化
clf = DecisionTreeClassifier(criterion="entropy", max_depth=4)
clf.fit(X, y)
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max,0.1))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=1)
plt.show()