机器学习:决策树

1、理论知识html

一、基本流程python

  断定树/决策树 (decision tree) 是一类常见的机器学习方法。 
算法

  每一个内部结点表示在一个属性上的测试,每一个分支表明一个属性输出,而每一个树叶结点表明类或类分布。树的最顶层是根结点。决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的"分而治之" (divide-and-conquer)策略。 
数组

 

二、划分选择app

  在1948年,香农引入了信息熵,将其定义为离散随机事件出现的几率,一个系统越是有序,信息熵就越低,反之一个系统越是混乱,它的信息熵就越高。因此信息熵能够被认为是系统有序化程度的一个度量。机器学习

  假如一个随机变量X的取值为X={x1,x2,……,xn},每一变量的几率分别为{p1,p2,……,pn},那么X的信息熵定义为:ide

  信息增益是针对一个特征而言的,就是看一个特征t,系统有它和没有它时的信息量各是多少,二者的差值就是这个特征给系统带来的信息量,即信息增益。接下来,以一个属性不一样的人购买电脑的例子来讲明什么是信息增益。稍后,也会用Python代码实现此例的决策树算法。函数

  

  从上图能够看出,一共14组数据,在最后一列的数据中是购买电脑的与否,一共是9个购买,5个非购买。学习

 

  由此能够获得结果的信息熵为 :测试

 

  age分支有youth,middle_aged,senior,其信息熵为:

 

  所以age属性的信息增益为:

  

  相似地,咱们能够得出其它属性的信息增益:

  Gain(income) = 0.029, Gain(student) = 0.151, Gain(credit_rating)=0.048

  值得一提的是,咱们应该忽略编号这一属性,由于其产生了14个分支,每一个分支节点的纯度以达到最大,以其做为结点的决策树不具备泛化能力,没法进行有效预测。

  相比较,咱们就能够得出,age的信息增益最大,所以选择age为根结点,再选出其它的做为结点,能够画出一个决策树的图。

  

  在决策树的每个非叶子结点划分以前,先计算每个属性所带来的信息增益,选择最大信息增益的属性来划分,由于信息增益越大,区分样本的能力就越强,越具备表明性,很显然这是一种自顶向下的贪心策略。以上就是ID3算法的核心思想。显然,ID3算法是以信息增益为准则来选择划分属性。

 

三、剪枝处理

 

四、连续与缺失值

 

五、多变量决策树

 

2、代码

一、Python实现ID3算法,以上文购买电脑为例。

 

# sklearn 是传统机器学习的包
# python自带处理csv文件的库
from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import tree
from sklearn import preprocessing

# 读取csv文件数据,CSV是以逗号间隔的文本文件,excel默认保存为XLSX格式,包含文本、数值、公式、格式等,当不须要公式格式时,能够保存为CSV文件
allElectronicsData = open(r'AllElectronics.csv', 'rt')
reader = csv.reader(allElectronicsData)

# 读出第一行的内容,并打印观察
headers = next(reader)
print(headers)

# sklearn 只容许输入的内容是数值,因此咱们要把表格里的内容转换为数值,进而调用sklearn的包

# 创建两个列表以存储条件和结果
featureList = []
labelList = []

# labelList 里存放表格里的结果内容
# featureList 里存放表格里的条件属性,必须是以字典形式存储在列表中,这样才能够用DictVectorizer()函数,将列表中的字典转化成数值

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)
print(labelList)

# 类DictVectorizer可用于将表示为标准 Python dict对象列表的要素数组转换为scikit-learn估计量使用的NumPy/SciPy表示。
# 使用DictVectorizer里的fit_transform函数转换数值
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList).toarray()

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

lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY: " + str(dummyY))

# 使用决策树
# criterion='entropy' 此变量输入则表明决策树的算法是选取信息熵(ID3算法)
clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = clf.fit(dummyX, dummyY)
print("clf: " + str(clf))


# 新建doc文件,在其中显示决策树
with open("allElectronicInformationGainOri.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))

 

 

 

3、参考资料

一、《机器学习》——周志华老师

二、http://www.cnblogs.com/starfire86/p/5749328.html    内含C++代码实现决策树

 

ps:待更新。

     本人初学者,有错误欢迎指出。感谢。

相关文章
相关标签/搜索