• 机器学习二——分类算法--决策树DecisionTree


    机器学习算法评估标准:准确率,速度,强壮性(噪音影响较小),可规模性,可解释性。

    1、决策树  Decision Tree:决策树是一个类似于流程图的树结构,其中每个内部节点表示在一个属性上的测试,每一个分支代表一个属性输出,每一个树叶节点代表类(label)或类的分布。树的最顶层是根节点。

                                                                                 

    2、信息熵:发生一件事情的不确定性越大,我们需要的信息量越大,信息熵也就越大。信息量的度量就等于不确定性的多少。

        用bit表示信息量的多少H = -∑P(x)logP(x)

    决策树归纳算法通过信息熵计算选择属性判断节点:

        信息获取量(Information Gain)   Gain(A)=Info(D)-Info_A(D)

        通过属性A获取的信息量=没有属性A时所需信息量-有属性A时所需信息量

        

          

          

    通过比较每一个节点的Gain信息获取量,来确定哪个属性作为判断节点。

    3、算法 

       一、树以代表训练样本的单个节点开始

      二、如果样本都在同一个类,则该节点成为树叶。

      三、否则,算法使用基于熵的度量作为启发信息,选择能够将样本更好的进行分类的属性,该属性成为节点的“测试”或“判定”属性。

        1、所有的属性都是离散的,连续属性必须离散化。

        2、对测试属性的每个已知值,创建一个分支,并据此划分样本。

        3、算法使用同样的过程,递归形成每个划分上的样本判定树。

          递归停止条件:a、给定节点的所有样本属于同一类。b、没有剩余属性来进一步划分样本。(多数表决)

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

    缺点:处理连续变量不好,类别较多时错误增加的比较快,可规模性一般。

    代码实例

    from sklearn.feature_extraction import DictVectorizer
    from sklearn import preprocessing
    from sklearn import tree
    import csv
    AllElectronics=open('D:daachengPythonPythonCodemachineLearningAllElectronics.csv','rt')#打开csv文件
    readers=csv.reader(AllElectronics)
    headers=next(readers)#表头 ['RID', 'age', 'income', 'student', 'credit_rating', 'class_buys_computer']
    featureList=[]#特征集合
    labelList=[]#标签集合
    for row in readers:
    rowDict={} #每一行数据以集合的形式存储,最后把这些集合存储在列表中
    labelList.append(row[len(row)-1])
    for i in range(1,len(row)-1):
    #print(headers[i])
    #print(row[i])
    rowDict[headers[i]]=row[i]
    featureList.append(rowDict)
    vec=DictVectorizer()
    dummyX=vec.fit_transform(featureList).toarray()#转换,把特征转换成列表
    #names=vec.get_feature_names()
    #print(names)
    lb=preprocessing.LabelBinarizer()
    dummyY=lb.fit_transform(labelList)#对标签进行转换
    #dummyY
    clf=tree.DecisionTreeClassifier(criterion='entropy')#指定通过信息熵选择节点
    clf=clf.fit(dummyX,dummyY)#训练学习
    #制造一个新数据来进行预测
    oneRowX=dummyX[0,:]
    newRowX=[]
    newRowX.append(oneRowX)
    newRowX[0][0]=1
    newRowX[0][1]=0
    #print(newRowX[0])
    #predictY1=clf.predict(oneRowX)
    predictY2=clf.predict(newRowX)#需要传入一个二维数组
    #print(predictY1)
    print(predictY2)
  • 相关阅读:
    每日总结
    SQLServer2008/2005 生成数据字典SQL语句
    python一些utils
    python快速展示图片
    面向对象编程
    Arrays类讲解 冒泡排序
    方法的定义、方法的调用及方法的重载
    .Net6 连接 redis
    Stream流的基本使用
    uniapp 页面之前通讯传值 义美
  • 原文地址:https://www.cnblogs.com/daacheng/p/8076299.html
Copyright © 2020-2023  润新知