决策树之信息论基础
认识决策树
举例: 是否见相亲对象
信息的度量和作用
克劳德 . 艾尔伍德 . 香农: 信息论创始人, 密西根大学学士, 麻省理工学院博士. 1948 年发表了划时代论文 - 通信的数学原理, 奠定了现代信息论的基础.
信息的单位: 比特 (bit)
举例: 以 32 支球队争夺世界杯冠军
如果不知道任何球队的信息, 每支球队得冠概率相等.
以二分法预测, 最少需要使用 5 次才能预测到准确结果. 5 = log32 (以 2 为底)
5 = -(1/32log1/32 + 1/32log1/32 + ......)
开放一些信息, 则小于 5bit, 如 1/6 德国, 1/6 巴西, 1/10 中国
5> -(1/6log1/4 + 1/6log1/4 + ....)
信息熵:
"谁是世界杯冠军" 的信息量应该比 5 bit 少, 它的准确信息量应该是:
H = -(p1logp1 + p2logp2 + p3logp3 +......p32logp32 ) Pi 为第 i 支球队获胜的概率
H 的专业术语就是信息熵, 单位为比特
决策树的划分以及案例
信息增益
定义: 特征 A 对训练数据集 D 的信息增益 g(D,A), 定义为集合 D 的信息熵 H(D)与特征 A 给定条件下 D 的信息条件熵 H(D|A) 之差, 即:
g(D,A) = H(D) - H(D | A)
注: 信息增益表示得知特征 X 的信息而使得类 Y 的信息的不确定性减少的程度.
以不同特征下的信贷成功率为例
H(D) = -(9/15log(9/15) + 6/15log(6/15)) = 0.971 # 以类别进行判断, 只有是否两种类别
gD, 年纪) = H(D) - H(D'| 年纪) = 0.971 - [1/3H(青年)+ 1/3H(中年)+ 1/3H(老年)] # 三种年纪对应的目标值均占 1/3
- - H(青年) = -(2/5log(2/5) + 3/5log(3/5)) # 青年类型中, 类别的目标值特征为(2/5, 3/5)
- - H(中年) = -(2/5log(2/5) + 3/5log(3/5))
- - H(老年) = -(4/5log(2/5) + 1/5log(3/5))
令 A1, A2, A3, A4 分别表示年龄, 有工作, 有房子和信贷情况 4 个特征, 则对应的信息增益为:
g(D,A1) = H(D) - H(D|A1)
其中, g(D,A2) = 0.324 , g(D,A3) = 0.420 , g(D,A4) = 0.363
相比而言, A3 特征 (有房子) 的信息增益最大, 为最有用特征.
所以决策树的实际划分为:
常见决策树使用的算法
ID3
信息增益, 最大原则
C4.5
信息增益比最大原则 (信息增益占原始信息量的比值)
CART
回归树: 平方误差最小
分类树: 基尼系数最小原则 (划分的细致),sklearn 默认的划分原则
Sklearn 决策树 API
sklearn.tree.DecisionTreeClassifier(criterion='gini', max_depth=None, random_state=None)
criterion (标准): 默认基尼系数, 也可以选用信息增益的熵'entropy'
max_depth: 树的深度大小
random_state: 随机数种子
决策树结构
sklearn.tree.export_graphviz() 导出 DOT 文件格式
estimator: 估算器
out_file = "tree.dot" 导出路径
feature_name = [,] 决策树特征名
决策树预测泰坦尼克号案例
- import pandas as pd
- from sklearn.feature_extraction import DictVectorizer
- from sklearn.model_selection import train_test_split
- from sklearn.tree import DecisionTreeClassifier, export_graphviz
- """
- 泰坦尼克数据描述事故后乘客的生存状态, 该数据集包括了很多自建旅客名单, 提取的数据集中的特征包括:
- 票的类别, 存货, 等级, 年龄, 登录, 目的地, 房间, 票, 船, 性别.
- 乘坐等级 (1,2,3) 是社会经济阶层的代表, 其中 age 数据存在缺失.
- """
- def decision():
- """
- 决策树对泰坦尼克号进行预测生死
- :return: None
- """
- # 1. 获取数据
- titan = pd.read_csv('./titanic_train.csv')
- # 2. 处理数据, 找出特征值和目标值
- x = titan[['Pclass', 'Age', 'Sex']]
- y = titan[['Survived']]
- # print(x)
- # 缺失值处理 (使用平均值填充)
- x['Age'].fillna(x['Age'].mean(), inplace=True)
- print(x)
- # 3. 分割数据集到训练集和测试集
- x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
- # 4. 进行处理(特征工程) 特征, 类别 --> one_hot 编码
- dict = DictVectorizer(sparse=False)
- x_train = dict.fit_transform(x_train.to_dict(orient='records'))
- print(dict.get_feature_names())
- x_test = dict.transform(x_test.to_dict(orient='records')) # 默认一行一行转换成字典
- print(x_train)
- # 5. 用决策树进行预测
- dec = DecisionTreeClassifier()
- dec.fit(x_train, y_train)
- # 预测准确率
- print("预测的准确率:", dec.score(x_test, y_test))
- # 导出决策树
- export_graphviz(dec, out_file='./tree.dot', feature_names=['Pclass', 'Age', 'Sex'])
- return None
- if __name__ == '__main__':
- decision()
来源: https://www.cnblogs.com/hp-lake/p/11931462.html