文章目录
- 初识决策树
- 特征提取
- 案例-泰坦尼克号
初识决策树
决策树是一种树形结构,其中每个内部节点表示-个属性.上的判断,每个分支代表- 个判断结果的输出。
熵是描述混乱程度的量度
系统越有序,熵值越低;系统越混乱或分散,熵值越高最后每个叶节点代表-种分类结果,本质是一颗由多个判断节点组成的树。
决策树划分依据-信息增益
例如:ID3的分支方式
信息增益:以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏。
信息增益= entroy(前) - entroy(后)
-般而言,信息增益越大,则意味着使用属性a来进行划分所获得的"纯度提升"越大
信息增益准则对可取值数目较多的属性有所偏好
决策树划分依据-信息增益率
例如:C4.5的分支方式
增益率是对信息增益和属性对应的固有值的比值来共同定义的
决策树划分依据-基尼值和基尼指数
例如:CART的分支方式
cart(Classification and Regression Tree)决策树使用基尼指数(Gini index)来选择划分属性
基尼值(Fini) 是从数据集D中随机抽取两个样本,其类别标记不一致的概率。所以基尼值越小,数据集的纯度越高
基尼指数Gini_index, 一般选择划分后基尼值最小的属性作为最优划分属性
名称 | 分支方式 | 备注 |
ID3 | 信息增益 | ID3只能对离散属性的数据集构成决策树 |
C4.5 | 信息增益率 | 优化后解决了ID3分支过程中总喜欢偏向选择值较多的属性 |
CART | Gini系数 | 可以进行分类和回归,可以处理离散属性,也可以处理连续属性 |
cart树剪枝
预剪枝
(1)每一个结点所包含的最小样本数目,例如10,则该结点总样本数小于10时,则不再分;
(2)指定树的高度或者深度,例如树的最大深度为4;
(3)指定结点的熵小于某个值,不再划分。随着树的增长,在训练样集 上的精度是单调上升的,然而在独立的测试样例.上测出的精度先上升后下降。
后剪枝
后剪枝,在已生成过拟合决策树上进行剪枝,可以得到简化版的剪枝决策树。
特征提取
把任意数据转换为可用于机器学习的数字特征
字典特征提取
from sklearn.feature_extraction import DictVectorizer
data = [{"city":"北京", "temperature":100},{"city":"上海", "temperature":60},
{"city":"深圳", "temperature":30}]
# 字典特征提取
# transfer = DictVectorizer(sparse=False)-->one-hot编码矩阵
transfer = DictVectorizer(sparse=True)
# 转换
new_data = transfer.fit_transform(data)
print(new_data)
# 获取具体属性名
names = transfer.get_feature_names()
names
文本特征提取-英文
from sklearn.feature_extraction.text import CountVectorizer
data = ["life is short, i like python", "life is too long, i dislike python"]
transfer = CountVectorizer()
new_data = transfer.fit_transform(data)
names = transfer.get_feature_names()
print(names)
print(new_data.toarray())
文本特征提取-中文
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word(text):
return " ".join(jieba.lcut(text))
data = ["今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一-种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
lt = []
for temp in data:
lt.append(cut_word(temp))
transfer = CountVectorizer(stop_words=["一种", " ,"])
new_data = transfer.fit_transform(lt)
names = transfer.get_feature_names()
new_data.toarray()
案例-泰坦尼克号
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
data = pd.read_csv("E:\\a.txt")
data.head()
# data.describe()
# 确定特征值,目标值
x = data[["pclass", "age", "sex"]]
y = data["survived"]
# 缺失值处理
x["age"].fillna(value=data["age"].mean(), inplace=True)
# 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22, test_size=0.2)
# 特征工程(字典特征提取)
x_train = x_train.to_dict(orient="records")
x_test = x_test.to_dict(orient="records")
transfer = DictVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
estimator = DecisionTreeClassifier()
estimator.fit(x_train, y_train)
# 模型评估
y_pre = estimator.predict(x_test)
estimator.score(x_test, y_test)