决策树【机器学习笔记简摘】

决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。决策树算法容易理解,适用各种数据,在解决各种问题时都有良好表现,尤其是以树模型为核心的各种集成算法,在各个行业和领域都有广泛的应用。

分类依据

信息增益

1948年香农提出了信息熵(Entropy)的概念。
假如事件A的分类划分是(A1,A2,…,An),每部分发生的概率是(p1,p2,…,pn),那信息熵定义为公式如下:(log是以2为底,lg是以10为底)
在这里插入图片描述1.熵
​ 用于衡量一个对象的有序程度
​ 系统越有序,熵值越低;系统越混乱或者分散,熵值越高。
​ 2.信息熵
●从信息的完整性上进行的描述:
当系统的有序状态一致时,数据越集中的地方熵值越小,数据越分散的地方熵值越大。
●从信息的有序性上进行的描述:
​ 当数据量一致时,系统越有序,熵值越低;系统越混乱或者分散,熵值越高。
信息增益:以某特征划分数据集前后的熵的差值。熵可以表示样本集合的不确定性,熵越大,样本的不确定性就越大。因此可以使用划分前后集合熵的差值来衡量使用当前特征对于样本集合D划分效果的好坏
信息增益 = entroy(前) - entroy(后)
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:
g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D,A)=H(D)-H(D|A) g(D,A)=H(D)H(DA)
公式的详细解释:
在这里插入图片描述
案例:
如下左图,第一列为论坛号码,第二列为性别,第三列为活跃度,最后一列用户是否流失。
我们要解决一个问题:性别和活跃度两个特征,哪个对用户流失影响更大?
在这里插入图片描述
通过计算信息增益可以解决这个问题,统计上右表信息
其中Positive为正样本(已流失),Negative为负样本(未流失),下面的数值为不同划分下对应的人数。
可得到三个熵:
整体熵:
在这里插入图片描述
性别熵:
在这里插入图片描述
性别信息增益:
在这里插入图片描述
活跃度熵:
在这里插入图片描述
活跃度信息增益:
在这里插入图片描述活跃度的信息增益比性别的信息增益大,也就是说,活跃度对用户流失的影响比性别大。

在做特征选择或者数据分析的时候,我们应该重点考察活跃度这个指标。

信息增益率

**增益率:**增益比率度量是用前面的增益度量Gain(S,A)和所分离信息度量SplitInformation(如上例的性别,活跃度等)的比值来共同定义的。
在这里插入图片描述
案例:
如下表所示:满足什么情况才去玩高尔夫 ?
在这里插入图片描述
整体信息熵: H ( Y ) = − 5 14 log ⁡ 2 ( 5 14 ) − 9 14 log ⁡ 2 ( 9 14 ) = 0.9403 H(Y)=-\frac{5}{14}\log_2(\frac{5}{14})-\frac{9}{14}\log_2(\frac{9}{14})=0.9403 H(Y)=145log2(145)149log2(149)=0.9403

任意过来一条天气数据,预估去打高尔夫还是不去打高尔夫,设为随机变量Y。
任意过来一条天气数据,天气(Outlook)是晴天(sunny),阴天(overcast)或者下雨(rain),设为随机变量X。
任意过来一条天气数据是晴天,设为事件x1;
任意过来一条天气数据是阴天,设为事件x2;
任意过来一条天气数据是下雨,设为事件x3;
随机变量X的概率空间为:
在这里插入图片描述

(1)天气晴条件熵: H ( Y ∣ X = x 1 ) = − 3 8 log ⁡ 2 ( 3 8 ) − 5 8 log ⁡ 2 ( 5 8 ) = 0.9544 H(Y|X=x_1)=-\frac{3}{8}\log_2(\frac{3}{8})-\frac{5}{8}\log_2(\frac{5}{8})=0.9544 H(YX=x1)=83log2(83)85log2(85)=0.9544

(2)天气阴条件熵: H ( Y ∣ X = x 2 ) = − 4 4 log ⁡ 2 ( 4 4 ) − 0 4 log ⁡ 2 ( 0 4 ) = 0 H(Y|X=x_2)=-\frac{4}{4}\log_2(\frac{4}{4})-\frac{0}{4}\log_2(\frac{0}{4})=0 H(YX=x2)=44log2(44)40log2(40)=0

(3)天气下雨条件熵: H ( Y ∣ X = x 3 ) = − 2 2 log ⁡ 2 ( 2 2 ) − 0 2 log ⁡ 2 ( 0 2 ) = 0 H(Y|X=x_3)=-\frac{2}{2}\log_2(\frac{2}{2})-\frac{0}{2}\log_2(\frac{0}{2})=0 H(YX=x3)=22log2(22)20log2(20)=0

(4)天气条件熵: H ( Y ∣ X ) = ∑ x ∈ X p ( x ) H ( Y ∣ X ) H(Y|X)=\displaystyle\sum_{x\in X}p(x)H(Y|X) H(YX)=xXp(x)H(YX) = p ( x 1 ) H ( Y ∣ X = x 1 ) + p ( x 2 ) H ( Y ∣ X = x 2 ) + p ( x 3 ) H ( Y ∣ X = x 3 ) = 8 14 × 0.9544 + 4 14 × 0 + 2 14 × 0 = 0.5454 =p(x_1)H(Y|X=x_1)+p(x_2)H(Y|X=x_2)+p(x_3)H(Y|X=x_3)=\frac{8}{14}×0.9544+\frac{4}{14}×0+\frac{2}{14}×0=0.5454 =p(x1)H(YX=x1)+p(x2)H(YX=x2)+p(x3)H(YX=x3)=148×0.9544+144×0+142×0=0.5454

(5)天气信息增益: g ( Y , X ) = H ( Y ) − H ( Y ∣ X ) = 0.3949 g(Y,X)=H(Y)-H(Y|X)=0.3949 g(Y,X)=H(Y)H(YX)=0.3949

信息增益率

(1)Day日期的内部信息: I n t I ( D , D a y ) = 14 × ( − 1 14 × log ⁡ 2 ( 1 14 ) ) = 3.8074 IntI(D,Day)=14×(-\frac{1}{14}×\log_2(\frac{1}{14}))=3.8074 IntI(D,Day)=14×(141×log2(141))=3.8074

(2)Outlook天气的内部信息: I n t I ( D , O u t l o o k ) = − 8 14 log ⁡ 2 ( 8 14 ) − 4 14 log ⁡ 2 ( 4 14 ) − 2 14 log ⁡ 2 ( 2 14 ) = 1.3788 IntI(D,Outlook)=-\frac{8}{14}\log_2(\frac{8}{14})-\frac{4}{14}\log_2(\frac{4}{14})-\frac{2}{14}\log_2(\frac{2}{14})=1.3788 IntI(D,Outlook)=148log2(148)144log2(144)142log2(142)=1.3788

(3)Day日期信息的增益率: g ( D ∣ D a y ) = g ( D , D a y ) I n t I ( D , D a y ) = 0.9403 3.8074 = 0.247 g(D|Day)=\frac{g(D,Day)}{IntI(D,Day)}=\frac{0.9403}{3.8074}=0.247 g(DDay)=IntI(D,Day)g(D,Day)=3.80740.9403=0.247

(4)Outlook天气的信息增益率: g ( D ∣ O u t l o o k ) = g ( D , O u t l o o k ) I n t I ( D , O u t l o o k ) = 0.3949 1.3788 = 0.2864 g(D|Outlook)=\frac{g(D,Outlook)}{IntI(D,Outlook)}=\frac{0.3949}{1.3788}=0.2864 g(DOutlook)=IntI(D,Outlook)g(D,Outlook)=1.37880.3949=0.2864

基尼值和基尼指数

