第一章 决策树算法及其在商品购买行为预测的应用
本文主要介绍决策树的过程:
目录
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输出
结果输出为: