English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تنفيذ شجرة القرار باستخدام Python

هذا المقال يشارككم مثالاً على كيفية تنفيذ شجرة القرار باستخدام بايثون، وهو للمساهمة في إفادة الجميع، والتفاصيل كالتالي

نقاط القوة والضعف للخوارزمية:

النقاط الإيجابية: لا تكون معقدة في الحسابات، يمكن فهم النتائج بسهولة، لا تكون حساسة للقيم الوسطية المفقودة، يمكن معالجة بيانات الخاصيات غير ذات الصلة

النقاط السلبية: قد يحدث مشكلة التداخل الزائد

نوع البيانات المناسبة: النوع العددي والنوع الاسمي

فكرة الخوارزمية:

1. فكرة بناء شجرة القرار بشكل عام:

يبدو شجرة القرار مثل بنية if-else، والنتيجة هي إنشاء شجرة يمكن للكم من خلالها التقييم والاختيار من جذورها إلى أوراقها، ولكن يجب أن لا يكون هذا if-else هو الذي نريد إعداده، ما نحتاج إلى القيام به هو تقديم طريقة يمكن للكم أن تأخذ شجرة القرار التي نريدها. يتمركز هذا الطريقة بشكل أساسي على كيفية اختيار الخاصيات القيمة من بين العديد من الخاصيات، واختيارها بترتيب أفضل من الجذر إلى الورقة. عند الانتهاء من ذلك، يمكننا بناء شجرة القرار بشكل تكراري

2. زيادة الحدس

أهمية تقسيم مجموعة البيانات هي جعل البيانات غير المرتبة أكثر ترتيبًا. لأن هذا يتعلق بترتيب معلومات الشفافية، فمن الطبيعي أن نفكر في معادلة إنتروبيا الشفافية. هنا نستخدم أيضًا إنتروبيا الشفافية (ويمكن استخدام نقص النقاء بيني). المعادلة كالتالي:

الحاجة إلى أن تكون البيانات مرضية:

1 يجب أن تكون البيانات مجموعة من العناصر، وكل عمود يجب أن يكون لديه نفس طول العناصر
2 يجب أن يكون العمود الأخير للبيانات أو العنصر الأخير لكل حالة هو علامة الفئة الحالية للعنصر

دالة:

calcShannonEnt(dataSet)

حساب إنتروبيا شانون للمجموعة البيانات، في خطوتين، الخطوة الأولى هي حساب التردد، والخطوة الثانية هي حساب إنتروبيا شانون بناءً على المعادلة

splitDataSet(dataSet, aixs, value)

تقسيم مجموعة البيانات، جمع القيم التي تفي بشرط X[aixs] == value معًا، وإرجاع مجموعة مقسمة جيدة (لا تتضمن الخاصية aixs المستخدمة للفرز، لأنها ليست ضرورية)

chooseBestFeature(dataSet)

اختيار أفضل الخاصية للفرز، المبدأ بسيط جدًا وهو تقسيم كل خاصية، ونرى أيها أفضل. هنا نستخدم set لاختيار العناصر الفريدة في القائمة، وهي طريقة سريعة

majorityCnt(classList)

لأننا بناء شجرة القرار بشكل تكراري بناءً على استهلاك الخاصية، لذا قد يحدث أن استنفدت الخاصية في النهاية ولكن لم يكن هناك حساب فئة، وفي هذه الحالة سنستخدم طريقة التصويت الأغلبية لتحديد فئة العقدة

createTree(dataSet, labels)

بناء شجرة القرار بشكل متكرر. هنا، label هي أكثر من أسماء خصائص التصنيف، من أجل رؤية أفضل وفهم أفضل.

#coding=utf-8
استيراد operator
من math إرجاع log
استيراد time
تعريف createDataSet():
  dataSet=[[1,1,'نعم'],
      [1,1,'نعم'],
      [1,0,'بدون'],
      [0,1,'بدون'],
      [0,1,'بدون']]
  labels = ['بدون سطح','زعانف']
  إرجاع dataSet, labels
#حساب إنتروبي شانون
تعريف calcShannonEnt(dataSet):
  numEntries = len(dataSet)
  labelCounts = {}
  لـ feaVec في dataSet:
    currentLabel = feaVec[-1]
    إذا لم يكن currentLabel في labelCounts:
      labelCounts[currentLabel] = 0
    يزيد labelCounts[currentLabel] بـ 1
  shannonEnt = 0.0
  لـ key في labelCounts:
    prob = float(labelCounts[key])/numEntries
    يقلل shannonEnt -= prob * log(prob, 2)
  إرجاع shannonEnt
تعريف splitDataSet(dataSet, axis, value):
  retDataSet = []
  لـ featVec في dataSet:
    إذا كان featVec[axis] == value:
      عندما يكون reducedFeatVec = featVec[:axis]
      توسيع reducedFeatVec بـ featVec[axis+1:]
      إضافة reducedFeatVec إلى retDataSet
  إرجاع retDataSet
تعريف chooseBestFeatureToSplit(dataSet):
  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]
    uniqueVals = set(featList)
    newEntropy = 0.0
    uniqueVals = set(featValues)
      subDataSet = splitDataSet(dataSet, i, value)
      prob = len(subDataSet) / float(len(dataSet))
      newEntropy += prob * calcShannonEnt(subDataSet)
    infoGain = baseEntropy - newEntropy
    if infoGain > bestInfoGain:
      bestInfoGain = infoGain
      bestFeature = i
  return bestFeature
# لأننا نقوم ببناء شجرة القرار بشكل متكرر بناءً على استهلاك الخاصية، قد يحدث أن تكون الخاصية قد استنفدت ولكن الفئة
# لم يكن الحساب قد انتهى بعد، في هذه الحالة سيتم استخدام التأمين الأغلبية لحساب تصنيف العقدة
def majorityCnt(classList):
  classCount = {}
  for vote in classList:
    if vote not in classCount.keys():
      classCount[vote] = 0
    classCount[vote] += 1
  return max(classCount)     
def createTree(dataSet, 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 = chooseBestFeatureToSplit(dataSet)
  bestFeatLabel = labels[bestFeat]
  myTree = {bestFeatLabel:{}}
  del(labels[bestFeat])
  featValues = [example[bestFeat] for example in dataSet]
  uniqueVals = set(featValues)
    for value in uniqueVals:
     
                    myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet,
  bestFeat, value),subLabels)
return myTree
  def main():
  data,label = createDataSet()
  t1 = time.clock()
  myTree = createTree(data,label)
  t2 = time.clock()
  print myTree
print 'execute for ',t2-t1
  if __name__=='__main__':

main()

هذا هو نهاية محتوى هذا المقال، آمل أن يكون قد ساعد في تعلم الجميع، وأتمنى أن يدعم الجميع تعليمات الصراخ.

تعليمية الأساس
أنت قد تعجبك