**基尼值Gini(D):**从数据集D中随机抽取两个样本,其类别标记不一致的概率。故Gini(D)值越小,数据集D的纯度越高。
在这里插入图片描述
**基尼指数Gini_index(D):**一般,选择使划分后基尼系数最小的属性作为最优化分属性。
在这里插入图片描述
案例
请根据下图列表,按照基尼指数的划分依据,做出决策树。
在这里插入图片描述
1,对数据集非类标号属性{是否有房,婚姻状况,年收入}分别计算它们的Gini系数增益,取Gini系数增益值最大的属性作为决策树的根节点属性。
2,根节点的Gini系数为:
在这里插入图片描述
3,当根据是否有房来进行划分时,Gini系数增益计算过程为:
在这里插入图片描述
4,若按婚姻状况属性来划分,属性婚姻状况有三个可能的取值{married,single,divorced},分别计算划分后的Gini系数增益。
{married} | {single,divorced}
{single} | {married,divorced}
{divorced} | {single,married}
分组为{married} | {single,divorced}时:
在这里插入图片描述当分组为{single} | {married,divorced}时:
在这里插入图片描述
当分组为{divorced} | {single,married}时:
在这里插入图片描述
对比计算结果,根据婚姻状况属性来划分根节点时取Gini系数增益最大的分组作为划分结果,即:{married} | {single,divorced}

5,同理可得年收入Gini:
对于年收入属性为数值型属性,首先需要对数据按升序排序,然后从小到大依次用相邻值的中间值作为分隔将样本划分为两组。例如当面对年收入为60和70这两个值时,我们算得其中间值为65。以中间值65作为分割点求出Gini系数增益。
在这里插入图片描述
最大化增益等价于最小化子结点的不纯性度量(Gini系数)的加权平均值,现在我们希望最大化Gini系数的增益。根据计算知道,三个属性划分根节点的增益最大的有两个:年收入属性和婚姻状况,他们的增益都为0.12。此时,选取首先出现的属性作为第一次划分。

6,接下来,采用同样的方法,分别计算剩下属性,其中根节点的Gini系数为(此时是否拖欠贷款的各有3个records)
在这里插入图片描述
7,对于是否有房属性,可得:
在这里插入图片描述
8,对于年收入属性则有:
在这里插入图片描述
在这里插入图片描述

小结

1、信息增益
信息增益 = entroy(前) - entroy(后)
注意:信息增益越大,我们优先选择这个属性进行计算
信息增益优先选择属性总类别比较多的进行划分
2、信息增益率
维持了一个分离信息度量,通过这个分离信息度量当分母,进行限制
3、基尼增益
●.基尼值:
从数据集D中随机抽取两个样本,其类别标记不一致的概率
Gini(D)值越小,数据集D的纯度越高。
●基尼指数:
选择使划分后基尼系数最小的属性作为最优化分属性
●基尼增益:
选择基尼增益最大的点,进行优化划分

对应的三种算法

在这里插入图片描述

ID3 算法

存在的缺点
(1) ID3算法在选择根节点和各内部节点中的分支属性时,采用信息增益作为评价标准。信息增益的缺点是倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息.

(2) ID3算法只能对描述属性为离散型属性的数据集构造决策树

C4.5算法

做出的改进(为什么使用C4.5要好)
(1) 用信息增益率来选择属性
(2) 可以处理连续数值型属性
(3)采用了一种后剪枝方法
(4)对于缺失值的处理
C4.5算法的优缺点
优点:
产生的分类规则易于理解,准确率较高。

缺点:
在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。

此外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

CART算法

CART算法相比C4.5算法的分类方法,采用了简化的二叉树模型,同时特征选择采用了近似的基尼系数来简化计算。

C4.5不一定是二叉树,但CART一定是二叉树。

同时,无论是ID3, C4.5还是CART,在做特征选择的时候都是选择最优的一个特征来做分类决策,但是大多数,**分类决策不应该是由某一个特征决定的,而是应该由一组特征决定的。**这样决策得到的决策树更加准确。这个决策树叫做多变量决策树(multi-variate decision tree)。在选择最优特征的时候,多变量决策树不是选择某一个最优特征,而是选择最优的一个特征线性组合来做决策。这个算法的代表是OC1,这里不多介绍。

