Случайный лес

Python
Случайный лес

1. Что такое случайный лес?

Как новый и очень гибкий алгоритм машинного обучения, Random Forest (RF) имеет широкий спектр перспектив применения, начиная от маркетинга и заканчивая медицинским страхованием. Источники, удержание и отток клиентов также можно использовать для прогнозирования риска заболевания и восприимчивости пациентов. В последние годы в отечественных и зарубежных конкурсах, в том числе в 2013 году Baidu Campus Movie Recommender System Competition, Alibaba Tianchi Big Data Competition 2014 и Kaggle Data Science Competition, участники использовали высокий процент случайных лесов. Таким образом, видно, что Random Forest довольно выгоден с точки зрения точности.


Итак, что за алгоритм случайный лес?


Если вы столкнулись с деревом решений, вам будет легко понять, что такое случайный лес. Случайный лес — это алгоритм, который объединяет несколько деревьев с помощью идеи ансамблевого обучения, Его базовая единица — дерево решений, а его сущность принадлежит одной из основных ветвей машинного обучения — методу ансамблевого обучения (Ensemble Learning). В названии случайного леса есть два ключевых слова: одно «случайный», а другое «лес». "Лес" мы понимаем очень хорошо. Если одно дерево называется деревом, то сотни или тысячи деревьев можно назвать лесом. Эта аналогия еще очень уместна. Собственно, в этом и заключается основная идея случайного леса - воплощение целостной идеи. Значение слова «случайный» будет обсуждаться в следующем разделе.

На самом деле, с интуитивной точки зрения, каждое дерево решений является классификатором (при условии, что это задача классификации), тогда для входной выборки у N деревьев будет N результатов классификации. Случайный лес объединяет все результаты голосования по классификации и назначает категорию с наибольшим количеством голосов в качестве конечного результата, что является простейшей идеей бэггинга.


Во-вторых, характеристики случайного леса


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

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

На самом деле характеристики random forest — это не только эти шесть пунктов, он равнозначен Leatherman в области машинного обучения (универсальнее), в него можно закинуть почти что угодно, и он в принципе доступен для использования. Это особенно полезно для оценки карт логического вывода, так что вам не нужно выполнять такую ​​большую настройку параметров, как SVM.


3. Базовые знания случайных лесов


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


1. Понятия информации, энтропии и прироста информации

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

Цитируя Шеннона, информация — это то, что используется для устранения случайной неопределенности. Конечно, хотя это предложение является классическим, все же трудно понять, что это за вещь, и она может относиться к разным вещам в разных местах. Для деревьев решений в машинном обучении, если набор классифицированных вещей можно разделить на несколько категорий, то определенный класс ( Икс я x_{i}xi​) можно определить следующим образом:

я ( Икс знак равно Икс я ) знак равно − бревно ⁡ 2 п ( Икс я ) I(X=x_{i})=-\log_{2}p(x_{i})I(X=xi​)=−log2​p(xi​)

я ( Икс ) I(x)I(x) используется для представления информации о случайных величинах, п ( Икс я ) p(x_{i})p(xi​) относится к вероятности появления xi.

Энтропия используется для измерения неопределенности. Икс знак равно Икс я Чем больше неопределенность X=x_{i}X=xi​, тем меньше наоборот. Для задач классификации в машинном обучении чем больше энтропия, тем больше неопределенность категории, и наоборот.

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


2. Дерево решений

Дерево решений — это древовидная структура, в которой каждый внутренний узел представляет проверку атрибута, каждая ветвь представляет результат проверки, а каждый конечный узел представляет категорию. Распространенными алгоритмами дерева решений являются C4.5, ID3 и CART.


3. Интегрированное обучение

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

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


В-четвертых, генерация случайного леса


Как упоминалось ранее, в случайных лесах существует множество деревьев классификации. Мы хотим классифицировать входную выборку, нам нужно передать входную выборку в каждое дерево для классификации. Например: собрание в лесу для обсуждения, является ли животное мышью или белкой, и каждое дерево должно самостоятельно высказать свое мнение по вопросу, то есть каждое дерево должно проголосовать. Является ли животное мышью или белкой, зависит от ситуации с голосованием, а категория, набравшая наибольшее количество голосов, является результатом классификации леса. Каждое дерево в лесу независимо, и 99,9% несвязанных деревьев делают прогнозы, охватывающие все случаи, и эти прогнозы взаимно компенсируют друг друга. Результат предсказания нескольких хороших деревьев поднимется над «шумом» и сделает хороший прогноз. Результаты классификации нескольких слабых классификаторов голосуют за формирование сильного классификатора, что является идеей случайного распределения леса (вопрос, который необходимо упомянуть о мешковании: стоимость мешкообразования заключается не в том, чтобы сделать это с одним деревом решений). предсказание, какая переменная играет важную роль, становится неизвестной, поэтому мешки улучшают точность предсказания, но теряют интерпретируемость.). Следующий рисунок может наглядно описать эту ситуацию:



