“抽丝剥茧”,层层下分——机器学习基本算法之决策树
本文作者:王 歌
文字编辑:孙晓玲
写在前面:
在《“物以类聚”、“近朱者赤”——机器学习初探之KNN》中我们一起了解了机器学习的基本概念以及KNN算法的思想,并将该算法应用到了一个小例子中,我们知道KNN算法并没有显式训练过程,因而存储训练集进行判断时会占用很大内存,尽管这样训练时间为0,但我们还是想改变一下,毕竟在实际中我们的数据不止150个鸢尾花。今天我们要学习的决策树算法则不同,虽然都属于有监督学习,都可以处理分类和回归的问题,但这一算法不仅可以通过训练建立模型,而且得到的模型很直观,下面就让我们一起来看看它到底是怎么进行划分的。
算 法 介 绍
信息增益越大,利用A属性划分后纯度的提高程度越大。二是要注意一旦按某特征划分数据后,该特征将不会在后面的算法中再次作为划分的结点出现,并且生成的每个结点可以有多个分支,同时更倾向于选取取值较多的属性作为划分结点。为克服这一缺点,产生了C4.5算法。
该算法在ID3的基础上,使用信息增益率:
(3)CART算法
在训练决策树的过程中,很可能因为训练样本中的噪声数据,或者样本本身存在总体所不具备的特征,这时可能会影响到决策树的分支,发生过拟合的现象。所以在使用这一算法时,通常会对决策树进行“剪枝”,包括预剪枝和后剪枝两种。预剪枝就是在每个结点划分前先对其进行统计显著性、信息增益等指标估计,若划分后这些指标值低于预先设定的阈值,则停止划分,但通常阈值的选取较为困难,也容易发生欠拟合的情况;后剪枝则是在生成决策树后,自下而上对每个非叶结点进行检查,若将该非叶结点换成叶结点后的性能优于非叶结点,则剪掉这一枝,并将其改为叶结点,但这样做要比预剪枝花费的时间更长并且仍然有发生过拟合的风险。
算 法 实 例
在了解了这一算法的基本理论以后,我们来看看在sklearn库中具体是如何操作的。与上节相同,我们所使用的数据依然是sklearn中自带的iris鸢尾花数据,并且以分类问题为例,回归可自行尝试。首先我们导入所使用的库和数据,程序如下:
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
iris_sample = load_iris() # 导入数据集
这里我们首先介绍一下所用的分类器DecisionTreeClassifier里面的参数,其基本语法如下:
x_train, x_test, y_train, y_test = train_test_split(
iris_sample.data, iris_sample.target, test_size=0.25, random_state=123)
treeclf = DecisionTreeClassifier() 得到分类器treeclf
treeclf.fit(x_train, y_train) # 拟合决策树
y_test_pre = treeclf.predict(x_test) #预测
score = treeclf.score(x_test, y_test) #评估预测结果
print('测试集预测结果为:', y_test_pre)
print('测试集正确结果为:', y_test)
print('测试集准确度为:', score)
运行结果如下:
可以看到准确率为92.11%,有三个样本分类错误。大家也可通过自己的需要更改上面的参数来达到自己的要求,由于篇幅限制小编就不再一一演示了。同时我们在拟合了决策树后也可使用graphviz生成可视化图形,程序如下:
from sklearn import tree # 需要导入的包
with open('../iris_tree.dot', 'w') as f:
f=tree.export_graphviz(treeclf, out_file=f)
对于这个文件我们可以安装graphviz后可查看树的结构,大家来试试吧。
NBA球员薪资分析——基于随机森林算法(二)
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。