如果样本发生一点点的改动,就会导致树结构的剧烈改变。这个可以通过集成学习里面的随机森林之类的方法解决。

分类树算法api

API官网链接

class sklearn.tree.DecisionTreeClassifier(*, criterion='gini', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, class_weight=None, ccp_alpha=0.0)

参数:
criterion 不纯度的计算方法
输入"entropy",使用信息熵(Entropy)
输入"gini",使用基尼系数(Gini Impurity)

比起基尼系数,信息熵对不纯度更加敏感,对不纯度的惩罚最强。但是在实际使用中,信息熵和基尼系数的效果基本相同。信息熵的计算比基尼系数缓慢一些,因为基尼系数的计算不涉及对数。另外,因为信息熵对不纯度更加敏感,所以信息熵作为指标时,决策树的生长会更加“精细”,因此对于高维数据或者噪音很多的数据,信息熵很容易过拟合,基尼系数在这种情况下效果往往比较好。当模型拟合程度不足的时候,即当模型在训练集和测试集上都表 现不太好的时候,使用信息熵。当然,这些不是绝对的。

参数 criterion
如何影响模型? 确定不纯度的计算方法,帮忙找出最佳节点和最佳分枝,不纯度越低,决策树对训练集的拟合越
怎样选取参数? 通常就使用基尼系数数
据维度很大,噪音很大时使用基尼系数
维度低,数据比较清晰的时候,信息熵和基尼系数没区别
当决策树的拟合程度不够的时候,使用信息熵
两个都试试,不好就换另外一个

random_state & splitter 随机数种子
random_state随机数种子,在高维度时随机性会表现更明显,低维度的数据(比如鸢尾花数据集),随机性几乎不会显现。

splitter也是用来控制决策树中的随机选项的,有两种输入值,输入”best",决策树在分枝时虽然随机,但是还是会优先选择更重要的特征进行分枝(重要性可以通过属性feature_importances_查看),输入“random",决策树在分枝时会更加随机,树会因为含有更多的不必要信息而更深更大,并因这些不必要信息而降低对训练集的拟合。这也是防止过拟合的一种方式。当你预测到你的模型会过拟合,用这两个参数来帮助你降低树建成之后过拟合的可能性。当然,树一旦建成,我们依然是使用剪枝参数来防止过拟合。

max_depth 决策树最大深度,超过设定深度的树枝全部剪掉
决策树多生长一层,对样本量的需求会增加一倍,所 以限制树深度能够有效地限制过拟合。在集成算法中也非常实用。实际使用时,建议从=3开始尝试,看看拟合的效 果再决定是否增加设定深度。

min_samples_leaf & min_samples_split 叶子节点最少样本数 & 内部节点再划分所需最小样本数
min_samples_split这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。我之前的一个项目例子,有大概10万样本,建立决策树时,我选择了min_samples_split=10。可以作为参考。

min_samples_leaf这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。之前的10万样本项目使用min_samples_leaf的值为5,仅供参考。

max_features & min_impurity_decrease
一般max_depth使用,用作树的”精修“

max_features限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。和max_depth异曲同工, max_features是用来限制高维度数据的过拟合的剪枝参数,但其方法比较暴力,是直接限制可以使用的特征数量而强行使决策树停下的参数,在不知道决策树中的各个特征的重要性的情况下,强行设定这个参数可能会导致模型 学习不足。如果希望通过降维的方式防止过拟合,建议使用PCA,ICA或者特征选择模块中的降维算法。

min_impurity_decrease限制信息增益的大小,信息增益小于设定数值的分枝不会发生。这是在0.19版本中更新的 功能,在0.19版本之前时使用min_impurity_split。

class_weight & min_weight_fraction_leaf 目标权重参数
属性是在模型训练之后,能够调用查看的模型的各种性质。对决策树来说,最重要的是feature_importances_,能够查看各个特征对模型的重要性。决策树最常用的接口还有apply和predict。apply中输入测试集返回每个测试样本所在的叶子节点的索引,predict输入测试集返回每个测试样本的标签。

