Sklearn库中的决策树有两种:分类决策树、回归决策树。下面我们通过具体的案例学习如何使用这两种决策树。
分类决策树
分类决策树(DecisionTreeClassifier)就是通过对训练集的训练,然后对测试集中的数据做出正确的分类。
这个表格反映了银行通过对一个人的评判,然后决定是否给予其贷款
序号 | 年龄 | 有工作 | 有自己的房子 | 信贷情况 | 类别 |
---|---|---|---|---|---|
0 | 青年 | 否 | 否 | 一般 | 否 |
1 | 青年 | 否 | 否 | 好 | 否 |
2 | 青年 | 是 | 否 | 好 | 是 |
3 | 青年 | 是 | 是 | 一般 | 是 |
4 | 青年 | 否 | 否 | 一般 | 否 |
5 | 中年 | 否 | 否 | 一般 | 否 |
6 | 中年 | 否 | 否 | 好 | 否 |
7 | 中年 | 是 | 是 | 好 | 是 |
8 | 中年 | 否 | 是 | 非常好 | 是 |
9 | 中年 | 否 | 是 | 非常好 | 是 |
10 | 老年 | 否 | 是 | 非常好 | 是 |
11 | 老年 | 否 | 是 | 好 | 是 |
12 | 老年 | 是 | 否 | 好 | 是 |
13 | 老年 | 是 | 否 | 非常好 | 是 |
14 | 老年 | 否 | 否 | 一般 | 否 |
我们通过对这个数据集的训练,然后预测一个人是否会得到银行的贷款
from sklearn.tree import DecisionTreeClassifier
import graphviz
from sklearn import tree
'''
function : 使用决策树分类器训练训练集,然后使用测试集测试训练效果
author : lemon
'''
'''
重要方法:
1、fit(X,Y)
X : 训练集数据
Y : 训练集数据对应的目标值(类标签),为整数或字符串
2、predict(X)
X : 测试集样本
return : 预测的类或预测值
3、predict_proba(X)
X : 测试集样本
return : 预测为每个类别的概率
4、decision_path(X)
X : 测试集样本
return : 返回树中决策路径,非0元素表示样本通过节点
'''
# 加载数据集
def loadDataSet():
data = [
[0, 0, 0, 0],
[0, 0, 0, 1],
[0, 1, 0, 1],
[0, 1, 1, 0],
[0, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 1],
[1, 1, 1, 1],
[1, 0, 1, 2],
[1, 0, 1, 2],
[2, 0, 1, 2],
[2, 0, 1, 1],
[2, 1, 0, 1],
[2, 1, 0, 2],
[2, 0, 0, 0],
]
target = ['no','no','yes','yes','no','no','no','yes','yes','yes','yes','yes','yes','yes','no']
return data,target
if __name__ == '__main__':
data,target = loadDataSet()
clf = DecisionTreeClassifier()
# 根据训练集构建决策分类器
clf.fit(data,target)
# 需要预测的变量
test_data = [[0,1,0,1],[1,1,1,1],[0,0,0,0]]
# 导出决策树的操作
dot_data = tree.export_graphviz(clf)
graph = graphviz.Source(dot_data)
graph.render('tree')
# result 预测结果
result = clf.predict(test_data)
print('预测结果')
print(result)
# chance 预测为每个类别的概率
chance = clf.predict_proba(test_data)
print('预测为每个类别的概率')
print(chance)
预测结果
预测结果
['yes' 'yes' 'no']
预测为每个类别的概率
[[0. 1.]
[0. 1.]
[1. 0.]]
回归决策树
回归决策树(DecisionTreeRegressor)是通过对数据的拟合,然后预测测试数据的值。
下面我们通过对boston数据使用决策树模型,预测新数据测值。
from sklearn.datasets import load_boston
from sklearn.tree import DecisionTreeRegressor
import time
import numpy as np
'''
function :
author :
'''
'''
重要方法:
1、fit(X,Y)
X : 训练集样本
Y : 目标值(实数)
2、predict(X)
X : 测试集样本
return : 基于X的预测值
3、score(X,y)
X : 测试样本
y : X对应的真值
'''
# 加载数据
boston = load_boston()
# 将数据分为训练集和测试集两部分
train_data = boston.data[:400:]
train_target = boston.target[:400:]
test_data = boston.data[400::]
test_target = boston.target[400::]
regressor = DecisionTreeRegressor(random_state=0)
print(f"{time.strftime('%Y-%m-%d %H:%M:%S')}: begin training...")
regressor.fit(train_data,train_target)
# result 预测的值
print(f"{time.strftime('%Y-%m-%d %H:%M:%S')}: begin testing...")
result = regressor.predict(test_data)
MSE = ((np.array([result]) - np.array(test_target))**2)/len(test_target)
print('MSE = '+str(MSE.sum().round(3)))
预测结果
我们将数据分为了两部分:训练集和测试集,然后观察模型对测试集的预测情况:
2019-02-20 11:41:22: begin training...
2019-02-20 11:41:22: begin testing...
MSE = 45.055
得到模型的均方误差MSE=45.055,由于数据集不大,我们也没有进行特征选择,所以均方误差有点大。这里我们仅仅是展示一下如何使用决策树模型进行回归,相应的特征选择还需要根据具体数据集来分析。