用python实现机器学习算法(一)---DesicionTree

来源:互联网 发布:知吾煮抗摔玻璃保鲜盒 编辑:程序博客网 时间:2024/05/16 00:35

机器学习算法(一)–DesicionTree

step 1:环境配置

  • 在Anaconda官网下载Anaconda,Anaconda利用工具/命令conda来进行package和environment的管理,并且已经包含了Python和相关的配套工具。

  • 下载后Anaconda配置环境变量,这个很简单不赘述了,没配过环境变量的可以自行百度。

  • 我使用的是PyCharm,建议新手使用PyCharm,下载安装都很简单,而且很小。


如果已经完成上述步骤就可以用python来写第一个程序了

print("Hello world!")

step 2:谈一谈机器学习的概念

  • 看看下面的词汇:
    训练集(training set/data)、测试集(testing set/data)、特征值(features)、特征向量(feature vector)、分类(classification)、回归(regression)、无监督学习、监督学习、半监督学习
    这些词汇都是机器学习中常用到的词汇。
  • 机器学习的步骤框架
    1.把数据拆分为训练集和测试集
    2.用训练集和训练集的特征向量来训练算法
    3.把学习过的算法运用在测试集上来评估算法

step 3:开始DesicionTree

  • 什么是DesicionTree 决策树算法
    决策树是类似流程图的树形结构:每个节点代表一个属性上的测试,每个分支代表一个属性的输出,每个叶节点代表一个类分布
    这里写图片描述

    上面的决策树是由下面的表生成的:
    这里写图片描述
    生成决策树的依据是信息熵

    • 熵(entropy)概念
      如何度量信息?
      香农提出了信息熵的概念,一条信息的信息量大小和它的不确定性有直 接关系,不确定性越大熵越大。
    • 熵的计算
      如果一条信息由32个关键词
      每一项的概率乘以概率的对数,再求和,最后取相反数,单位是比特:bits
      这里写图片描述

      这里写图片描述

  • 决策树归纳算法
    1.选择属性判断结点
    信息获取量(Information Gain): Gain(A) = Info(A) - Info_A(D)
    通过A来作为分类结点获取了多少信息。
    这里写图片描述
    这里写图片描述
    所以Gain(age) = Info(D) - Info_age(D) = 0.940 - 0.694 = 0.246 bits
    求得Gain(income) = 0.029 bits, Gain(student) = 0.151 bits,
    Gain(credit_rating) = 0.048
    2.按照信息增益最大来设置结点
    Gain(age) 最大,所以作为根节点
    这里写图片描述
    接下来重复。。。。。。

    当且仅当到达下列条件之一,递归划分停止
    a.给定结点的所有样例属于同一类,例如middle_age这一支class都为yes
    b.没有剩余属性可以进一步划分样例
    最后就是下面这个样子了
    这里写图片描述

step 4:用python实现

代码:

import csvfrom sklearn import preprocessingfrom sklearn import treefrom sklearn.feature_extraction import DictVectorizer# Read in the csv file and put features into list of dict and list of class labelallElectronicsData = open(r'AllElectronics.csv', 'rb')reader = csv.reader(allElectronicsData)headers = reader.next()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 featuresvec = DictVectorizer()dummyX = vec.fit_transform(featureList).toarray()print("dummyX: " + str(dummyX))print(vec.get_feature_names())print("labelList: " + str(labelList))# vectorize class labelslb = 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 modelwith 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 = oneRowXnewRowX[0] = 1newRowX[2] = 0print("newRowX: " + str(newRowX))predictedY = clf.predict(newRowX)print("predictedY: " + str(predictedY))

AllElectronics.csv文件内容:

RID,age,income,student,credit_rating,class_buys_computer1,youth,high,no,fair,no2,youth,high,no,excellent,no3,middle_aged,high,no,fair,yes4,senior,medium,no,fair,yes5,senior,low,yes,fair,yes6,senior,low,yes,excellent,no7,middle_aged,low,yes,excellent,yes8,youth,medium,no,fair,no9,youth,low,yes,fair,yes10,senior,medium,yes,fair,yes11,youth,medium,yes,excellent,yes12,middle_aged,medium,no,excellent,yes13,middle_aged,high,yes,fair,yes14,senior,medium,no,excellent,no

使用gvedit这个软件,可以将dot文件转换成树形图的pdf文件
如下图这样
这里写图片描述

阅读全文
0 0
原创粉丝点击