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)