Очень краткое введение в машинное обучение

Алгоритмы машинного обучения в целом можно разделить на следующие категории

1. Классификация: этот тип алгоритмов может классифицировать входные данные как один из выходных классов. Очень простой пример - распознавание рукописного алфавита. Учитывая входное изображение алфавита, алгоритм классификации может классифицировать изображение как один из английских алфавитов, то есть один из A… Z.

2. Регрессия: алгоритм этого типа выдает непрерывное числовое значение. Например. премия медицинского страхования для человека в зависимости от различных параметров, связанных с человеком.

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

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

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

Кластеризация подпадает под алгоритм неконтролируемого обучения. В этом случае тег для входных данных недоступен. Необработанные данные группируются или группируются вместе на основе сходства.

Алгоритм обучения с подкреплением представляет собой сочетание алгоритмов обучения с учителем и без учителя.

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

Это алгоритм обучения с учителем.

Здесь я подробно рассмотрю концепции и реализацию дерева решений. Дерево решений имеет несколько преимуществ перед другими алгоритмами обучения:

1) Может выполнять как классификацию, так и регрессию.

2) Вычислительные затраты довольно низкие.

3) Легко понять.

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

По этим причинам дерево решений стало популярным в последние дни.

Интуитивное объяснение дерева решений

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

Теперь ей очень легко решить, как провести вечер. Если где-то есть вечеринка, обязательно приходите на нее. Если нет, то ищите другие варианты и ограничения.

Теперь вопрос на миллиард долларов состоит в том, как построить это дерево решений.

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

Информация

Как измеряется информация? Информация измеряется на основе неопределенности события.

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

Информация (I) = -log (P), где «P» - вероятность наступления события.

Это уравнение отражает неопределенность события. Чем неопределеннее событие (меньше вероятность его наступления), тем выше его информативность.

Например. утверждение «завтра взойдет солнце» не содержит никакой информации. Поскольку вероятность восхода солнца завтра равна 1, следовательно, информационное содержание равно -log (1) = 0. С другой стороны, утверждение «сегодня будет дождь» в летний день содержит гораздо больше информации, поскольку дождь в летние дни имеет меньше шансов вхождение.

Информационная энтропия

Энтропия - это просто среднее (ожидаемое) количество информации о случайном событии, которое определяется следующим уравнением

Энтропия = -Pi * log (Pi)

Например, давайте рассмотрим коробку с 4 красными шарами, 2 желтыми шарами и 3 зелеными шарами.

У выбора мяча из коробки есть три возможности - красный, зеленый или синий со следующими вероятностями

Красный шар = 4/9

Зеленый шар = 3/9

Желтый шар = 2/9

Итак, энтропия = - [(4/9) * журнал (4/9) + (3/9) * журнал (3/9) + (2/9) * журнал (2/9)] = 1,5304755

Таким образом, ожидается, что вы будете получать 1,5304755 информации каждый раз, когда выбираете мяч из коробки.

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

Красный шар = 9/9 = 1

Зеленый шар = 0/9 = 0

Желтый шар = 0/9 = 0

Итак, энтропия = [1 * журнал (1) + 0 * журнал (0) + 0 * журнал (0)] = 0.

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

Короче говоря, энтропия указывает на неопределенность, дисперсию, беспорядок или хаос в наборе данных.

Построение дерева решений

Предположим, у нас есть следующие данные, и мы хотим построить на их основе дерево решений.

Здесь первые три столбца - это функции, а последний столбец - выходной класс для определенной комбинации функций.

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

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

В нашем примере у нас есть три функции: «Крайний срок», «Есть вечеринка» и «Ленивый». Мы рассчитаем энтропию для всех трех характеристик и выберем одну с самой низкой энтропией.

Мы подробно покажем, как рассчитать энтропию признака «Есть вечеринка».

Крайняя левая таблица показывает столбец «Есть ли вечеринка» и соответствующие выходные данные. Средняя таблица показывает результат, когда «Есть вечеринка» - это «Нет», а в самой правой таблице показаны выходные данные, когда «Есть вечеринка» - «Да».

Расчет энтропии при «Есть вечеринка» - Нет:

В таком случае,

вероятность обучения = 3/5

вероятность Pub = 1/5

вероятность ТВ = 1/5

Энтропия («Есть ли вечеринка», Нет) = - [(3/5) * журнал (3/5) + (1/5) * журнал (1/5) + (1/5) * журнал (1 / 5)]

= 1.371

Расчет энтропии при «Есть ли вечеринка» Да:

В таком случае,

Вероятность вечеринки = 5/5 = 1

Энтропия («Есть ли вечеринка?», Да) = - [1 * log (1)] = 0

В этом случае энтропия оказалась равной нулю, потому что все данные одинаковы и нет никаких различий в данных.

Теперь давайте посчитаем энтропию для функции "Есть вечеринка".

Здесь,

Вес Да = 5/10

Вес No = 5/10

Итак, средняя энтропия для признака «Есть вечеринка» следующая:

Энтропия (Есть ли вечеринка) = (Вес Да) * Энтропия («Есть ли вечеринка», Да) + (Вес Нет) * Энтропия («Есть ли вечеринка», Нет)

= (5/10)*0 + (5/10)*1.371 = 0.6855

Следуя аналогичным шагам,

