欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

决策树系列

程序员文章站 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
相关标签: python