С деревьями мы можем классифицировать, но как генерируется каждое дерево в лесу?

Каждое дерево формируется по следующим правилам:

1. Если размер обучающей выборки равен N, для каждого дерева случайным образом и с заменой выбрать N обучающих выборок из обучающей выборки (такой метод выборки называется методом бутстрепной выборки) в качестве обучающей выборки дерева;

Отсюда мы знаем, что обучающая выборка для каждого дерева разная и содержит повторяющиеся обучающие выборки (это важно понимать).

Зачем случайным образом выбирать обучающий набор?

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

Почему образец с заменой?

Я так понимаю, что если нет выборки с заменой, то обучающие выборки каждого дерева разные, и пересечения нет, поэтому каждое дерево "необъективно" и абсолютно "односторонне"" (конечно может сказать это неправильно), то есть каждое дерево обучается очень по-разному; и окончательная классификация случайного леса зависит от голосования нескольких деревьев (слабых классификаторов), которые должны быть «ищут точки соприкосновения», поэтому использование совершенно другого тренировочного набора для обучения каждого дерева не помогает для окончательного результата классификации, что равносильно «слепому, касающемуся слона».

2. Если размерность признаков каждой выборки равна M, укажите константу m

3. Каждое дерево максимально разрастается, а процесс обрезки отсутствует.

«Случайность» в случайном лесу, о котором мы упоминали в начале, здесь относится к двум случайностям. Введение двух случайностей имеет решающее значение для эффективности классификации случайных лесов. Из-за их введения случайные леса не так легко поддаются переоснащению и обладают хорошей помехозащищенностью (например, нечувствительны к значениям по умолчанию).

Эффект классификации случайного леса (частота ошибок) связан с двумя факторами:

  • Корреляция любых двух деревьев в лесу: чем больше корреляция, тем больше частота ошибок;
  • Классификационная способность каждого дерева в лесу: чем выше классификационная способность каждого дерева, тем ниже частота ошибок во всем лесу.

При уменьшении числа m выбора признаков корреляционная и классификационная способности дерева соответственно уменьшатся, при увеличении m соответственно возрастут и то, и другое. Таким образом, ключевой вопрос заключается в том, как выбрать оптимальное m (или диапазон), который также является единственным параметром случайного леса.


5. Частота ошибок вне пакета (ошибка oob)


Как было сказано выше, ключевая проблема при построении случайного леса заключается в том, как выбрать оптимальное m. Для решения этой задачи мы в основном вычисляем коэффициент ошибки вне сумки oob error (ошибка вне сумки).

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

Мы знаем, что использовали разные бутстрап-выборки (случайные и с заменой) для обучающей выборки при построении каждого дерева. Так для каждого дерева (при условии, что для k-го дерева) около 1/3 обучающих экземпляров не участвовали в генерации k-го дерева, и они называются oob выборками k-го дерева.

Такие характеристики выборки позволяют выполнить оценку oob, которая рассчитывается следующим образом(в единицах выборки):

1. Для каждой выборки рассчитайте классификацию дерева как выборки oob (около 1/3 дерева);

2. Затем используйте простое большинство голосов в качестве результата классификации выборки;

3. Наконец, отношение количества ошибочных классификаций к общему количеству выборок используется как коэффициент ошибочной классификации oob случайного леса.


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


6. Простой пример того, как работает случайный лес


описывать: По имеющейся обучающей выборке был сгенерирован соответствующий случайный лес.Как случайный лес использует возраст человека (Age), пол (Gender), образование (ВКК), сферу деятельности (Industry) и жилую площадь ( Резиденция) имеет в общей сложности 5 полей для прогнозирования уровня его дохода.

Уровень доходов :

Band 1 : Below $40,000

Группа 2: от 40 000 до 150 000 долларов США.

Band 3: More than $150,000

