機械学習 -決定木-C4.5 ツリー
以下のために ID3 いくつかの問題の既存のアルゴリズム、1993 インディアン、クインラン意志ID3 アルゴリズムが改善されたC4.5のアルゴリズム。アルゴリズムが正常に解決しているID3 10機械学習アルゴリズムの一つに開発したアルゴリズムに遭遇した多くの問題を、。
C4.5は変化しなかったID3のアルゴリズムロジック、基本的なプログラム構造とまだID3 同じように、しかし分類ノードのための基準が改善されています。C4.5 使用ゲイン比情報(GainRatio )の代わりに、情報利得(ゲイン機能選択のため)が、特性値の多数の欠如を克服する傾向がある場合、情報ゲイン選択機能。
情報利得比:
GainRatio(S、A)=ゲイン(S、A)/ SplitInfo(S、A)
前記ゲイン(S、A)があるID3 情報ゲインアルゴリズム、分割情報SplitInfo(S、A)に従って特性を示し、Aはサンプルセットの分割Sの幅及び均一性。
前記のSi へのSc 前記AがであるCの異なる設定値のサンプルのサブセット。
コード
#C4.5ツリー、最適な特徴を決定する情報利得率使用 から numpyのインポート* インポート数学 インポートコピー インポートピクルス クラス C45DTree(オブジェクト): DEF __init __(自己):#コンストラクタ self.tree = {#}生成されたツリーを self.dataSet = []#セット self.labels = 標識の[]セット# #データインポート機能 DEF loadDataSet(セルフ、パス、ラベル) 。レコードリスト = [] FP =オープン(パス、" R&LT " )、ファイル番号を読み取りますコンテンツ 内容 = fp.read() fp.close() rowlist= Content.splitlinesは()#列が一次元テーブルに変換 レコードリスト。 = [Row.split(" \ T ")のための行に rowlist IF row.strip()] self.dataSet = レコードリスト。 Self.labels = ラベル #実装の決定をツリー機能 DEFトレイン(セルフ): ラベル = copy.deepcopy(self.labels) self.tree = self.buildTree(self.dataSet、ラベル) 決定木作成する#メインプログラム DEF BuildTree(自己データセット、ラベル): cateList = [DATA [ - 1 ] のためにデータ内のdataSet A]は抽出ソースデータセット#決定ラベル列 #1プログラム終了条件は、1つしかない場合、判定CLASSLISTタグ、停止分割、この決定戻るラベル IF cateList.count(cateList [ 0 ])== LEN(cateList ): リターン cateList [ 0 ] #プログラム終了条件2:1つのタグだけが設定された第1判定データ場合、タグは、この決定を返す IF(のdataSet A [lenは0 ])== 1 : 戻りself.maxCate(cateList) #コアアルゴリズム: bestFeat、featValueList = self.getBestFeat(のdataSet A)は、データセット#最適な機能を返し軸 bestFeatLabel = ラベル[bestFeat] ツリー =bestFeatLabel {{}} デル(ラベル[bestFeat]) #最適な特徴抽出列ベクトル軸 のための値でfeatValueList#再帰的ツリー成長 サブラベル = サブカテゴリを確立するため#特徴カテゴリセット削除設定した後:ラベル[] 最適な特徴量とデータセットを分割することによって#カラム splitDataset = self.splitDataSet(のdataSet A、bestFeat、値) のサブツリー = self.buildTree(splitDataset、サブラベル)建設#サブツリーの ツリー[bestFeatLabel] [値] = サブツリー 戻りツリー 計算#クラスラベルの最大数が表示され DEF maxCate(セルフ、catelist): アイテム = dictの([(catelist.count(I)、I)についてI でcatelist]) 戻り項目[MAX(items.keys())] #エントロピー算出 DEF computeEntropy(自己データセットA): datalenを = フロート(LEN(のdataSet A)) cateList = [DATA [ - 1 ] のためのデータでのdataSet A 】データ・セットから#のクラスラベルを得ることが #得られたカテゴリーキー、値の発生を辞書 項目([(I、cateList.count(I))=辞書のための I におけるcateList]) infoEntropyが = 0.0 シャノンエントロピー初期化# するためのキーでアイテム:#シャノンのエントロピー: 度Prob= フロート(商品[キー])/ datalenを infoEntropy - * Math.log =度Prob(度Prob、2 ) リターンinfoEntropy #区分データ・セット、データ・セット・パーティション、特徴軸データの削除列、セットの残りのデータを返し #データセット:データ集合軸:特性値を軸:特徴軸値 DEF splitDataSet(自己データセット、軸、値): rtnList = [] のため featVec でのdataSet: IF featVec [軸] == 値: rFeatVec = featVec [:軸]#リスト:エキス〜0(axis- 1。 )素子 rFeatVec.extend(featVec [軸 + 1。:])#リスト操作:特徴要素の軸(列)が再度追加された後 rtnList.append(rFeatVec) リターンrtnList #计算划分信息(SpilitInfo) computeSplitInfo DEF(自己、featureVList): numEntries = LEN(featureVList) featureValueListSetList =リスト(セット(featureVList)) valueCounts = [featureVList.count(featVec)用 featVec でfeatureValueListSetList] #计算香农熵 PLIST = [ フロート(アイテム)/ numEntries ための項目でvalueCounts] lList = [アイテム* math.log(項目2)用項目におけるプロパティリスト] splitInfo = - SUM(LLIST)を 返すsplitInfo、featureValueListSetList 最適分割ノード使用#ゲイン比情報 DEF getBestFeat(自己データセットA): Num_feats = LEN(のdataSet A [ 0 ] [ - 1 ]) 全体を = LEN(のdataSet A) BaseEntropy = self.computeEntropy(のdataSet A) ConditionEntropy = []#初期条件エントロピー splitInfo = []#ゲイン比情報を算出 allFeatVList = [] のための F中範囲(Num_feats): featList = [例えば[F] のための実施例でのdataSet] [splitI、featureValueList] = self.computeSplitInfo(featList) allFeatVList.append(featureValueList) splitInfo.append(splitI) resultGain = 0.0 ための値でfeatureValueList。 subSet = self.splitDataSet(データセットF、値) appearNum = フロート(LEN(のsubSet)) subEntropy = self.computeEntropy(のsubSet) resultGain= +(AppearNum /全体)* subEntropy ConditionEntropy.append(resultGain)合計#条件付きエントロピー infoGainArray = BaseEntropy *もの(Num_feats) - アレイ(ConditionEntropy) infoGainRatio = infoGainArray / 算出アレイ(splitInfo)#1 C4.5ゲイン情報 bestFeatureIndex = argsort(-infoGainRatio)[ 0 ] を返すbestFeatureIndex、allFeatVList [bestFeatureIndex] #分類は DEF予測(セルフ、inputTree、featLabels、testVec): ルート =リスト(inputTree.keys())[ 0 ]#ルートノード secondDict = inputTree [ルート]#付加価値のサブツリー構造や分類ラベル featIndex = featLabels.index(ルート)#ルートノードの分類タグか所 キー = testVec [featIndex]#テスト設定値アレイ valueOfFeat = secondDict [キー] IF でisinstance(valueOfFeat、辞書) : classLabel = self.predict(valueOfFeat、featLabelsは、testVec)#再帰 他: classLabel = valueOfFeat リターンclassLabel #永続 DEF storeTree(セルフ、inputTree、ファイル名): FW =オープン(ファイル名、' WB ' ) pickle.dump(inputTree、FWは) fw.close() #は、ファイルツリーからクロール :DEF grabTree(セルフ、ファイル名) FR =オープン(ファイル名、' RB ' ) の戻りpickle.load(FR) #トレーニング dtree = C45DTree( ) dtree.loadDataSet(" /ユーザ/豊鎮市/デスクトップ/蓄積/機械学習/木/木のトレーニングセット.TXT "、[ " 年齢"、" 収益"、" 学生"、" クレジットで" ]) dtree.train () 印刷(dtree.tree) #永続 dtree.storeTree(dtree.tree、 "" /ユーザ/豊鎮市/デスクトップ/蓄積/機械学習/木/木C45.tree " ) myTree = dtree.grabTree(" /ユーザ/豊鎮市/デスクトップ/蓄積/機械学習/木/木C45.tree " ) (myTree)印刷 #テスト用 ラベル [= " 年齢" " 収益" " 学生" " クレジット" ] ベクトル = [ ' 0 '、' 1 '、' 0]、' 0 ' 印刷(dtree.predict(mytree、ラベル、ベクトル))