所有接口中要求输入X_trainX_test的部分,输入的特征矩阵必须至少是一个二维矩阵。sklearn不接受任何一维矩阵作为特征矩阵被输入。如果你的数据的确只有一个特征,那必须用**reshape(-1,1)**来给矩阵增维;如果你的数据只有一个特征和一个样本,使用reshape(1,-1)来给你的数据增维。

分类树属性列表
在这里插入图片描述
分类树接口列表
在这里插入图片描述
小结
决策树的基本流程,分类树的八个参数,一个属性,四个接口,以及绘图所用的代码。
八个参数:Criterion,两个随机性相关的参数(random_state,splitter),五个剪枝参数(max_depth,min_samples_split,min_samples_leaf,max_feature,min_impurity_decrease)
一个属性:feature_importances_
四个接口:fit,score,apply,predict

红酒数据集案例

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import  matplotlib.pyplot as plt
import graphviz# 需要提前安装graphviz
wine = load_wine()
X_train, X_test, Y_train, Y_test = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(X_train, Y_train)
score = clf.score(X_test, Y_test) #返回预测的准确度accuracy
print(score)
print(wine.feature_names)
print(wine.target_names)

feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']

dot_data = tree.export_graphviz(clf
                                ,feature_names = feature_name  # 特征名
                                ,class_names=["琴酒","雪莉","贝尔摩德"] #标签的名称,这里是自定义的
                                ,filled=True  # 颜色填充
                                ,rounded=True # 圆角边框
                               ) 
graph = graphviz.Source(dot_data)
graph

在这里插入图片描述

# random_state & splitter
clf = tree.DecisionTreeClassifier(criterion="entropy"
                                  ,random_state=30
                                  ,splitter="random"
                                 )
clf = clf.fit(X_train, Y_train)
score = clf.score(X_test, Y_test)
print(score)
#剪枝参数
clf = tree.DecisionTreeClassifier(criterion="entropy"
                                  ,random_state=30
                                  ,splitter="random"
                                  ,max_depth=3
                                  ,min_samples_leaf=10 # 将样本数量小于10的叶子节点剪掉
                                  ,min_samples_split=10 # 将中间节点样本数量小于10的剪掉
                                 )
clf = clf.fit(X_train, Y_train)
dot_data = tree.export_graphviz(clf
                                ,feature_names = feature_name 
                                ,class_names=["琴酒","雪莉","贝尔摩德"]
                                ,filled=True
                                ,rounded=True
                               ) 
graph = graphviz.Source(dot_data)
graph

在这里插入图片描述

# 确认最优参数,画学习曲线
deths_rt = []

for dep in range(1, 10):
    clf = tree.DecisionTreeClassifier(criterion="entropy"
                                      ,max_depth = dep
                                      ,random_state=30
                                      ,splitter="random"
                                      
                                     )
    clf = clf.fit(X_train, Y_train)
    score = clf.score(X_test, Y_test)  # 返回准确度
    deths_rt.append(score)
plt.plot(range(1, 10), deths_rt)

在这里插入图片描述

# 将特征名称与重要性对应
dict(zip(wine.feature_names, clf.feature_importances_))  
# 返回样本所在叶子节点的索引
clf.apply(X_test)

回归树算法api

class sklearn.tree.DecisionTreeRegressor(*, criterion='squared_error', splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, ccp_alpha=0.0)

在回归树种,没有标签分布是否均衡的问题,因 此没有class_weight这样的参数。

参数说明:
回归树衡量分枝质量的指标,支持的标准有三种:
1)输入"mse"使用均方误差mean squared error(MSE),父节点和叶子节点之间的均方误差的差额将被用来作为特征选择的标准,这种方法通过使用叶子节点的均值来最小化L2损失

2)输入“friedman_mse”使用费尔德曼均方误差,这种指标使用弗里德曼针对潜在分枝中的问题改进后的均方误差

