機械学習決定木アルゴリズム学習ノート

機械学習決定木アルゴリズム学習ノート

基本概念

決定木は分類アルゴリズムです。

データ型: 数値と名目値。構築アルゴリズムは名目データに対してのみ機能するため、数値データは離散化する必要があります。

仕組み

シャノンエントロピーを使用して、情報ゲインが最も高い特徴を見つけ、情報ゲインが最も高い特徴に従ってデータを分割し、このプロセスを繰り返して、無秩序なデータをより秩序のあるものにします。ツリー構造は ID3 アルゴリズムを使用して構築されます。新しいデータが渡されると、リーフ ノードがなくなるまで、データに従って対応するツリー ノードが検索され、分類が完了します。

水面に浮かばなくても生き残れるのか?ひれはあるか?魚なのか?

ある種が魚類であるかどうかは、水面に浮上せずに生きられる能力と、水かきのある足を持っているかどうかによって決まります。簡単な決定木を構築します。新しい生物が見つかったら、それを使ってそれが魚かどうかを判断できます。

サンプルコード

  1. デフcreateDataSet():
  2. データセット = [[1, 1, 'はい' ],
  3. [1, 1, 「はい」 ],
  4. [1, 0, 'いいえ' ],
  5. [0, 1, 'いいえ' ],
  6. [0, 1, 'いいえ' ]]
  7. labels = [ '浮上禁止' , '足ひれ' ]
  8. データセットとラベルを返す

シャノンエントロピー公式

分類対象となる取引が複数のカテゴリに分けられる場合、シンボル Xi の情報は次のように定義されます。

ここでP(Xi)はこのカテゴリーを選択する確率である。

エントロピーを計算するには、すべてのカテゴリのすべての可能な値に含まれる情報の期待値の合計を計算する必要があります。式は次のとおりです。

ここでnはカテゴリの数である

シャノンエントロピーアルゴリズム

  1. calcShannonEnt(データセット):
  2. # このカテゴリを選択する確率は、各タイプ/合計数です
  3. # 合計数、データの行数
  4. numEntries = len(データセット)
  5. ラベル数 = {}
  6. # 入手した各タイプの数
  7. データセット内のfeatVecの場合:
  8. 現在のラベル = featVec[-1]
  9. 現在のラベル  labelCounts.keys(): labelCounts[currentLabel] = 0
  10. ラベル数[現在のラベル] += 1
  11.  
  12. シャノンEnt = 0.0
  13. のために  ラベルカウント:
  14. # このカテゴリを選択する確率を取得します
  15. prob = float (labelCounts[ key ])/numEntries
  16. # 式によると
  17. shannonEnt -= prob * log(prob,2) #2を底とする対数
  18. shannonEntを返す

シャノンエントロピーに従ってデータを分割する

