Добро пожаловать, читатели.

Введение в проблему. В этом блоге я хотел бы помочь вам, ребята, создать модель машинного обучения на основе алгоритма дерева решений. Здесь мы будем работать с меньшим набором данных о людях с диабетом. Сначала мы будем обучать нашу модель, используя предоставленные данные, а затем будем выполнять двоичную классификацию, используя построенную модель.
Основы :-Здесь наша основная задача состоит в том, чтобы определить, какой из них будет корневым узлом, и каковы будут наши критерии разделения для дополнительных узлов уровня. Мы можем использовать сформированное таким образом дерево решений (механизм правил на основе «если-иначе») для выполнения классификации любых новых входящих данных. Глубина дерева играет решающую роль в принятии решения о том, является ли дерево переоснащенным или нет?
Этап исследования данных и понимания предметной области: – Во-первых, давайте начнем с импорта набора данных в нашу записную книжку Jupyter: –

Затем мы можем исследовать типы данных каждого атрибута (он же функция) в данном наборе данных. Обратите внимание, что всего нам дано 9 признаков, из которых нам дано 8 независимых переменных, а атрибут «результат» является нашей зависимой переменной. Значение результата, равное 0, указывает на то, что человек НЕ болеет диабетом, а значение результата, равное 1, указывает на то, что человек очень хорошо страдает диабетом. Итак, «исход» для нас — это переменная категориального (т.е. бинарного) типа. Из приведенного ниже набора данных мы можем отметить, что в наборе данных около 768 строк и 9 столбцов.

Далее, давайте посмотрим, сколько строк для каждой переменной имеют значения NULL:

Давайте сначала загрузим данные и посмотрим, как они выглядят:

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

Ниже показано, как выглядят новые данные с измененными заголовками/названиями:

Далее, давайте проверим, у скольких пользователей диабет и у скольких нет диабета:

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

Давайте перечислим статистическую сводку всех функций в нашем наборе данных. «описать» — очень важная функция для просмотра статистической информации. Обратите внимание, что это имеет смысл только для непрерывных/числовых переменных, таких как BP, только толщина кожи. Это не имеет никакого смысла для номинальных или порядковых переменных. Из приведенных ниже данных для АД в этом наборе данных всего 768 записей, а среднее АД составляет около 70 со стандартным отклонением 19. Максимальное наблюдаемое АД составляет 122.

Давайте теперь посмотрим на гистограмму функции «BP» из данного набора данных.

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

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

Далее, давайте построим парные отношения в этом наборе данных. По умолчанию эта функция создаст сетку осей, так что каждая числовая переменная в data будет совместно использоваться по осям Y в одной строке и по осям X в одном столбце. Диагональные графики обрабатываются по-разному: строится одномерный график распределения, чтобы показать предельное распределение данных в каждом столбце. Например, крайний левый график во второй строке показывает точечную диаграмму «Глюкоза» по сравнению с «Беременность».

Далее давайте проведем корреляционный анализ между самими признаками. Обычно значение 0,7 и выше считается хорошим значением и указывает на высокую корреляцию между этими функциями. Например, самая высокая корреляция для наших данных наблюдается между атрибутами «Беременность» и «Возраст».

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

Кроме того, давайте посмотрим на сводку по каждому атрибуту: -

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

Из обнаружения формул выбросов для числовых/непрерывных атрибутов мы знаем, что для любого атрибута, если его соответствующее значение лежит за пределами следующего диапазона: [(Q1–1,5 * IQR), (Q3 + 1,5 * IQR)], то это записывает будет считаться выбросом. Давайте сначала выясним диапазон для каждого непрерывного атрибута с помощью вышеупомянутых формул. Например, из приведенной ниже демонстрации видно, что для атрибута «ИМТ» нормальный диапазон составляет (13,2375, 50,9375). Любая запись, имеющая значение атрибута ИМТ за пределами этого диапазона, должна рассматриваться как выброс.

Давайте еще раз вернемся к исходному фрейму данных. Из приведенной ниже демонстрации ясно, что у нас всего 2000 записей, и из всех данных записей диапазон ИМТ, данный нам: ‹0, 80›. Таким образом, должны быть некоторые записи, которые будут иметь значение «ИМТ» как 0, а некоторые записи также будут иметь значение «ИМТ» как 80. Очевидно, что это будут выбросы. Точно так же могут быть некоторые записи, имеющие выбросы и в других атрибутах.

