python3.5《机器学习实战》学习笔记(五):决策树算法实战之预测隐形眼镜类型

阅读: 评论:0

python3.5《机器学习实战》学习笔记(五):决策树算法实战之预测隐形眼镜
类型
⼀、使⽤决策树预测隐形眼镜类型
在上⼀篇⽂章中,我们学习了决策树算法,接下来,让我们通过⼀个例⼦讲解决策树如何预测患者需要佩戴的隐形眼镜类型。
毛一丁隐形眼镜数据集是⾮常著名的数据集,它包含了很多患者眼部状况的观察条件以及医⽣推荐的隐形眼镜类型。隐形眼镜类型包括硬材质(hard)、软材质(soft)以及不适合佩戴隐形眼镜(no lenses)。数据来源于UCI数据库,数据存储在⽂本⽂件中,数据集下载地址: 数据集信息:
* 特征有四个:age(年龄)、prescript(症状)、astigmatic(是否散光)、tearRate(眼泪数量)
* 隐形眼镜类别有三类(最后⼀列):硬材质(hard)、软材质(soft)、不适合佩戴隐形眼镜(no lenses)
在上篇⽂章的代码基本上,只需要在主函数改为如下代码即可。
运⾏结果:
⼆、sklearn 实战-预测隐形眼镜类型
if  __name__ == '__main__':
fr = open('')
lenses = [inst.strip().split('\t') for  inst in  fr.readlines()]
print(lenses)
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']
myTree_lenses = createTree(lenses, lensesLabels)
createPlot(myTree_lenses)
2-1 基本参数
参数说明如下:(参数说明⽹上有⼈已经翻译过了,这⾥就直接拿过来)
criterion:特征选择标准,可选参数,默认是gini,可以设置为entropy。gini是基尼不纯度,是将来⾃集合的某种结果随机应⽤于某⼀数据项的预期误差率,是⼀种基于统计的思想。entropy是⾹农熵,也就是上篇⽂章讲过的内容,是⼀种基于信息论的思想。
合肥五里墩立交桥Sklearn把gini设为默认参数,应该也是做了相应的斟酌的,精度也许更⾼些?ID3算法使⽤的是entropy,CART算法使⽤的则是gini。
splitter:特征划分点选择标准,可选参数,默认是best,可以设置为random。每个结点的选择策略。best参数是根据算法选择最佳的切分特征,例如gini、entropy。random随机的在部分划分点中局部最优的划分点。默认的”best”适合样本量不⼤的时候,⽽如果样本数据量⾮常⼤,此时决策树构建推荐”random”。
max_features:划分时考虑的最⼤特征数,可选参数,默认是None。寻最佳切分时考虑的最⼤特征数(n_features为总共的特征数),有如下6种情况:
如果max_features是整型的数,则考虑max_features个特征;
如果max_features是浮点型的数,则考虑int(max_features * n_features)个特征;
滑雪产业发展趋势如果max_features设为auto,那么max_features = sqrt(n_features);
如果max_features设为sqrt,那么max_featrues = sqrt(n_features),跟auto⼀样;
如果max_features设为log2,那么max_features = log2(n_features);
如果max_features设为None,那么max_features = n_features,也就是所有特征都⽤。
⼀般来说,如果样本特征数不多,⽐如⼩于50,我们⽤默认的”None”就可以了,如果特征数⾮常多,我们可以灵活使⽤刚才描述的其他取值来控制划分时考虑的最⼤特征数,以控制决策树的⽣成时间。
max_depth:决策树最⼤深,可选参数,默认是None。这个参数是这是树的层数的。层数的概念就是,⽐如在贷款的例⼦中,决策树的层数是2层。如果这个参数设置为None,那么决策树在建⽴⼦树
的时候不会限制⼦树的深度。⼀般来说,数据少或者特征少的时候可以不管这个值。或者如果设置了min_samples_slipt参数,那么直到少于min_smaples_split个样本为⽌。如果模型样本量多,特征也多的情况下,推荐限制这个最⼤深度,具体的取值取决于数据的分布。常⽤的可以取值10-100之间。
min_samples_split:内部节点再划分所需最⼩样本数,可选参数,默认是2。这个值限制了⼦树继续划分的条件。如果
min_samples_split为整数,那么在切分内部结点的时候,min_samples_split作为最⼩的样本数,也就是说,如果样本已经少于min_samples_split个样本,则停⽌继续切分。如果min_samples_split为浮点数,那么min_samples_split就是⼀个百分
⽐,ceil(min_samples_split * n_samples),数是向上取整的。如果样本量不⼤,不需要管这个值。如果样本量数量级⾮常⼤,则推荐增⼤这个值。
min_weight_fraction_leaf:叶⼦节点最⼩的样本权重和,可选参数,默认是0。这个值限制了叶⼦节点所有样本权重和的最⼩值,如果⼩于这个值,则会和兄弟节点⼀起被剪枝。⼀般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很⼤,就会引⼊样本权重,这时我们就要注意这个值了。
max_leaf_nodes:最⼤叶⼦节点数,可选参数,默认是None。通过限制最⼤叶⼦节点数,可以防⽌过拟合。如果加了限制,算法会建⽴在最⼤叶⼦节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。
class_weight:类别权重,可选参数,默认是None,也可以字典、字典列表、balanced。指定样本各类别的的权重,主要是为了防⽌训练集某些类别的样本过多,导致训练的决策树过于偏向这些类别。类别的权重可以通过{class_label:weight}这样的格式给出,这⾥可以⾃⼰指定各个样本的权重,或者⽤balanced,如果使⽤balanced,则算法会⾃⼰计算权重,样本量少的类别所对应的样本权重会⾼。当然,如果你的样本类别分布没有明显的偏倚,则可以不管这个参数,选择默认的None。
random_state:可选参数,默认是None。随机数种⼦。如果是证书,那么random_state会作为随机数⽣成器的随机数种⼦。随机数种⼦,如果没有设置随机数,随机出来的数与当前系统时间有关,每个时刻都是不同的。如果设置了随机数种⼦,那么相同随机数种⼦,不同时刻产⽣的随机数也是相同的。如果是RandomState instance,那么random_state是随机数⽣成器。如果为None,则随机数⽣成器使⽤np.random。
min_impurity_split:节点划分最⼩不纯度,可选参数,默认是1e-7。这是个阈值,这个值限制了决策树的增长,如果某节点的不纯度(基尼系数,信息增益,均⽅差,绝对差)⼩于这个阈值,则该节点不再⽣成⼦节点。即为叶⼦节点 。
presort:数据是否预排序,可选参数,默认为False,这个值是布尔值,默认是False不排序。⼀般来说,如果样本量少或者限制了⼀个深度很⼩的决策树,设置为true可以让划分点选择更加快,决策树建⽴的更加快。如果样本量太⼤的话,反⽽没有什么好处。问题是样本量少的时候,我速度本来就不慢。所以这个值⼀般懒得理它就可以了。
除了这些参数要注意以外,其他在调参时的注意点有:当样本数量少但是样本特征⾮常多的时候,决策树很容易过拟合,⼀般来说,样本数⽐特征数多⼀些会⽐较容易建⽴健壮的模型
如果样本数量少但是样本特征⾮常多,在拟合决策树模型前,推荐先做维度规约,⽐如主成分分析(PCA),特征选择(Losso)或者独⽴成分分析(ICA)。这样特征的维度会⼤⼤减⼩。再来拟合决策树模型效果会好。
推荐多⽤决策树的可视化,同时先限制决策树的深度,这样可以先观察下⽣成的决策树⾥数据的初步拟合情况,然后再决定是否要增加深度。
在训练模型时,注意观察样本的类别情况(主要指分类树),如果类别分布⾮常不均匀,就要考虑⽤class_weight来限制模型过于偏向样本多的类别。决策树的数组使⽤的是numpy的float32类型,如果训练数据不是这样的格式,算法会先做copy再运⾏。
如果输⼊的样本矩阵是稀疏的,推荐在拟合前调⽤csc_matrix稀疏化,在预测前调⽤csr_matrix稀疏化。
2-2 加载数据
pandas是⼀个⾮常强⼤的库,⽤它处理CSV、txt数据⽂件很⽅便。接下来我们使⽤pandas加载隐形眼镜⽂件,代码如下:
查看lenses变量:
2-3 数据处理
了解了上⾯的参数可以知道,sklearn函数fit时需要数据X(也即是特征数据)满⾜numpy的float32类型。但是隐形眼镜的特征数据是各种英⽂单词,是字符串。格式不对,所以,在使⽤fit()函数之前,我们需要对数据集进⾏编码,这⾥可以使⽤两种⽅法:
import  pandas as  pd
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate','class']
#特征标签+类别标签
feature = ['age', 'prescript', 'astigmatic', 'tearRate']#特征标签东博神相
lenses = pd.read_table('',names=lensesLabels, sep='\t')
#names :设置列名 ,sep:分隔的正则表达式,'/t'表⽰以tab 键进⾏分割
:将字符串转换为增量值
:使⽤One-of-K算法将字符串转换为整数使⽤LabelEncoder编码结果:
滇西1994
2-3 建⽴决策树
代码如下:
'''
Created on Nov 10, 2017
Decision Tree Source Code for Machine Learning in Action Ch. 3
author: weepon
blog: blog.csdn/u013829973
Modify:
2017-11-10
'''
from sklearn.preprocessing import LabelEncoder
from sklearn import tree
import pandas as pd
lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate','class']#特征标签+类别标签feature = ['age', 'prescript', 'astigmatic', 'tearRate']#特征标签
lenses = pd.read_table('',names=lensesLabels, sep='\t')
#names:设置列名,sep:分隔的正则表达式,'/t'表⽰以tab键进⾏分割
lenses_feature = lenses[feature]                        # 特征数据
le = LabelEncoder()
#创建LabelEncoder()对象,⽤于序列化
for col in lumns:                      #分列序列化
lenses_feature[col] = le.fit_transform(lenses_feature[col])
clf = tree.DecisionTreeClassifier(max_depth = 4)
#创建DecisionTreeClassifier()类波特五力分析
model = clf.fit(lenses_feature.values, lenses['class'])    #使⽤数据,构建决策树
print(model)                                            # 查看当前模型参数
#预测
pre = model.predict([[0,1,0,1]])
print('预测结果为',pre)
运⾏结果:

本文发布于:2023-07-12 02:51:54,感谢您对本站的认可!

本文链接:https://patent.en369.cn/xueshu/204461.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:决策树   样本   数据   参数   特征   类别   限制
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图