决策树系列
程序员文章站
2024-02-16 13:21:10
...
(三)决策树实战
- sklearn中训练决策树的默认算法是CART,用CART决策树的好处是可以用它来进行回归和分类处理,
- 不过这里我们只进行分类。
一. sklearn决策树参数
-
一个模型中很重要的一步是调参。
-
sklearn中,模型的参数是通过方法参数来决定的,以下给出sklearn中,决策树的参数:
-
通常参数都会有默认值,我们只需要调整其中较为重要的几个参数就行。
-
较为重要的参数有:
-
criterion:用以设置用信息熵还是基尼系数计算。
-
splitter:指定分支模式
-
max_depth:最大深度,防止过拟
-
min_samples_leaf:限定每个节点分枝后子节点至少有多少个数据,否则就不分枝
二. sklearn决策树实战
2.1 准备数据及读取
- 赖床特征,
- 存成 csv 文件
spring,no,breeze,yes
winter,no,no wind,yes
autumn,yes,breeze,yes
winter,no,no wind,yes
summer,no,breeze,yes
winter,yes,breeze,yes
winter,no,gale,yes
winter,no,no wind,yes
spring,yes,no wind,no
summer,yes,gale,no
summer,no,gale,no
autumn,yes,breeze,no
2.2 决策树的特征向量化DictVectorizer
- sklearn的DictVectorizer能对字典向量化。
- 季节这个属性有[春,夏,秋,冬]四个可选,
- 如果是春季,就用[1,0,0,0],夏季用[0,1,0,0]表示。
- 调用DictVectorizer它会将这些属性打乱,
- 不会按照我们的思路来运行,
- 但我们也可以一个方法查看
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn import tree
from sklearn.model_selection import train_test_split
#header = None 表示不将首行作为列
data = pd.read_csv('data/laic.csv',header =None)
#指定列
data.columns = ['season','after 8','wind','lay bed']
#sparse=False意思是不产生稀疏矩阵
vec=DictVectorizer(sparse=False)
#先用 pandas 对每行生成字典,然后进行向量化
feature = data[['season','after 8','wind']]
X_train = vec.fit_transform(feature.to_dict(orient='record'))
#打印各个变量
print('show feature\n',feature)
print('show vector\n',X_train)
print('show vector name\n',vec.get_feature_names())
show feature
season after 8 wind
0 spring no breeze
1 winter no no wind
2 autumn yes breeze
3 winter no no wind
4 summer no breeze
5 winter yes breeze
6 winter no gale
7 winter no no wind
8 spring yes no wind
9 summer yes gale
10 summer no gale
11 autumn yes breeze
show vector
[[1. 0. 0. 1. 0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0. 1. 0. 0. 1.]
[0. 1. 1. 0. 0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0. 1. 0. 0. 1.]
[1. 0. 0. 0. 1. 0. 1. 0. 0.]
[0. 1. 0. 0. 0. 1. 1. 0. 0.]
[1. 0. 0. 0. 0. 1. 0. 1. 0.]
[1. 0. 0. 0. 0. 1. 0. 0. 1.]
[0. 1. 0. 1. 0. 0. 0. 0. 1.]
[0. 1. 0. 0. 1. 0. 0. 1. 0.]
[1. 0. 0. 0. 1. 0. 0. 1. 0.]
[0. 1. 1. 0. 0. 0. 1. 0. 0.]]
show vector name
['after 8=no', 'after 8=yes', 'season=autumn', 'season=spring', 'season=summer', 'season=winter', 'wind=breeze', 'wind=gale', 'wind=no wind']
- 通过DictVectorizer,就能把字符型的数据,转化成0 1矩阵,方便后面运算。
- 其实就是one-hot编码。
2.4 决策树训练
- 向量化时,属性都被打乱了,但可通过get_feature_names()查看对应的属性值。
- 有数据后,就可以来训练一颗决策树了,用sklearn很方便,只需要很少的代码
#划分成训练集,交叉集,验证集,不过这里我们数据量不够大,没必要
#train_x, test_x, train_y, test_y = train_test_split(X_train, Y_train, test_size = 0.3)
#训练决策树
clf = tree.DecisionTreeClassifier(criterion='gini')
clf.fit(X_train,Y_train)
#保存成 dot 文件,后面可以用 dot out.dot -T pdf -o out.pdf 转换成图片
with open("out.dot", 'w') as f :
f = tree.export_graphviz(clf, out_file = f,
feature_names = vec.get_feature_names())
here
参考
- https://www.cnblogs.com/listenfwind/p/11310924.html
上一篇: vue项目引入字体.ttf