1.
ID3算法优缺点:
① 不能对连续数据进行处理,只能通过连续数据离散化进行处理;
② 采用信息增益容易偏向取值较多的特征,准确率不如信息增益率;
③ 缺失值不好处理。
④ 没有采用剪枝,决策树的结构可能过于复杂,容易出现过拟合。
2.
C4.5算法优缺点:
① 产生的规则容易理解,准确率高,实现简单;
② 对数据进行多次顺序扫描和排序,效率低;
③ 只适合小规模数据集,需要将数据放到内存中
3.剪枝目的:
避免过拟合现象,提升模型的泛化效果
4.剪枝方法:
剪枝算法主要分为两种,预剪枝和后剪枝
预剪枝是在构建决策树的过程中,提前停止使模型性能变差的分支
5.预剪枝方法:
- 当树的深度达到一定的规模,停止生长。
- 当前节点的样本数量小于某个阈值,停止生长。
- 当信息增益,信息增益率和基尼指数增益小于某个阈值,停止生长。
- 当测试集准确性提升小于某个阈值,或不再提升甚至有所下降时,停止生长。(西瓜书)
6.后剪枝方法:
- 悲观剪枝(PEP)
- 最小误差剪枝(MEP)
- 错误率降低剪枝(REP),(西瓜书)
- 代价复杂度剪枝(CCP)
- OPP (Optimal Pruning)
- CVP (Critical Value Pruning)
7.下面是剪枝的实例:
(1)开始
import math
import numpy as np
(2)创建数据集:
# 创建西瓜书数据集2.0
def createDataXG20():
data = np.array([['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑']
, ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑']
, ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑']
, ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑']
, ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑']
, ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘']
, ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘']
, ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑']
, ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑']
, ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘']
, ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑']
, ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘']
, ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑']
, ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑']
, ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘']
, ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑']
, ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑']])
label = np.array(['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否'])
name = np.array(['色泽', '根蒂', '敲声', '纹理', '脐部', '触感'])
return data, label, name
def splitXgData20(xgData, xgLabel):
xgDataTrain = xgData[[0, 1, 2, 5, 6, 9, 13, 14, 15, 16],:]
xgDataTest = xgData[[3, 4, 7, 8, 10, 11, 12],:]
xgLabelTrain = xgLabel[[0, 1, 2, 5, 6, 9, 13, 14, 15, 16]]
xgLabelTest = xgLabel[[3, 4, 7, 8, 10, 11, 12]]
return xgDataTrain, xgLabelTrain, xgDataTest, xgLabelTest
(3) 创建基础函数:
# 定义一个常用函数 用来求numpy array中数值等于某值的元素数量
equalNums = lambda x,y: 0 if x is None else x[x==y].size
# 定义计算信息熵的函数
def singleEntropy(x):
"""计算一个输入序列的信息熵"""
# 转换为 numpy 矩阵
x = np.asarray(x)
# 取所有不同值
xValues = set(x)
# 计算熵值
entropy = 0
for xValue in xValues:
p = equalNums(x, xValue) / x.size
entropy -= p * math.