机器学习 决策树

决策树是一种机器学习算法,常用于分类和回归问题。它通过构建一个树状模型来进行决策。决策树的每个内部节点代表一个特征或属性,每个分支代表该特征的一个取值,而每个叶子节点代表一个类别或结果。下面是决策树的一般流程:

  1. 特征选择:选择最佳划分数据集的特征,通常使用信息增益、信息增益率、基尼指数等指标进行评估。

  2. 分裂节点:将节点划分为多个子节点,每个子节点对应一个特征取值。

  3. 递归构建子树:对每个子节点重复上述过程,直到满足终止条件(如达到叶子节点数量的上限、节点包含的样本数量小于某个阈值等)。

  4. 剪枝:为了避免过拟合,可以通过剪枝操作减少决策树的复杂度,提高泛化能力。

  5. 预测:使用生成的决策树对新样本进行分类或回归预测。

决策树具有一些优点,如易于理解和解释、可处理混合数据类型、对缺失值不敏感等。然而,它也存在一些缺点,如容易过拟合、对噪声敏感等。

在实际应用中,决策树可以用于诸如金融风险评估、医学诊断、客户分类等领域。此外,还有一些改进的决策树算法,如随机森林、梯度提升决策树等,用于提高预测性能和稳定性。

用决策树分类:从根节点开始,对实例的某一特征进行测试,根据测试结果将实例分配到其子节点,此时每个子节点对应着该特征的一个取值,如此递归的对实例进行测试并分配,直到到达叶节点,最后将实例分到叶节点的类中。

下图为决策树示意图,圆点——内部节点,方框——叶节点

决策树学习的目标:根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。

决策树学习的本质:从训练集中归纳出一组分类规则,或者说是由训练数据集估计条件概率模型。

决策树学习的损失函数:正则化的极大似然函数

决策树学习的测试:最小化损失函数

决策树学习的目标:在损失函数的意义下,选择最优决策树的问题。

决策树原理和问答猜测结果游戏相似,根据一系列数据,然后给出游戏的答案。

决策树特点
优点:
容易理解,可解释性较好
可以用于小数据集
时间复杂度较小
可以处理多输入问题,可以处理不相关特征数据
对缺失值不敏感

缺点:
在处理特征关联性比较强的数据时,表现得不太好
当样本中各类别不均匀时,信息增益会偏向于那些具有更多数值的特征
对连续性的字段比较难预测
容易出现过拟合
当类别太多时,错误可能会增加得比较快
 

决策树的构造
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。

1) 开始:构建根节点,将所有训练数据都放在根节点,选择一个最优特征,按着这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。

2) 如果这些子集已经能够被基本正确分类,那么构建叶节点,并将这些子集分到所对应的叶节点去。

3)如果还有子集不能够被正确的分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点,如果递归进行,直至所有训练数据子集被基本正确的分类,或者没有合适的特征为止。

4)每个子集都被分到叶节点上,即都有了明确的类,这样就生成了一颗决策树。
 

使用决策树做预测需要以下过程:

收集数据:可以使用任何方法。比如想构建一个相亲系统,我们可以从媒婆那里,或者通过参访相亲对象获取数据。根据他们考虑的因素和最终的选择结果,就可以得到一些供我们利用的数据了。
准备数据:收集完的数据,我们要进行整理,将这些所有收集的信息按照一定规则整理出来,并排版,方便我们进行后续处理。
分析数据:可以使用任何方法,决策树构造完成之后,我们可以检查决策树图形是否符合预期。
训练算法:这个过程也就是构造决策树,同样也可以说是决策树学习,就是构造一个决策树的数据结构。
测试算法:使用经验树计算错误率。当错误率达到了可接收范围,这个决策树就可以投放使用了。
使用算法:此步骤可以使用适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。
 

导入包

from sklearn.feature_extraction import DictVectorizer
from sklearn import tree
from sklearn import preprocessing
from sklearn.preprocessing import LabelBinarizer
import csv

读入数据

Dtree=open(r'AllElectronics.csv','r')#可以读取字符类型
reader=csv.reader(Dtree)
#获取第一行数据
headers=reader.__next__()#第一行
print(headers)
#定义两个列表
featureList=[]#特征
labelList=[]#标签
for row in reader:
    #把label 存入list
    labelList.append(row[-1])#保存no or yes
    rowDict={}
    for i in range(1,len(row)-1):
        #建立一个数据字典
        rowDict[headers[i]]=row[i]
    #把数据字典存入list
    featureList.append(rowDict)
print(featureList)

把数据转化为0、1格式

#把数据转换成01表示
vec=DictVectorizer()#特征提取
x_data=vec.fit_transform(featureList).toarray()#转化为01形式
print('x_data:'+str(x_data))
#打印属性名称
print(vec.get_feature_names())
print("labelList:"+str(labelList))
#把标签转化为01表示
lb=LabelBinarizer()
y_data=lb.fit_transform(labelList)
print("y_data:"+str(y_data))

创建决策树模型

#创建决策树模型
model=tree.DecisionTreeClassifier(criterion='entropy')#默认基尼指数
#输入数据建立模型
model.fit(x_data,y_data)

测试和预测

x_test=x_data[0]
print('x_test:'+str(x_test))
predict=model.predict(x_test.reshape(1,-1))
print("predict:"+str(predict))

导出决策树

import graphviz
dot_data=tree.export_graphviz(model,
                             out_file=None,
                             feature_names=vec.get_feature_names(),
                             class_names=lb.classes_,
                             filled=True,
                             rounded=True,
                             special_characters=True)
graph=graphviz.Source(dot_data)
graph.render('computer')

结果如下所示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值