决策树
简介
决策树是一种基本的分类方法,当然也可以用于回归。我们一般只讨论用于分类的决策树。决策树模型呈树形结构。在分类问题中,表示基于特征对实例进行分类的过程,它可以认为是if-then规则的集合。在决策树的结构中,每一个实例都被一条路径或者一条规则所覆盖。通常决策树学习包括三个步骤:特征选择、决策树的生成和决策树的修剪。
特征选择
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率,如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的京都影响不大。通常特征选择的准则是信息增益,这是个数学概念。
(1)信息熵
H = -(p1logp1 + p2logp2 + … + p32log32)
其中,p1…p32为这支球队夺冠的概率。H的专业术语称之为信息熵,单位为比特,当这32支球队夺冠的几率相同时,对应的信息熵等于5比特,这个可以通过计算得出。有一个特性就是,5比特是公式的最大值。那么信息熵(经验熵)的具体定义可以为如下:
H
(
X
)
=
∑
x
∈
X
P
(
x
)
l
o
g
P
(
x
)
H\left(X\right){=}\sum_{x\in{X}}P\left(x\right)logP\left(x\right)
H(X)=x∈X∑P(x)logP(x)
(2)信息增益
自古以来,信息和消除不确定性是相联系的。所以决策树的过程其实是在寻找某一个特征对整个分类结果的不确定减少的过程。
那么信息增益表示得知特征X的信息而是的类Y的信息的不确定性减少的程度,所以我们对于选择特征进行分类的时候,当然选择信息增益较大的特征,这样具有较强的分类能力。特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即公式为:
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g\left({D,A}\right){=}H\left(D\right) {-} H\left(D|A\right)
g(D,A)=H(D)−H(D∣A)
决策树的生成
sklearn.tree.DecisionTreeClassifier是一个能对数据集进行多分类的类。
决策树的修剪
(1)预剪枝
(2)后剪枝
随机森林
简介
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。
随机森林的生成
sklearn.ensemble提供了准确性更加好的集成方法,里面包含了主要的RandomForestClassifier(随机森林)方法。
使用案例
import pandas as pd #导入pandas包
from sklearn.model_selection import train_test_split #数据切分
from sklearn.feature_extraction import DictVectorizer #特征提取
from sklearn.tree import DecisionTreeClassifier #导入决策树模型
from sklearn.ensemble import RandomForestClassifier #导入随机森林模型
def decomation():
"""
通过决策树和随机森林对泰坦尼克号遇难数据进行预测
:return: None
"""
# 读取数据
data = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
#特征数据
x = data[["pclass","age","sex"]] #其他的无用,或者不是特征数据
# 目标数据
y = data[['survived']]
# 缺失值的处理,对于age的特征中NaN使用平均年龄填充
x['age'].fillna(x['age'].mean(), inplace=True) #inplace表示进行复制,而不是视图
# 对数据集进行切分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
# 特征提取 通过DictVectorizer,将csv数据转换成为字典数据
x_train = x_train.to_dict(orient='records')
x_test = x_test.to_dict(orient='records')
# 提取字典中的特征数据
dict_vec = DictVectorizer(sparse=False)
x_train = dict_vec.fit_transform(x_train)
x_test = dict_vec.transform(x_test)
# 选择决策树模型
dec = DecisionTreeClassifier() #max_path可以指定树的深度,树的深度越浅 泛化程度越高
# 输入数据
dec.fit(x_train, y_train)
score = dec.score(x_test, y_test)
print(score)
# 选择随机森林模型
rand = RandomForestClassifier(max_depth=5)
rand.fit(x_train, y_train)
score = rand.score(x_test, y_test)
print(score)
if __name__ == '__main__':
decomation()