機械学習古典アルゴリズム2-決定ツリー
5001 ワード
一、アルゴリズムが簡単である
意思決定ツリーの基本理念は、絶えず条件を選別することで、最後の答えを得ることです.knnアルゴリズムの最大の欠点は,データの内在的な意味を与えることができず,決定ツリーはデータ形式で非常に理解しやすく,一定の実用的な意義を持つことである.
ここで述べた決定木の非葉ノードの構築は,情報利得とエントロピーの概念に基づいており,これは自分で調べることができる.特定の属性でデータセットを分割する前後に生じるエントロピーの変化を計算することにより,情報利得が最も大きい特徴属性を分岐ノードとして選択し,決定ツリーの構造を一歩一歩行う.
二、アルゴリズムの一般的な流れ
1.データの収集:任意の方法と方法
2.データの準備:データは離散化する必要があります
3.解析データ:構築ツリーが完了したら、グラフィックが予測に合致するかどうかを確認します.
4.トレーニングアルゴリズム:決定ツリーの構造
5.テストアルゴリズム:一般的に決定ツリーを分類に使用し、エラー率で測定できます.
6.≪アルゴリズムの使用|Use Algoriths|emdw≫:決定ツリーは、任意の監督学習アルゴリズムに使用できます.
三、アルゴリズムの偽コード
1.決定木が構築されたか否かを判断し、そうでなければ2を実行し、そうでなければ3を実行する.終了条件があります:すべてのクラスラベルは完全に同じで、そのクラスラベルに戻ればいいです.すべてのフィーチャーの使用が完了しても、データセットを一意のカテゴリを含むグループに分割することはできません.この場合、出現回数の多いカテゴリが返されます.
2.選択時の情報ゲイン最大の特徴を分岐ノードとし,分岐ノードの各特定値に対して1を呼び出す.
3.意思決定ツリーの構築が完了し、テストデータを分類する
四、コード実装と例
意思決定ツリーの基本理念は、絶えず条件を選別することで、最後の答えを得ることです.knnアルゴリズムの最大の欠点は,データの内在的な意味を与えることができず,決定ツリーはデータ形式で非常に理解しやすく,一定の実用的な意義を持つことである.
ここで述べた決定木の非葉ノードの構築は,情報利得とエントロピーの概念に基づいており,これは自分で調べることができる.特定の属性でデータセットを分割する前後に生じるエントロピーの変化を計算することにより,情報利得が最も大きい特徴属性を分岐ノードとして選択し,決定ツリーの構造を一歩一歩行う.
二、アルゴリズムの一般的な流れ
1.データの収集:任意の方法と方法
2.データの準備:データは離散化する必要があります
3.解析データ:構築ツリーが完了したら、グラフィックが予測に合致するかどうかを確認します.
4.トレーニングアルゴリズム:決定ツリーの構造
5.テストアルゴリズム:一般的に決定ツリーを分類に使用し、エラー率で測定できます.
6.≪アルゴリズムの使用|Use Algoriths|emdw≫:決定ツリーは、任意の監督学習アルゴリズムに使用できます.
三、アルゴリズムの偽コード
1.決定木が構築されたか否かを判断し、そうでなければ2を実行し、そうでなければ3を実行する.終了条件があります:すべてのクラスラベルは完全に同じで、そのクラスラベルに戻ればいいです.すべてのフィーチャーの使用が完了しても、データセットを一意のカテゴリを含むグループに分割することはできません.この場合、出現回数の多いカテゴリが返されます.
2.選択時の情報ゲイン最大の特徴を分岐ノードとし,分岐ノードの各特定値に対して1を呼び出す.
3.意思決定ツリーの構築が完了し、テストデータを分類する
四、コード実装と例
import matplotlib.pyplot as plt
from math import log
import operator
'''calculate shannon entropy:count different distribution first then calculate'''
def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts={}
for featVec in dataSet:
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*log(prob,2)
return shannonEnt
'''split the dataSet with the given feature index, form new dataSet without the given feature'''
def splitDataSet(dataSet, axis, value):
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis+1:])
retDataSet.append(reducedFeatVec)
return retDataSet
'''choose the besf feature index with the largest information gain'''
def chosenBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0])-1
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0
bestFeature = -1
for i in range(numFeatures):
featList = [example[i] for example in dataSet]
uniqueVals = set(featList)
newEntropy = 0.0
for value in uniqueVals:
subDataSet = splitDataSet(dataSet, i, value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob*calcShannonEnt(subDataSet)
infoGain = baseEntropy - newEntropy
if(infoGain > bestInfoGain):
bestInfoGain = newEntropy
bestFeature = i
return bestFeature
'''return the majority of the list, for figure out the class with unpurity examples'''
def majorityCnt(classList):
classCount = {}
for vote in classList:
if vote not in classCount.keys():
classCount[vote] = 0
classCount[vote] += 1
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1),
reverse=True)
return sortedClassCount[0][0]
def createTree(dataSet, labels):
'''if we modify labels_t, python will not labels simutaneously'''
labels_t = labels[:]
classList = [example[-1] for example in dataSet]
if classList.count(classList[0]) == len(classList):
return classList[0]
if len(dataSet[0])==1:
return majorityCnt(classList)
bestFeat = chosenBestFeatureToSplit(dataSet)
bestFeatLabel = labels[bestFeat]
myTree={bestFeatLabel:{}}
del(labels_t[bestFeat])
featValues =[example[bestFeat] for example in dataSet]
uniqueVals = set(featValues)
for value in uniqueVals:
subLabels = labels_t[:]
myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
return myTree
def storeTree(inputTree, filename):
import pickle
fw = open(filename,'w')
pickle.dump(inputTree,fw)
fw.close()
def grabTree(filename):
import pickle
fr = open(filename)
return pickle.load(fr)
def classify(inputTree, featLabels, testVec):
firstStr = inputTree.keys()[0]
secondDict = inputTree[firstStr]
featIndex = featLabels.index(firstStr)
for key in secondDict.keys():
if testVec[featIndex]==key:
if type(secondDict[key]).__name__=='dict':
classLabel = classify(secondDict[key], featLabels, testVec)
else:
classLabel = secondDict[key]
return classLabel
myDat = [[1,1,'yes'],
[1,1,'yes'],
[1,0,'no'],
[0,1,'no'],
[0,1,'no']
]
labels = ['no surfacing','flippers']
myT = createTree(myDat, labels)
print myT
fileName="tmpTree.txt"
storeTree(myT,fileName)
print grabTree(fileName)
print classify(myT, labels, [1,0])