sklearn的决策树

1.10. Decision Trees(scikit-learn 官网)
sklearn包学习
Sklearn包含的常用算法
Graphviz

Notes

  • scikit-learn 模块中有许多已经写好的机器学习的算法,这里以其中的决策树为例,记录一下它的简单用法(调接口)
  • 要涉及到(包括以后才涉及到的)模块有sklearnNumPySciPymatplotlib
  • 还有一个工具 Graphviz,用于可视化,下载之后把它的bin目录加到环境变量path
  • 实验大概是根据 年龄、收入、是否学生、信用度 来预测 是否会买电脑

Sample Space

实验中用到的数据,直接从 .csv 文件中复制出来的

RID,age,income,student,credit_rating,Class_buy_computer
1,youth,high,no,fair,no
2,youth,high,no,excellent,no
3,middle_aged,high,no,fair,yes
4,senior,medium,no,fair,yes
5,senior,low,yes,fair,yes
6,senior,low,yes,excellent,no
7,middle_aged,low,yes,excellent,yes
8,youth,medium,no,fair,no
9,youth,low,yes,fair,yes
10,senior,medium,yes,fair,yes
11,youth,medium,yes,excellent,yes
12,middle_aged,medium,no,excellent,yes
13,middle_aged,high,yes,fair,yes
14,senior,medium,no,excellent,no

Preprocess

读入文件后的内容是字符串的形式,而 sklearn 对输入格式有要求,需要做预处理将其转换成数字。DictVectorizerdict转换成数字式的向量,LabelBinarizer将 label 编码成 0/1 的形式。
以上面的数据为例。对于每一条记录,将属性值和 label 分开装,属性值部分处理成dict的形式,而 label 用 list 装。例如,对于第一条记录,RID一列没用,忽略,其它属性就被处理成:{"age" : "youth", "income" : "high", "student" : "no", "credit_rating" : "fair"}。而对于 label,是将全部 14 条记录的 label 装到一个 list 中,即:["no", "no", "yes", … ,"no"]
DictVectorizer的处理就是一个离散化的过程,对于每一个属性,一共有几个值就被拓展成几个 0/1,最后一条记录会变成一个 0/1 的向量。如age一列,因为共有youthmiddle_agedsenior三种,所以age就用三个数一起表示,比如按照youth、middle_aged、senior的顺序,对于第一条记录,是youth,所以对应的就是1 0 0。其它的属性也类似处理。如果向量按youth, middle_aged, senior, high, low, no, yes, fair, excellent的顺序,那第一条记录就被离散化成1 0 0 1 0 1 0 1 0这样的向量。

Code

# -*- encoding: utf-8 -*-
# Decision Tree

# 读取 .csv 文件
import csv
# 将 dict 转化成向量
from sklearn.feature_extraction import DictVectorizer
# 将二分类的 label 编码成 0/1
from sklearn.preprocessing import LabelBinarizer
# 将数据分成训练集和测试集
from sklearn.cross_validation import train_test_split
# 决策树
from sklearn import tree

# 打开数据文件
dtfile = open("tree.csv")
# reader 是个迭代器,以行遍历文件
reader = csv.reader(dtfile)
# 第一行是标题
header = next(reader)
print("\nheader: ", header)

ftlist = [] # feature list
labelist = [] # label list

for row in reader:
    labelist.append(row[-1])
    rowdict = {}
    for i in range(1, len(row) - 1) :
        rowdict[header[i]] = row[i]
    ftlist.append(rowdict)

dtfile.close()
print("\nfeature list: ", ftlist)
print("\nlabel list: ", labelist)
# 离散化属性值
vec = DictVectorizer()
dummyX = vec.fit_transform(ftlist).toarray()
print("\ndummyX: ", dummyX)
# 离散化 label
lb = LabelBinarizer()
dummyY = lb.fit_transform(labelist)
print("\ndummyY: ", dummyY.flatten())

# 划分训练集、测试集,测试集占 30%
train_x, test_x, train_y, test_y = \
        train_test_split(dummyX, dummyY, test_size = 0.3)

# entropy -> ID3
clf = tree.DecisionTreeClassifier(criterion = "entropy")
# 训练模型
clf = clf.fit(train_x, train_y)
print('\n', str(clf))

# 预测结果
pd = clf.predict(test_x)
print("\npredict: ", str(pd))
# 真实 label
test_y = test_y.flatten() # 压成一维
print("real: ", test_y)
# 统计
bingo = 0
total = len(test_x)
for i in range(0, total) :
    if pd[i] == test_y[i] :
        bingo = bingo + 1
# 准确率
print("accuracy: ", float(bingo) / total)

# 将决策树到出到一个 .dot 文件中
# 之后给 Graphviz 用来画图
with open("out.dot", 'w') as f :
    f = tree.export_graphviz(clf, out_file = f,
            feature_names = vec.get_feature_names())

Visualize

代码最后生成了一个out.dot的文件,启动 cmd 切换到该文件所在目录,执行dot out.dot -T pdf -o out.pdf就可以画出那可决策树。(dot在 Graphviz 的 bin 目录下,所以把它加进path,可用dot --help查看帮助)
画出来效果如下:
decision tree

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值