Классификатор случайного леса - это ансамблевой алгоритм. В следующих 1-2 постах мы рассмотрим такие алгоритмы. Ансамблевые алгоритмы - это алгоритмы, которые объединяют более одного алгоритма одного или разных типов для классификации объектов. Например, прогон прогнозирования по наивному байесовскому алгоритму, SVM и дереву решений с последующим голосованием для окончательного рассмотрения класса для тестового объекта.

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

Если вы еще не читали о Классификаторе дерева решений r, я бы посоветовал вам пройти его один раз здесь, поскольку они являются базовой концепцией для классификатора случайного леса.

Классификатор случайного леса

Классификатор случайного леса создает набор деревьев решений из случайно выбранного подмножества обучающего набора. Затем он объединяет голоса из разных деревьев решений, чтобы определить окончательный класс тестового объекта.

С точки зрения непрофессионала,

Предположим, что обучающий набор задан как: [X1, X2, X3, X4] с соответствующими метками как [L1, L2, L3, L4], случайный лес может создать три дерева решений, принимая входные данные подмножества, например,

  1. [X1, X2, X3]
  2. [X1, X2, X4]
  3. [X2, X3, X4]

Итак, наконец, он делает прогноз на основе большинства голосов от каждого из принятых деревьев решений.

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

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

Альтернативная реализация для голосования

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

Основные параметры

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

Sklearn в Python имеет множество параметров настройки, которые вы можете изучить здесь.

Не забудьте нажать на значок сердца (❤).

Случайный лес и Sklearn в Python (пример кодирования).

Давайте попробуем использовать RandomForestClassifier в нашем предыдущем коде классификации писем на спам или ветчину.

0. Скачать

Я создал репозиторий git для набора данных и образца кода. Вы можете скачать его здесь (используйте папку chapter 5). Его тот же набор данных, что обсуждается в этой главе. Я бы предлагал продолжить обсуждение и написать код самостоятельно. В случае неудачи, вы можете использовать мою версию или сослаться на нее, чтобы понять, как работает.

1. Немного об очистке и извлечении функций

Вы можете пропустить эту часть, если вы уже прошли часть кода Наивного Байеса (это для читателей, которые сразу перешли сюда).

Прежде чем мы сможем применить классификаторы sklearn, мы должны очистить данные. Очистка включает удаление стоп-слов, извлечение наиболее часто используемых слов из текста и т. Д. В рассматриваемом примере кода мы выполняем следующие шаги:

Чтобы разобраться в деталях, еще раз обратитесь к главе 1, часть кодирования здесь.

  1. Создайте словарь слов из документов электронной почты из обучающего набора.
  2. Рассмотрим 3000 самых распространенных слов.
  3. Для каждого документа в обучающем наборе создайте частотную матрицу для этих слов в словаре и соответствующих метках. [имена файлов спама начинаются с префикса «spmsg».
The code snippet below does this:
def make_Dictionary(root_dir):
   all_words = []
   emails = [os.path.join(root_dir,f) for f in os.listdir(root_dir)]
   for mail in emails:
        with open(mail) as m:
            for line in m:
                words = line.split()
                all_words += words
   dictionary = Counter(all_words)
# if you have python version 3.x use commented version.
   # list_to_remove = list(dictionary)
   list_to_remove = dictionary.keys()
for item in list_to_remove:
       # remove if numerical. 
       if item.isalpha() == False:
            del dictionary[item]
        elif len(item) == 1:
            del dictionary[item]
    # consider only most 3000 common words in dictionary.
dictionary = dictionary.most_common(3000)
return dictionary
def extract_features(mail_dir):
  files = [os.path.join(mail_dir,fi) for fi in os.listdir(mail_dir)]
  features_matrix = np.zeros((len(files),3000))
  train_labels = np.zeros(len(files))
  count = 0;
  docID = 0;
  for fil in files:
    with open(fil) as fi:
      for i,line in enumerate(fi):
        if i == 2:
          words = line.split()
          for word in words:
            wordID = 0
            for i,d in enumerate(dictionary):
              if d[0] == word:
                wordID = i
                features_matrix[docID,wordID] = words.count(word)
      train_labels[docID] = 0;
      filepathTokens = fil.split('/')
      lastToken = filepathTokens[len(filepathTokens) - 1]
      if lastToken.startswith("spmsg"):
          train_labels[docID] = 1;
          count = count + 1
      docID = docID + 1
  return features_matrix, train_labels

2. Использование классификатора случайного леса

Код для использования классификатора случайного леса аналогичен предыдущим классификаторам.

  1. Библиотека импорта
  2. Создать модель
  3. Тренироваться
  4. Предсказывать
from sklearn.ensemble import RandomForestClassifier
TRAIN_DIR = "../train-mails"
TEST_DIR = "../test-mails"
dictionary = make_Dictionary(TRAIN_DIR)
print "reading and processing emails from file."
features_matrix, labels = extract_features(TRAIN_DIR)
test_feature_matrix, test_labels = extract_features(TEST_DIR)
model = RandomForestClassifier()
print "Training model."
#train model
model.fit(features_matrix, labels)
predicted_labels = model.predict(test_feature_matrix)
print "FINISHED classifying. accuracy score : "
print accuracy_score(test_labels, predicted_labels)

Попробуйте это и проверьте какова точность? Вы получите точность около 95,7%. Это довольно хорошо по сравнению с предыдущими классификаторами. Не правда ли?

3. Параметры

Давайте разберемся и поиграемся с некоторыми параметрами настройки.

n_estimators: Количество деревьев в лесу. По умолчанию 10.

критерий: «Джини» или «энтропия» то же, что и классификатор дерева решений.

min_samples_split: минимальный размер рабочего набора в узле, необходимый для разделения. По умолчанию 2.

Вы можете просмотреть полный список настраиваемых параметров здесь

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

Я попробовал следующую комбинацию и получил точность, как показано на изображении ниже.

Последние мысли

Объединенный алгоритм случайного лесного классификатора дает более точный результат. Это потому, что это работает по принципу,

Количество слабых оценок при объединении образует сильную оценку.

Даже если одно или несколько деревьев решений подвержены шуму, общий результат будет правильным. Даже при небольшом количестве оценок = 30 это дало нам высокую точность 97%.

Если вам понравился этот пост, поделитесь со своей группой интересов, друзьями и коллегами. Прокомментируйте свои мысли, мнения и отзывы ниже. Я хотел бы получить известие от вас. Следите за обновлениями по машинному обучению-101. Не забудьте нажать на значок сердца (❤).

Вы можете написать мне на [email protected]. Мир.