【scikit-learn基础】--『监督学习』之 决策树分类
决策树分类
算法是一种监督学习算法,它的基本原理是将数据集通过一系列的问题进行拆分,这些问题被视为决策树的叶子节点和内部节点。
决策树的每个分支代表一个可能的决策结果,而每个叶子节点代表一个最终的分类结果。
决策树分类
算法的历史可以追溯到1980年代初,当时研究者开始探索用机器学习来解决分类问题。
在1981年,J.Ross Quinlan开发了
ID3算法
,该算法使用信息增益来选择决策树的最佳划分属性。
后来,在1986年,J.Ross Quinlan提出了
C4.5算法
,该算法引入了剪枝技术,以防止过拟合,该算法还引入了处理连续属性、缺失数据和多值属性等新特性。
在1998年,Jerome Friedman等人提出了
CART算法
(
Classification and Regression Trees
),该算法采用了二叉树,使得决策树更加简洁和易于解释。
1. 算法概述
决策树
不仅可以用在
分类问题
上,也可以用在
回归问题
上。
关于
决策树
在
回归问题
上的应用,可以参考:
TODO
回到
决策树分类
算法上来,构建决策树的有
三种
算法:
1.1. ID3
ID3算法
的完整名称是
Iterative Dichotomiser 3
,即迭代二叉树3代。
ID3算法
的核心思想是以
信息增益
来度量属性的选择,选择分裂后信息增益最大的属性进行分裂。
对于任意样本数据
\(x(x_1,x_2,...,x_n)\)
,它的
信息熵
定义为:
\(entropy(x) = -\sum_{i=1}^n p_i\log_2(p_i)\)
基于信息熵,
信息增益
的公式为:
\(IG(T) = entropy(S) - \sum_{value(T)}\frac{|S_x|}{|S|}entropy(S_x)\)
其中:
- \(S\)
表示全部样本的集合 - \(|S|\)
表示
\(S\)
中样本数量 - \(T\)
表示样本的某个特征 - \(value(T)\)
表示特征
\(T\)
所有的取值集合 - \(S_x\)
是
\(S\)
中特征
\(T\)
的值为
\(x\)
的样本的集合 - \(|S_x|\)
表示
\(S_x\)
中样本数量
1.2. C4.5
C4.5算法
是以
ID3算法
为基础的,它改为使用
信息增益率
来作为决策树分裂的依据。
这样,就克服了
ID3算法
中信息增益选择属性时
偏向选择取值多的属性
的不足。
C4.5算法
中引入了一个分裂信息(
split information
)的项来惩罚取值较多的特征:
\(SI(T) = - \sum_{value(T)}\frac{|S_x|}{|S|}\log\frac{|S_x|}{|S|}\)
基于此,
信息增益率
的公式为:
\(gainRatio(T)=\frac{IG(T)}{SI(T)}\)
\(IG(T)\)
就是上一节
ID3算法
中的
信息增益
公式。
1.3. CART
CART算法
全称是
classification and regression tree
(分类与回归树)。
这个算法既可以用来分类,也可以用来回归,在回归问题上的介绍可以参考。
CART算法
是根据基尼系数(Gini)来划分特征的,每次选择基尼系数最小的特征作为最优切分点。
其中基尼系数的计算方法:
\(gini(p) = \sum_{i=1}^n p_i(1-p_i)=1-\sum_{i=1}^n p_i^2\)
2. 创建样本数据
用
scikit-learn
中的样本生成器
make_classification
来生成分类用的样本数据。
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
# 分类数据的样本生成器
X, y= make_classification(n_samples=1000, n_classes=4, n_clusters_per_class=1, n_informative=6)
plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25)
plt.show()
关于
样本生成器
的详细内容,请参考:
TODO
3. 模型训练
首先,分割
训练集
和
测试集
。
from sklearn.model_selection import train_test_split
# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
这次按照
8:2的比例
来划分训练集和测试集。
然后用
不同的算法
来训练决策树模型:
from sklearn.tree import DecisionTreeClassifier
reg_names = [
"ID3算法",
"C4.5算法",
"CART算法",
]
# 定义
regs = [
DecisionTreeClassifier(criterion="entropy"),
DecisionTreeClassifier(criterion="log_loss"),
DecisionTreeClassifier(criterion="gini"),
]
# 训练模型
for reg in regs:
reg.fit(X_train, y_train)
# 在测试集上进行预测
y_preds = []
for reg in regs:
y_pred = reg.predict(X_test)
y_preds.append(y_pred)
for i in range(len(y_preds)):
correct_pred = np.sum(y_preds[i] == y_test)
print("【{}】 预测正确率:{:.2f}%".format(reg_names[i], correct_pred / len(y_pred) * 100))
# 运行结果
【ID3算法】 预测正确率:71.50%
【C4.5算法】 预测正确率:72.50%
【CART算法】 预测正确率:75.00%
算法的正确率
差别不是特别大。
感兴趣的朋友,可以尝试调整样本生成器部分,生成一些特征较多的数据来看看算法之间的性能差别。
4. 总结
决策树分类
算法广泛应用于图像识别、文本分类、语音识别、信用评分、疾病诊断等众多领域。
例如,在电商平台上,可以通过决策树分类算法对用户的行为数据进行挖掘和分析,实现对用户的精准推荐;
在医疗领域,可以通过对医学数据的分析,辅助医生进行疾病诊断和治疗方案制定。
决策树分类
算法的
优势
有:
- 易于理解和解释
,直观地展示出分类的过程 - 对于数据集可以进行
并行处理
,提高了算法的效率 - 对于缺失数据和非数值属性有很好的
处理能力 - 可以处理
多分类
问题
决策树分类
算法也存在一些
劣势
:
- 可能存在
过拟合
,需要使用剪枝技术来控制 - 可能存在
偏向性
,需要使用加权投票来处理 - 对于连续属性和多值属性处理起来
比较复杂
,需要额外的处理方法 - 大规模数据集处理起来
比较耗时
,需要优化算法或者使用分布式计算等方法