3)输入"mae"使用绝对平均误差MAE(mean absolute error),这种指标使用叶节点的中值来最小化L1损失
属性中最重要的依然是feature_importances_,接口依然是apply, fit, predict, score最核心。

回归树的接口score返回的是R平方,并不是MSE。

决策树的优缺点

决策树优点

  1. 易于理解和解释,因为树木可以画出来被看见

  2. 需要很少的数据准备。其他很多算法通常都需要数据规范化,需要创建虚拟变量并删除空值等。但请注意,sklearn中的决策树模块不支持对缺失值的处理。

  3. 使用树的成本(比如说,在预测数据的时候)是用于训练树的数据点的数量的对数,相比于其他算法,这是一个很低的成本。

  4. 能够同时处理数字和分类数据,既可以做回归又可以做分类。其他技术通常专门用于分析仅具有一种变量类 型的数据集。

  5. 能够处理多输出问题,即含有多个标签的问题,注意与一个标签中含有多种标签分类的问题区别开

  6. 是一个白盒模型,结果很容易能够被解释。如果在模型中可以观察到给定的情况,则可以通过布尔逻辑轻松解释条件。相反,在黑盒模型中(例如,在人工神经网络中),结果可能更难以解释。

  7. 可以使用统计测试验证模型,这让我们可以考虑模型的可靠性。

  8. 即使其假设在某种程度上违反了生成数据的真实模型,也能够表现良好。

决策树的缺点

  1. 决策树学习者可能创建过于复杂的树,这些树不能很好地推广数据。这称为过度拟合。修剪,设置叶节点所 需的最小样本数或设置树的最大深度等机制是避免此问题所必需的,而这些参数的整合和调整对初学者来说 会比较晦涩

  2. 决策树可能不稳定,数据中微小的变化可能导致生成完全不同的树,这个问题需要通过集成算法来解决。

  3. 决策树的学习是基于贪婪算法,它靠优化局部最优(每个节点的最优)来试图达到整体的最优,但这种做法 不能保证返回全局最优决策树。这个问题也可以由集成算法来解决,在随机森林中,特征和样本会在分枝过程中被随机采样。

  4. 有些概念很难学习,因为决策树不容易表达它们,例如XOR,奇偶校验或多路复用器问题。

  5. 如果标签中的某些类占主导地位,决策树学习者会创建偏向主导类的树。因此,建议在拟合决策树之前平衡 数据集。

练习

泰坦尼克号乘客生存预测

在泰坦尼克号和titanic2数据帧描述泰坦尼克号上的个别乘客的生存状态。这里使用的数据集是由各种研究人员开始的。其中包括许多研究人员创建的旅客名单,由Michael A. Findlay编辑。我们提取的数据集中的特征是票的类别,存活,乘坐班,年龄,登陆,home.dest,房间,票,船和性别。

数据:http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt

经过观察数据得到:
1 乘坐班是指乘客班(1,2,3),是社会经济阶层的代表。
2 其中age数据存在缺失。

import pandas as pd
import numpy as np
from sklearn import tree
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz

# 1、获取数据
titan = pd.read_csv("titanic.csv")

#2、数据基本处理
#2.1 确定特征值,目标值
x = titan[["pclass", "age", "sex"]]
y = titan["survived"]

#2.2 缺失值处理
x['age'].fillna(x['age'].mean(), inplace=True)

#2.3 数据集划分
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=22)


#3.特征工程(字典特征抽取)
# 对于x转换成字典数据x.to_dict(orient="records")
# [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]
transfer = DictVectorizer(sparse=False)
x_train = transfer.fit_transform(x_train.to_dict(orient="records"))
x_test = transfer.fit_transform(x_test.to_dict(orient="records"))


# 4.机器学习(决策树)
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=5)
estimator.fit(x_train, y_train)


# 5.模型评估
estimator.score(x_test, y_test)

estimator.predict(x_test)

猜你喜欢

转载自blog.csdn.net/qq_45694768/article/details/120754428