第1章 决策树算法及其在商品购买行为预测的应用

本文主要介绍决策树的过程:

目录

1.决策树

2.决策树的构建

2.1信息熵

2.2节点构建

2.3决策树的优缺点

3.决策树的编程实现。

3.1 Python编码实现

3.2输出


1.决策树

决策树一般都是自上而下的来生成的。每个决策事件都可能引出两个或多个事件,导致不同的结果,把这种决策分支画成图形很像一棵树的枝干,故称决策树。

基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处熵值为0(叶节点中的实例都属于一类)。

2.决策树的构建

2.1信息熵

 在决策树构建的过程中,我们需要一个衡量标准来确定每次数据划分所带来的收益,这个标准就是信息熵,以0-1二分类问题为例,衡量一个节点的信息熵公式如下:

信息熵越大代表信息越抽象,决策树中节点信息熵规则为:Entropy(parent)> Entropy(son)> Entropy(grandson)> ...... > 0

2.2节点构建

杜撰了一批数据集,用于具体构建决策树:

决策树中常用ID3归纳算法构建节点,信息获取量过程:Gain(A) = Info(D) - Info_A(D)

通过购买结果来作为分类,看获取了多少信息量。

故:Gain(年龄) = Info(D) - Info_年龄(D) = 0.94 - 0.69 = 0.25bits

类似地,可以计算出Gain(收入) = 0.03 ,Gain(是否学生) = 0.15,Gain(信用) = 0.05

ID3算法归纳认为,选择年龄作为归纳树的父节点。

父节点的分裂结果为:

对于购买结果为no的情况可以重复上述运算过程,完成一棵完整决策树的构建。

2.3决策树的优缺点

决策树的优点:直观,便于理解,小规模数据集有效;

决策树的缺点:处理连续变量不好,类别较多时,错误增加的比较快。

3.决策树的编程实现。

3.1 Python编码实现

用sklearn实现决策树,代码如下:

from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import tree
from sklearn import preprocessing
from sklearn.externals.six import StringIO

# Read in the csv file and put features into list of dict and list of class label
allElectronicsData = open(r'train_set.path', 'rt')
reader = csv.reader(allElectronicsData)
headers = next(reader)

print(headers)

featureList = []
labelList = []

for row in reader:
    labelList.append(row[len(row)-1])
    rowDict = {}
    for i in range(1, len(row)-1):
        rowDict[headers[i]] = row[i]
    featureList.append(rowDict)

print(featureList)

# Vetorize features
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList) .toarray()

print("dummyX: " + str(dummyX))
print(vec.get_feature_names())

print("labelList: " + str(labelList))

# vectorize class labels
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY: " + str(dummyY))

# Using decision tree for classification
# clf = tree.DecisionTreeClassifier()
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dummyX, dummyY)
print("clf: " + str(clf))


# Visualize model
with open("Dtree.dot", 'w') as f:
    f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file=f)

oneRowX = dummyX[0, :]
print("oneRowX: " + str(oneRowX))

newRowX = oneRowX
newRowX[0] = 1
newRowX[2] = 0
print("newRowX: " + str(newRowX))

predictedY = clf.predict(newRowX)
print("predictedY: " + str(predictedY))

3.2输出

结果输出为:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值