Давайте теперь удалим выбросы из нашего исходного фрейма данных. Теперь у нас осталось бы 1652 записи. Помните, что изначально у нас было 2K записей. Также обратите внимание, что во фрейме данных (который свободен от выбросов) диапазон «ИМТ» составляет ‹18,72, 50,70›. Помните, что изначально нормальный диапазон ИМТ был (13,2375, 50,9375).
Далее, давайте снова построим парные отношения в этом наборе данных. С приведенной ниже визуализацией мы можем сказать, что некоторая часть предварительной обработки была выполнена для данного набора данных.

Этап построения модели машинного обучения.Во-первых, давайте начнем с разделения данного набора данных на функции и целевые переменные. Обратите внимание, что «X» содержит все наши независимые переменные/функции, И «y» содержит все наши зависимые переменные. Другими словами, «X» представляет входные переменные, а «y» представляет выходную переменную.

Давайте посмотрим, разделились ли наши данные на одинаковые или нет:

Затем давайте разделим данный набор данных на обучающий и тестовый наборы данных. Во-первых, давайте разберемся, что означают данные обучения и тестирования. Tнабор для обучения — подмножество, используемое для обучения модели. Тестовый набор — подмножество, используемое для тестирования обученной модели. Именно для этой цели мы использовали библиотеку sklearn. Обратите внимание, что мы объединили данные в соотношении 80%, т.е. (80% от 1652, т.е. 1321), должны использоваться для обучения, а оставшиеся 20% (20% от 1652, т.е. 331) записей должны использоваться в качестве теста. -данные. Мы также указали здесь ‘random_state’. Это означает воспроизводимость. Например, Может случиться так, что в следующий раз, когда мы снова запустим эту выборку, в наборе данных для тестирования и обучения могут оказаться разные строки. Итак, если я сейчас выберу значение для «random_state» и оставлю его постоянным, то каждый раз, когда мы выполняем этот оператор, один и тот же набор строк будет собираться и раздваиваться в набор данных для обучения и тестирования.

Построение модели с использованием «Энтропии» в качестве критерия. Далее мы будем использовать DecisionTreeClassifier из библиотеки sklearn.tree, предоставленной Python. Обратите внимание, что модель на основе DecisionTree может использоваться как для целей классификации, так и для регрессии. В контексте этой проблемы здесь мы выполняем задачу бинарной классификации. Поэтому мы вписываем в модель набор данных для обучения и тестирования И, наконец, делаем прогноз на наборе данных для тестирования. Из приведенного ниже наблюдения обратите внимание, что "y_pred" указывает прогнозируемые результаты (на данных X_test) по наша недавно изученная модель. Также помните, что «y_test» — это исходное фактическое значение метки для нашего набора тестовых данных.

Этап оценки производительности модели. Во-первых, давайте начнем с импорта библиотек, чтобы увидеть показатели из 'sklearn' и, таким образом, мы можем увидеть точность нашей модели на тестовых данных: -

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

Построение модели с использованием Джини в качестве критерия. Давайте попробуем использовать Джини в качестве критерия для нашего DecisionTreeClassifier. Мы можем легко заметить, что точность также увеличилась до 98,48%.

Давайте теперь посмотрим на матрицу путаницы для «y_test» (т. е. фактических значений результата) и «y_pred_gini» (т. е. значений, предсказанных нашей моделью).

Confusion-Matrix представляет собой сетку / матрицу 2 * 2, которая на самом деле демонстрирует производительность. Сетку выше 2 * 2 можно рассматривать как следующую таблицу: -

- True-Positives → Это такие записи, которые изначально имеют результат как TRUE, и они также прогнозируются как TRUE (по нашей модели). У нас есть 231 такая запись. Из приведенной ниже демонстрации видно, что в тестовых данных имеется 231 запись с меткой 0 и 100 записей с меткой 1.

Из приведенной ниже демонстрации видно, что в предсказанных метках из тестовых данных наша модель предсказала 236 записей с меткой 0 и 95 записей с меткой 1.