情報エントロピーを測定することに加えて、現在の分割が正しいかどうかを判断するために、データセットを分割し、データセットのエントロピーを測定することも必要です。 Shannon エントロピーと splitDataSet() の計算をループして、機能を分割する最適な方法を見つけます。

  1. def splitDataSet(データセット、軸、値):
  2. # このアルゴリズムは軸の添え字の外側の列を返します
  3. retデータセット = []
  4. データセット内のfeatVecの場合:
  5. featVec[axis] == valueの場合:
  6. ReducedFeatVec = featVec[:axis] #分割使用する軸を切り取る
  7. 縮小されたフィーチャベクトルを拡張します(フィーチャベクトル[軸+1:])
  8. retDataSet.append(縮小されたフィーチャベクトル)
  9. retDataSetを返す
  10.  
  11. def chooseBestFeatureToSplit(データセット):
  12. # まず最後の列を取り、それを使って結果にラベルを付けます: 魚か魚でないか。
  13. numFeatures = len(データセット[0]) - 1
  14. # オリジナル相農エントロピー
  15. ベースエントロピー = calcShannonEnt(データセット)
  16.  
  17. ベストインフォゲイン = 0.0; ベストフィーチャ = -1
  18. # すべての機能を反復処理する
  19. i が範囲(numFeatures)の場合:
  20. # この機能のすべての値を含むリストを作成します
  21. featList = [example[i] データセット]
  22. #重複を削除するにはsetを使用する
  23. uniqueVals =設定(featList)
  24. 新しいエントロピー = 0.0
  25. # この特徴に含まれる型のシャノンエントロピーの合計を計算します
  26. uniqueValsの場合:
  27. サブデータセット = 分割データセット(データセット、i、値)
  28. prob = len(subDataSet)/ float (len(dataSet))
  29. 新しいエントロピー += 確率 * calcShannonEnt(subDataSet)
  30. # 情報を得る
  31. infoGain = ベースエントロピー - 新しいエントロピー
  32. # ***情報ゲインを取り、添え字を記録する
  33. 情報ゲイン > ベスト情報ゲインの場合:
  34. ベストインフォゲイン = インフォゲイン
  35. ベストフィーチャ = i
  36. # 下付き文字を返す
  37. ベストフィーチャを返す

データセットは特定の要件を満たす必要があります。

  • データはリスト要素のリストである必要があります。 (2次元配列)
  • すべてのリスト要素の長さは同じである必要があります。
  • 最初の列は現在のインスタンスのラベルである必要があります。

再帰的に決定木を構築する

多数決アルゴリズム

データセットがすべての属性を処理したが、クラス ラベルがまだ一意でない場合は、リーフ ノードをどのように定義するかを決定する必要があります。この場合、通常は多数決を使用してリーフ ノードを決定します。

  1. インポート演算子
  2. defmajorityCnt(クラスリスト):
  3. # 最も多くの種類をソートして抽出する
  4. クラスカウント={}
  5. クラスリスト投票:
  6. 投票しない場合  classCount.keys(): classCount[vote] = 0
  7. クラスカウント[投票] += 1
  8. sortedClassCount = sorted(classCount.iteritems(), key =operator.itemgetter(1), reverse= True )
  9. sortedClassCount[0][0]を返す

ツリー構築アルゴリズム

  1. def createTree(データセット、ラベル):
  2. # 結果を取得する
  3. classList = [example[-1] dataSet内の]
  4. # 結果の最初の要素で表されるデータの数が結果自体と等しい場合、他の分類がないことを意味します
  5. classList.count (classList[0]) == len(classList)の場合:
  6. クラスリスト[0]を返す
  7. # データがない場合は、複数のデータを分類する意味があります
  8. len(dataSet[0]) == 1の場合:
  9. # 多数決で、出現回数が最も多いものを返す
  10. 多数決Cnt(classList)を返す
  11.  
  12. # セグメンテーションタイプに最も適した下付き文字を選択してください
  13. bestFeat = 分割する最適なフィーチャを選択する(データセット)
  14. # インデックスに従ってラベルを取得します
  15. bestFeatLabel = ラベル[bestFeat]
  16. # 木を作る
  17. myTree = {ベストフィーチャラベル:{}}
  18. # 繰り返し計算を避けるために、取り出されたタグを削除します
  19. del(ラベル[ベストフィーチャ])
  20. featValues ​​= [example[bestFeat] データセット]
  21.  
  22. #重複を削除するにはsetを使用します
  23. uniqueVals =設定(featValues)
  24.  
  25.  
  26. uniqueValsの場合:
  27. #サブラベルはすべて参照型なので、元のラベルデータの変更を避けるためにコピーします。
  28. サブラベル = ラベル[:]
  29. # 再帰的にツリーを構築する
  30. myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)
  31. myTreeを返す

