Предыдущий, в основном говоря о «оценке» категории. Эта статья о методе классификации.
Книга «Машинное обучение в действии» называется «Дерево решений». Я так понимаю, что тот, что удовлетворяет условию А, - это класс А, а остальные объекты сравниваются с условием Б, а тот, который удовлетворяет условию Б, - это В. Если есть какие-то оставшиеся, то условие С сравнивается, а условие D... аналогия.
Например: есть 5 видов морских обитателей, определите, рыба ли это. Здесь есть 2 условия "Сможете ли вы выжить, не всплыв на поверхность" и "Есть ли у вас ласты".
Используемое «дерево решений» выглядит следующим образом:
Здесь мы обсуждаем только первый шаг «те, которые удовлетворяют условию А, относятся к классу А».
Преобразуйте приведенные выше данные в структуру, понятную программе:
#给数据分类
def splitDataSet(dataSet , axis ,value):
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis] #取每行的第0个到第axis-1个的数据
reducedFeatVec.extend(featVec[axis+1:]) #取每行的第axis+1个到最后一个的数据
# 上面两行,正好去掉了featVec[axis]这个数据
retDataSet.append(reducedFeatVec)
return retDataSet
Давайте поговорим о значении трех параметров здесь, dataSet - это исходные данные, какое условие используется для значения оси, это "может ли он выжить без всплытия" или "есть ли у него ласты", то есть 0-й столбец или 1-й столбец в столбце данных; значение — это значение сравнения.
Назовите его: splitDataSet(dataSet, 0,1), что означает извлечение данных, у которых значение 0-го столбца равно 1 во всех наборах данных. То есть уничтожение существ, которые «могут выжить, не всплывая». Очевидно, результат: [[1, 'да'], [1, 'да'], [0, 'нет']], а затем используется здесьПредыдущийГоворя об энтропии Шеннона, вычислите энтропию Шеннона (0,9182958340544896), а затем используйте ее в качестве основы для сравнения для этой классификации и других классификаций.
Попробуем другое условие классификации
splitDataSet(dataSet, 0,0), то есть убрать существ, которые «не могут выжить без всплытия». Результатом является [[1, 'нет'], [1, 'нет']], который вычисляет энтропию Шеннона (0,0).
Очевидно, что энтропия Шеннона у второго меньше, чем у первого, поэтому результат деления более идеален.
Здесь мы используем только первое условие, но чтобы найти лучший способ разделить классификацию, нам лучше сделать обход. Переберите каждое условие и сравните значение каждого существа для этого состояния. Посмотрите, какое условие лучше использовать для деления.
# 分割数据集
def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1
baseEntropy = calcShannonEnt(dataSet) # 整个数据集的原始香农熵
bestInfoGain = 0.0;bestFeature = -1
for i in range(numFeatures):
# 拿出第i列的数据
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)
# 如果香农熵减少的多,说明越好,就要保存下来这个值(保存下来第i列)
infoGain = baseEntropy - newEntropy
if(infoGain > bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature
Результат выполнения кода: 0, что является оптимальным делением с использованием 0-го столбца. То есть значение 1 в столбце 0 соответствует одной категории (две относятся к рыбе и один принадлежит к нерыбе), а значение столбца 0 равно 0, чтобы принадлежать к другой категории (полностью не к рыбе).
Давайте еще раз проверим визуально, что если мы используем столбец 1 для классификации, то в первой группе 2 рыбы, 2 нерыбы, а во второй группе только один нерыба.
Очевидно, что лучше использовать столбец 0 для классификации. Хотя это все равно не оптимальный результат, потому что есть еще какие-то нерыбные, «перемешанные» с рыбными. Но обратите внимание, что здесь мы выполнили только первый шаг «дерева решений», «тот, который удовлетворяет условию А, является классом А». Следующим шагом является «рекурсивное построение дерева решений».