python基礎學習——第四天(決策樹)

1.列表生成式:res=[x*x for x in range(5)]
2.匿名函數:
與普通函數的區別

#普通函數
1. def func(x,y):
       return x+y
#匿名函數
2. lambda x,y: x+y

3.決策樹:
  1.基本算法是貪心(也就是每次取局部最優)
  2.在其生成過程中,分割方法即屬性選擇度量是關鍵。通過屬性選擇度量,選擇出最好的將樣本分類的屬性。
  3.根據分割方法的不同,決策樹可以分爲兩類:基於信息論的方法(較有代表性的是ID3、C4.5算法等)和最小GINI指標方法(常用的有CART、SLIQ及SPRINT算法等)。
4.決策樹的結構

這裏寫圖片描述
5.決策樹的基本算法(ID3):
  輸入:訓練樣本
  輸出:決策樹
  什麼是信息熵?
  根據香農(Shannon)給出的信息熵公式,對於任意一個隨機變量X,它的信息熵定義如下,單位爲比特(bit):
  用通俗的話來說:每種可能出現的情況概率乘以該概率的對數(一般以2爲底),依次求和,最後取反
這裏寫圖片描述

  處理流程:
  1.得到結構化的數據集
  2.計算在當前數據集中哪個屬性所對應的信息增益最大
    2.1對該數據集未進行屬性劃分前計算(基)信息熵
    2.2對該數據集按某個屬性劃分後計算劃分後的信息熵
    2.3這個屬性所對應的信息增益 就是未劃分屬性的信息熵-劃分屬性的信息熵
    2.4選擇信息增益最大的那個屬性作爲此次劃分的屬性
  3.在數據集中把已經劃分的屬性列去除
  4.遞歸往下進行構造

6.練習

'''
1.讀取test2.csv文件中的內容,對列M的平均學分績點進行統計,規定GPA>3.5爲優秀,
GPA>3.0爲良好,GPA>2.0爲合格,否則爲不合格,統計每種類別的人數,並對平均學分績點
這列屬性求它的熵
'''
import csv
import math
def getEntropy(dic):
    sum=0
    for i in dic.values():
        sum+=i
    entropy=0
    for i in dic:
        prob=dic[i]/sum
        entropy+=prob*math.log(prob,2)
    return -entropy

file="D:\\winter_python\\test2.csv"
with open('D:\\winter_python\\test2.csv') as f:
    f_csv = csv.reader(f)
    next(f_csv)
    next(f_csv)
    gpa=[]
    for row in f_csv:
        if row[12]!='':
            gpa.append(float(row[12]))
#print(gpa)
dic={}
for i in gpa:
    if i >3.5:
        if '優秀' in dic.keys():
            dic['優秀']+=1
        else:
            dic['優秀']=1
    elif i>3.0:
        if '良好' in dic.keys():
            dic['良好']+=1
        else:
            dic['良好']=1
    elif i >2.0:
        if '合格' in dic.keys():
            dic['合格']+=1
        else:
            dic['合格']=1
    else:
        if '不合格' in dic.keys():
            dic['不合格']+=1
        else:
            dic['不合格']=1
#print(dic)
res=getEntropy(dic)
print(res)
'''
2.讀取test2.csv文件中的ED列,EE列,輸出2016年和2017年入館次數前10分別是多少次
2016入館次數 2017入館次數
ED--> 5*26+3=107
'''
with open('D:\\winter_python\\test2.csv') as f:
    f_csv = csv.reader(f)
    next(f_csv)
    next(f_csv)
    cnt2016=[]
    cnt2017=[]
    for row in f_csv:
        if row[133]!='':
            cnt2016.append(int(row[133]))
        if row[134]!='':
            cnt2017.append(int(row[134]))
cnt2016.sort(reverse=True)
cnt2017.sort(reverse=True)
print(cnt2016[:10])
print(cnt2017[:10])
'''
4.讀取0120.txt中的文件,構造成一個二維數組dataset(list嵌套list),
根據讀取的元素計算未進行屬性劃分前的信息熵,以及按對應屬性劃分後所對應的信息熵,
通過信息熵作差求得每種屬性所對應的信息增益,將計算值和PPT上的進行覈對
'''
import math
def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet: #統計每個類標籤出現的次數,'yes'2次,'no'3次
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * math.log(prob,2) 
    return shannonEnt


def chooseBestFeatureToSplit(dataSet):
    GainList=[]
    numFeatures = len(dataSet[0]) - 1      #返回屬性個數
    baseEntropy = calcShannonEnt(dataSet)     #計算分裂前的信息熵
    bestInfoGain = 0.0; bestFeature = -1
    for i in range(numFeatures):        
        featList = [example[i] for example in dataSet]  #獲取第i個屬性的所有可能取值
        uniqueVals = set(featList)      #去除重複取值 
        newEntropy = 0.0
        for value in uniqueVals:      #計算按第i個屬性劃分後的信息熵
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet)/float(len(dataSet))
            newEntropy += prob * calcShannonEnt(subDataSet)     
        infoGain = baseEntropy - newEntropy   #計算信息增益
        GainList.append(infoGain)
        if (infoGain > bestInfoGain):   #計算最好的信息增益及相應的屬性
            bestInfoGain = infoGain         
            bestFeature = i
    print("GainList: ",GainList)
    return bestFeature                      


def splitDataSet(dataSet, axis, value):  #將dataSet中第axis列等於value的數據子集抽取後返回(去除第axis列)
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]    
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet


def solve(dataset):
    dic={}
    for i in dataset:
        label=i[-1]
        if label in dic.keys():
            dic[label]+=1
        else:
            dic[label]=1
    print(dic)
    baseEntropy=getEntropy(dic)

input=open("D:\\winter_python\\0120.txt")
res=input.readlines()
dataset=[]
for i in res:
    data=i.split()
    dataset.append(data)
#print(dataset)
#res=splitDataSet(dataset,1,'female')
chooseBestFeatureToSplit(dataset)
發佈了54 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章