- False-Positives → Это такие записи, которые изначально имеют результат как FALSE, но наша модель предсказала их как True. У нас нет таких записей, что является хорошим признаком.
- False-Negatives → Это такие записи, которые изначально имеют результат FALSE, и наша модель также предсказала эти записи как FALSE.
- Истинно-отрицательные → Это такие записи, которые изначально имеют результат как ИСТИНА, но наша модель предсказала эти записи как ЛОЖЬ. Таких записей 95. (т.е. для этих 95 записей ).
Теперь Точность сама по себе не может быть правильным идентификатором для какой-либо модели машинного обучения. У нас есть много других KPI для определения производительности модели. Все приведенные ниже параметры говорят нам, насколько хороша наша модель:
Точность[TP / (TP + FP)] — это способность модели (классификатора) не помечать образец как положительный, который на самом деле отрицательный. Другими словами, из всех положительно предсказанных классов, сколько на самом деле положительных.
Отзыв [TP / (TP + FN)] интуитивно представляет собой способность классификатора находить все положительные образцы. Другими словами, сколько из всех положительных классов мы предсказали правильно. Это должно быть как можно выше.
Показатель F1 (т.е. показатель F) [(2 * отзыв * точность) / (отзыв + точность)] можно интерпретировать как средневзвешенное гармоническое значение точности и отзывать. Это баланс между отзывом и точностью.
Поддержка.Указывает на количество записей в тестовом наборе данных с классом 0 (недиабетический) и классом 1 (диабетический).
Макро-среднее :-указывает среднюю точность, когда мы рассматриваем два разных разбиения данных. Для обоих этих разделений мы вычисляем среднюю точность и полноту. Например, для вычисления макросреднего значения точности → [(P1 + P2)/2]. Точно так же для вычисления макросреднего значения отзыва → [(R1 + R2) / 2].
Средневзвешенное значение:-Например, для вычисления микросреднего (т.е. средневзвешенного) значения точности можно использовать следующие формулы → [(TP1 + TP2 ) / (TP1 + FP1 + TP2 + FP2)].

Из приведенного выше рисунка видно, что для класса 1 (т. е. диабет == ИСТИНА) точность составляет 100%, а отзыв составляет 95%. Можно считать очень хорошей моделью.
Затем мы знаем, что в каждом алгоритме, основанном на дереве решений, цель состоит в том, чтобы выяснить, какой из них будет лучшим корневым узлом и так далее. Мы делаем это на основе энтропии/прироста информации и выбираем лучший узел. Давайте визуализируем модель, построенную вышеупомянутой библиотекой для нашего варианта использования. Мы видим, что наше дерево выглядит слишком плотным.

Этап оптимизации модели: - Давайте теперь оптимизируем нашу модель, уменьшая уровень и сложность. Мы ограничим глубину дерева только 4. Чем выше глубина дерева, тем выше вероятность переобучения.

Далее давайте снова подготовим модель дерева решений и выполним прогноз.

Теперь производительность модели, кажется, составляет 72%. Это может улучшиться, в зависимости от

Окончательная модель теперь также выглядит более тонкой и аккуратной:

Мы также можем наблюдать, какие характеристики являются наиболее важными при определении ярлыка (т. е. должен ли человек быть диабетиком или нет):

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

Затем давайте подготовим входные данные для нашей модели из приведенной выше случайной записи, отбросив выходную переменную (т.е. зависимую переменную) и одну из несвязанных независимых переменных (т.е. скин): -

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

Заключение: -Обратите внимание, что деревья решений также могут использоваться там, где зависимая переменная также может иметь значения из некоторого заданного диапазона, не обязательно всегда бинарного (т.е. мультикласса классификация).
Ссылки: –
- https://stackoverflow.com/questions/38481409/pandas-deleting-row-with-df-drop-doesnt-work
- https://www.codegrepper.com/code-examples/python/%27numpy.ndarray%27+object+has+no+attribute+%27nunique%27
- https://scikit-learn.org/stable/modules/tree.html
- https://scikit-learn.org/stable/modules/model_evaluation.html
- https://docs.python.org/3/library/random.html
- https://matplotlib.org/
- https://seaborn.pydata.org/generated/seaborn.heatmap.html
- https://seaborn.pydata.org/examples/heatmap_annotation.html
- https://towardsdatascience.com/visualizing-data-with-pair-plots-in-python-f228cf529166
- https://www.w3resource.com/python-exercises/numpy/python-numpy-exercise-94.php