決定木を使った分類

  1. def classify(inputTree,featLabels,testVec):
  2. firstStr = inputTree.keys()[0]
  3. secondDict = inputTree[firstStr]
  4. featIndex = featLabels.index (firstStr )
  5. # 'featIndex %s'を印刷% (featIndex)
  6. キー= testVec[featIndex]
  7. # 'キー %s'を印刷% (キー)
  8. valueOfFeat = secondDict[キー]
  9. if isinstance(valueOfFeat, dict):
  10. classLabel = classify(valueOfFeat, featLabels, testVec)
  11. そうでない場合: classLabel = valueOfFeat
  12. クラスラベルを返す
  13.  
  14. データセット、ラベル = createDataSet()
  15. mytree = createTree(dataSet, labels[:]) #ラベル内の値は内部的に削除されるため、次のようにコピーします
  16. マイツリーを印刷する
  17. # { '浮上禁止' : {0: 'いいえ' , 1: { '足ひれ' : {0: 'いいえ' , 1: 'はい' }}}}
  18. 印刷分類(mytree, ラベル, [0,1])
  19. いいえ 

決定木の保存

決定木の構築は、データセットが小さい場合でも時間のかかる作業です。したがって、構築された決定木を使用できます。

  1. def storeTree(入力ツリー、ファイル名):
  2. 輸入ピクルス
  3. fw = open ( ファイル名 , 'w' )
  4. pickle.dump(入力ツリー、fw)
  5. fw.close () 関数 
  6. def grabTree(ファイル名):
  7. 輸入ピクルス
  8. fr =開く(ファイル名)
  9. pickle.loadを返す(fr )

アドバンテージ

  • 計算の複雑さは高くない
  • 出力は分かりやすい
  • 中間値の欠損には影響されない
  • 無関係な特別調査も対応可能

欠点

  • 過剰マッチングの問題が発生する可能性がある

<<:  Daguan Data: 推奨システムアルゴリズムの再ランキングの実践

>>:  新しいニューラルネットワークモデルが登場:生成的敵対ネットワークよりも優れている

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

機械学習初心者からマスターまで

序文振り返ってみると、Coursera で Andrew Ng が教えている機械学習コースから多くの...

...

...

Nvidia の新しいブラック テクノロジーが「Minecraft」のモザイクをリアルな大ヒット作に変える

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

顔認識の応用シナリオは拡大し続けています。顔スキャンは便利で安全である必要があります。

[[341456]]顔スキャンでロック解除、顔スキャンで支払い、顔スキャンでキャンパスに入る......

サイバーセキュリティにおける AI: 2021 年に注目すべき 6 つのポイント

2021 年に向けて、より多くの組織が新しいテクノロジーを採用するにつれて、テクノロジーとサイバーセ...

...

ついに誰かがROSロボットオペレーティングシステムをわかりやすく説明しました

01 ROS入門多くの初心者は、ロボットのオペレーティングシステムと聞いて、「オペレーティングシス...

...

MySQL などの従来のリレーショナル データベースは弱すぎます。 GPU データベースは将来のトレンドです!

データベース市場でMySQLの地位を揺るがすようなデータベースが登場したのは久しぶりのようです。主要...

自動運転は衛生分野に適用され、問題点に直接対処し、将来性が期待できる

自動運転技術の開発は加速しており、商業的な検討も日々増加しています。現段階では、業界では貨物輸送と旅...

米上院司法委員会公聴会:AIは制御が難しく、悪意のある者が生物兵器の開発に利用する可能性がある

海外メディアTechCrunchによると、7月26日、米上院司法委員会は昨日、人工知能に関する公聴会...

インダストリー4.0におけるインテリジェントロボットの影響

インダストリー 4.0 でスマート ロボットを活用すると、企業は自動化、柔軟性、効率性、安全性の向上...

...

5G、Wi-Fi 6、AIがいかにしてよりスマートなホームエクスペリエンスを実現するか

[[335277]]家全体のスマートホームライフが実現するまでには、まだ時間がかかりそうですが、スマ...