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

Реализация алгоритма классификации деревьев решений на Python

В этом примере мы分享了 конкретный код реализации дерева решений на Python, который можно использовать для参考, подробности см. ниже

Преимущества и недостатки алгоритма:

Преимущества: невысокая сложность вычислений, легко понимаемые результаты, нечувствительность к отсутствию промежуточных значений, возможность обработки данных с несвязанными характеристиками

Недостатки: может возникнуть проблема чрезмерного соответствия

Применяемые типы данных: числовые и качественные

Алгоритмическая идея:

1. Общий подход к созданию дерева решений:

Дерево решений, по сути, похоже на структуру if-else, результатом которой является дерево, которое можно создавать от корня до листа, но здесь if-else не будет таким, как мы думаем, мы должны предложить метод, с помощью которого компьютер может получить нужное нам дерево решений. Основной момент этого метода заключается в том, как выбрать из множества характеристик те, которые имеют ценность, и выбрать их в лучшем порядке от корня до листа. После этого мы можем рекурсивно построить дерево решений

2. Информационная增益

Основной принцип разделения набора данных - это сделать неупорядоченные данные более упорядоченными. Поскольку это также касается проблемы упорядоченности и хаоса информации, естественно, подумать о энтропии информации. Здесь мы также используем энтропию информации (другой метод - гиниевая неопределенность). Формула следующая:

Требования, которые должны удовлетворять данные:

1 Данные должны состоять из списка элементов, и все элементы всех столбцов должны иметь одинаковую длину
2 Последний столбец данных или последний элемент каждого примера должен быть меткой класса текущего примера

Функция:

calcShannonEnt(dataSet)

Вычисление энтропии Шеннона набора данных, это делается в два шага:第一步 - вычисление частот,第二步 - вычисление энтропии Шеннона по формуле

splitDataSet(dataSet, aixs, value)

Разделение набора данных, все значения, удовлетворяющие X[aixs] == value, объединяются в одну группу, возвращается хорошо разделенный набор (не включая свойство aixs, так как оно не нужно)

chooseBestFeature(dataSet)

Выбор лучших свойств для разделения, идея очень проста: разделить каждый атрибут и посмотреть,哪个 лучше. Здесь используется множество для выбора уникальных элементов из списка, это быстрый метод

majorityCnt(classList)

Потому что мы рекурсивно строим дерево решений на основе затрат свойств, возможно, в конце свойства закончатся, но классификация все еще не завершена, в этом случае используется способ вычисления классификации узла большинством голосов

createTree(dataSet, labels)

Основываясь на рекурсивном строительстве décisionnel trees. Здесь label больше относится к именам классификационных характеристик, чтобы они выглядели лучше и для лучшего понимания.

#coding=utf-8
import operator
from math import log
import time
def createDataSet():
  dataSet=[[1,1,'yes'],
      [1,1,'yes'],
      [1,0,'no'],
      [0,1,'no'],
      [0,1,'no']]
  labels = ['no surfaceing','flippers']
  return dataSet, labels
#计算香农熵
def calcShannonEnt(dataSet):
  numEntries = len(dataSet)
  labelCounts = {}
  for feaVec in dataSet:
    currentLabel = feaVec[-1]
    if currentLabel not in labelCounts:
      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
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
def 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
    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 = 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()

Вот весь контент этой статьи, надеюсь, он поможет вам в изучении, также希望大家多多支持呐喊教程。

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору. Содержимое предоставлено пользователями Интернета, самостоятельно загруженным, сайт не имеет права собственности, не был отредактирован вручную и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @), чтобы сообщить о нарушении, и предоставьте соответствующие доказательства. Если факт будет подтвержден, сайт немедленно удалят涉嫌侵权的内容.

Вам может понравиться