Энтропия (дедлайн) = 1,151

Энтропия (Ленивый) = 1,4755

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

Левая часть дерева не может быть разделена дальше, потому что энтропия в этом случае равна 0 (нет расхождений в данных и они чистые), и остается только один выбор - пойти на вечеринку. Но правую ветвь можно разделить дальше, так как она не чистая.

На следующем этапе у нас есть сокращенный набор данных, как показано ниже.

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

Энтропия (крайний срок) = 0,4

Энтропия (Ленивый) = 1,2

Итак, мы выбираем Deadline в этом случае, что приводит нас к следующему дереву

Следующие те же шаги приведут нас к полному дереву, как показано ниже:

примесь Джини

Подобно энтропии примесь Джини - еще один способ получения однородных ветвей. Этот метод здесь не обсуждается.

Реализация дерева решений с использованием научного пособия

Классификация с использованием дерева решений

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

Мы увидим пример классификации с использованием DecisionTreeClassifier из scikit learn. Мы будем вводить те же данные, которые использовали в предыдущем разделе.

from enum import Enum
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import export_graphviz
from sklearn.datasets import load_iris

feature_names = ['Deadline', 'is There a party', 'Lazy']
target_names = ['Party', 'Study', 'Go to pub', 'Watch TV']


class Deadline(Enum):
    URGENT = 1
    NEAR = 2
    NONE = 3


class IsThereAParty(Enum):
    YES = 1
    NO = 2


class Lazy(Enum):
    YES = 1
    NO = 2


class Activity(Enum):
    PARTY = 1
    STUDY = 2
    PUB = 3
    TV = 4


def getFeatureTrainingData():
    featureData = np.matrix([
        [Deadline.URGENT.value, IsThereAParty.NO.value, Lazy.YES.value],
        [Deadline.URGENT.value, IsThereAParty.NO.value, Lazy.YES.value],
        [Deadline.NEAR.value, IsThereAParty.YES.value, Lazy.YES.value],
        [Deadline.NONE.value, IsThereAParty.YES.value, Lazy.NO.value],
        [Deadline.NONE.value, IsThereAParty.NO.value, Lazy.YES.value],
        [Deadline.NONE.value, IsThereAParty.YES.value, Lazy.NO.value],
        [Deadline.NEAR.value, IsThereAParty.NO.value, Lazy.NO.value],
        [Deadline.NEAR.value, IsThereAParty.NO.value, Lazy.YES.value],
        [Deadline.NEAR.value, IsThereAParty.YES.value, Lazy.YES.value],
        [Deadline.URGENT.value, IsThereAParty.NO.value, Lazy.NO.value]
    ])

    return featureData


def getOutputTrainingData():
    outputData = [
        Activity.PARTY.value,
        Activity.STUDY.value,
        Activity.PARTY.value,
        Activity.PARTY.value,
        Activity.PUB.value,
        Activity.PARTY.value,
        Activity.STUDY.value,
        Activity.TV.value,
        Activity.PARTY.value,
        Activity.STUDY.value
    ]

    return outputData


def decisionTreeClassifier():
    # get training data set
    x_train = getFeatureTrainingData()
    y_train = getOutputTrainingData()

    # Train decision tree classifier
    tree_classifier = DecisionTreeClassifier(criterion="entropy", max_depth=5)
    tree_classifier.fit(x_train, y_train)

    # Predict for new data
    prediction = tree_classifier.predict([[Deadline.URGENT.value, IsThereAParty.YES.value, Lazy.NO.value]])
    print 'Predicted activity is following'
    print(Activity(prediction).name)

    # visualize the decision tree
    export_graphviz(tree_classifier,
                    out_file='d.dot',
                    feature_names=feature_names,
                    class_names=target_names,
                    rounded=True,
                    filled=True)


decisionTreeClassifier()

Приведенный выше код экспортирует дерево решений в файл DecisionTree.dot, который можно преобразовать в файл .png или .pdf с помощью инструмента командной строки с точкой из пакета graphviz.

brew install graphviz (если вы пользователь Mac)

точка -Tpng DecisionTree.dot -o DecisionTree.png

Ниже представлена ​​визуализация дерева решений, созданного с помощью приведенного выше кода. DecisionTreeClassifier из Scikit learn создает двоичное дерево, из-за чего оно не совсем соответствует нашему примеру.

Регрессия с использованием дерева решений

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

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

Ниже приведен пример использования DecisionTreeRegressor из scikit learn для выполнения задач регрессии.

import numpy as np
from sklearn.tree import DecisionTreeRegressor


def getFeatureTrainingData():
    return np.matrix([
                        [30, 200],
                        [32, 355],
                        [12, 434],
                        [20, 484],
                        [65, 4545],
                        [45, 546],
                        [70, 44359],
                        [25, 120]
                    ])


def getOutputTrainingData():
    return [
            45,
            22,
            43,
            10,
            16,
            65,
            100,
            23
           ]


def decisionTreeRegression():
    x_train = getFeatureTrainingData()
    y_train = getOutputTrainingData()
    tree_regression = DecisionTreeRegressor(max_depth=5)
    tree_regression.fit(x_train, y_train)
    prediction = tree_regression.predict([[21, 55]])
    print 'following is the predicted insurance premium fro age 21 and salary 55'
    print prediction[0]


decisionTreeRegression()