Каждое дерево в случайном лесу можно рассматривать как CART (дерево классификационной регрессии).Здесь предполагается, что в лесу 5 CART-деревьев, общее количество признаков N = 5, и мы берем m = 1 ( здесь предполагается, что каждое дерево CART соответствует отдельной функции).


CART 1 : Variable Age

КОРЗИНА 2: Переменный пол


CART 3 : Variable Education


КОРЗИНА 4: переменная резиденция


КОРЗИНА 5: Переменная отрасль


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

1. Age : 35 years ; 2. Gender : Male ; 3. Highest Educational Qualification : Diploma holder; 4. Industry : Manufacturing; 5. Residence : Metro.

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

В конце концов мы пришли к выводу, что 70 % людей с доходом первого класса, примерно 24 % — второго класса и 6 % — третьего класса, поэтому в конечном итоге человек был определен как человек с доходом первого класса (менее более 40 000 долларов).


7. Реализация случайного леса на Python


Случайные леса реализованы с использованием двух модулей Python, pandas и scikit-learn.


from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
df.head()

train, test = df[df['is_train']==True], df[df['is_train']==False]

features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)

preds = iris.target_names[clf.predict(test[features])]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])


Результат классификации:


Сравните с другими алгоритмами классификации машинного обучения:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_moons, make_circles, make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis as QDA

h = .02  # step size in the mesh

names = ["Nearest Neighbors", "Linear SVM", "RBF SVM", "Decision Tree",
         "Random Forest", "AdaBoost", "Naive Bayes", "LDA", "QDA"]
classifiers = [
    KNeighborsClassifier(3),
    SVC(kernel="linear", C=0.025),
    SVC(gamma=2, C=1),
    DecisionTreeClassifier(max_depth=5),
    RandomForestClassifier(max_depth=5, n_estimators=10, max_features=1),
    AdaBoostClassifier(),
    GaussianNB(),
    LDA(),
    QDA()]

X, y = make_classification(n_features=2, n_redundant=0, n_informative=2,
                           random_state=1, n_clusters_per_class=1)
rng = np.random.RandomState(2)
X += 2 * rng.uniform(size=X.shape)
linearly_separable = (X, y)

datasets = [make_moons(noise=0.3, random_state=0),
            make_circles(noise=0.2, factor=0.5, random_state=1),
            linearly_separable
            ]

figure = plt.figure(figsize=(27, 9))
i = 1
# iterate over datasets
for ds in datasets:
    # preprocess dataset, split into training and test part
    X, y = ds
    X = StandardScaler().fit_transform(X)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.4)

    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))

    # just plot the dataset first
    cm = plt.cm.RdBu
    cm_bright = ListedColormap(['#FF0000', '#0000FF'])
    ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
    # Plot the training points
    ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
    # and testing points
    ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright, alpha=0.6)
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xticks(())
    ax.set_yticks(())
    i += 1

    # iterate over classifiers
    for name, clf in zip(names, classifiers):
        ax = plt.subplot(len(datasets), len(classifiers) + 1, i)
        clf.fit(X_train, y_train)
        score = clf.score(X_test, y_test)

        # Plot the decision boundary. For that, we will assign a color to each
        # point in the mesh [x_min, m_max]x[y_min, y_max].
        if hasattr(clf, "decision_function"):
            Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
        else:
            Z = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]

        # Put the result into a color plot
        Z = Z.reshape(xx.shape)
        ax.contourf(xx, yy, Z, cmap=cm, alpha=.8)

        # Plot also the training points
        ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cm_bright)
        # and testing points
        ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cm_bright,
                   alpha=0.6)

        ax.set_xlim(xx.min(), xx.max())
        ax.set_ylim(yy.min(), yy.max())
        ax.set_xticks(())
        ax.set_yticks(())
        ax.set_title(name)
        ax.text(xx.max() - .3, yy.min() + .3, ('%.2f' % score).lstrip('0'),
                size=15, horizontalalignment='right')
        i += 1

figure.subplots_adjust(left=.02, right=.98)
plt.show()



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

1) Из уровня точности видно, что случайный лес лучше, чем одно дерево решений в этих трех наборах тестов: 90% > 85%, 82% > 80%, 95% = 95%;

2) Из пространства признаков интуитивно видно, что случайный лес обладает более сильной способностью сегментации (способностью нелинейной подгонки), чем дерево решений.


Ссылка на ссылку: http://www.cnblogs.com/maybe2030/p/4585705.html