Научете класификацията на дървото на решенията, мерките за избор на атрибути, изградете и оптимизирайте класификатора на дървото на решенията с помощта на пакета Python Scikit-learn.

Като маркетинг мениджър вие искате набор от клиенти, които е най-вероятно да закупят вашия продукт. Ето как можете да спестите маркетинговия си бюджет, като намерите своята аудитория. Като кредитен мениджър трябва да идентифицирате рискови заявления за кредит, за да постигнете по-нисък процент на неизпълнение на кредита. Този процес на класифициране на клиенти в група от потенциални и непотенциални клиенти или безопасни или рискови заявления за кредит е известен като проблем с класификацията. Класификацията е процес в две стъпки, стъпка на обучение и стъпка на прогнозиране. В стъпката на обучение моделът се разработва въз основа на дадени данни за обучение. В стъпката на прогнозиране моделът се използва за прогнозиране на отговора за дадени данни. Дървото на решенията е един от най-лесните и популярни класификационни алгоритми за разбиране и тълкуване. Може да се използва както за класификация, така и за регресия тип проблем.

В този урок ще покриете следните теми:

  • Алгоритъм на дървото на решенията
  • Как работи алгоритъмът на дървото на решенията?
  • Мерки за избор на атрибути
  • Оптимизиране на ефективността на дървото на решенията
  • Изграждане на класификатор в Scikit-learn
  • Предимства и недостатъци
  • Заключение

За повече подобни уроци, проекти и курсове посетете DataCamp

Алгоритъм на дървото на решенията

Дървото на решенията е дървовидна структура, подобна на блок-схема, където вътрешен възел представлява функция (или атрибут), разклонението представлява правило за вземане на решения и всеки листов възел представлява резултата. Най-горният възел в дървото на решенията е известен като основен възел. Научава се да разделя въз основа на стойността на атрибута. Той разделя дървото по рекурсивен начин, наречен рекурсивно разделяне. Тази структура, подобна на блок-схема, ви помага при вземането на решения. Това е визуализация като блок-схема, която лесно имитира мисленето на човешко ниво. Ето защо дърветата на решенията са лесни за разбиране и тълкуване.

Дървото на решенията е тип бяла кутия на ML алгоритъм. Той споделя вътрешна логика за вземане на решения, която не е налична в алгоритмите тип черна кутия, като невронната мрежа. Времето за обучение е по-бързо в сравнение с алгоритъма на невронната мрежа. Времевата сложност на дърветата на решенията е функция на броя на записите и броя на атрибутите в дадените данни. Дървото на решенията е метод без разпределение или непараметричен метод, който не зависи от допусканията за разпределение на вероятностите. Дърветата на решенията могат да обработват високомерни данни с добра точност.

Как работи алгоритъмът на дървото на решенията?

Основната идея зад всеки алгоритъм на дървото на решенията е следната:

  1. Изберете най-добрия атрибут с помощта на мерки за избор на атрибут (ASM), за да разделите записите.
  2. Направете този атрибут възел за решение и разделя набора от данни на по-малки подмножества.
  3. Започва изграждането на дърво, като повтаря този процес рекурсивно за всяко дете, докато едно от условията съвпадне:
  • Всички кортежи принадлежат на една и съща стойност на атрибута.
  • Няма повече останали атрибути.
  • Няма повече случаи.

Мерки за избор на атрибути

Мярката за избор на атрибут е евристика за избор на критерия за разделяне, който разделя данните по най-добрия възможен начин. Известно е още като правила за разделяне, защото ни помага да определим точки на прекъсване за кортежи на даден възел. ASM предоставя ранг на всяка характеристика (или атрибут), като обяснява дадения набор от данни. Атрибутът с най-добър резултат ще бъде избран като атрибут за разделяне. в случай на атрибута с непрекъснати стойности, точките на разделяне за разклонения също трябва да се дефинират. Най-популярните мерки за подбор са информационно усилване, коефициент на усилване и индекс на Джини.

Придобиване на информация

Шанън изобретява концепцията за ентропия, която измерва нечистотата на входния набор. Във физиката и математиката ентропията се нарича случайност или нечистота в системата. В теорията на информацията се отнася до примеса в група примери. Придобиването на информация е намаляване на ентропията. Придобиването на информация изчислява разликата между ентропията преди разделянето и средната ентропия след разделянето на набора от данни въз основа на дадени стойности на атрибути. ID3 (Iterative Dichotomiser) алгоритъмът на дървото на решенията използва придобиване на информация.

Където Pi е вероятността произволен кортеж в D да принадлежи към клас Ci.

Където,

  • Info(D) е средното количество информация, необходима за идентифициране на етикета на класа на кортеж в D.
  • |Dj|/|D| действа като тегло на j-тия дял.
  • InfoA(D) е очакваната информация, необходима за класифициране на кортеж от D въз основа на разделянето от A.

Атрибут A с най-голямо усилване на информацията, Gain(A), е избран като атрибут на разделяне във възел N.

Коефициент на усилване

Придобиването на информация е предубедено за атрибута с много резултати. Това означава, че предпочита атрибута с голям брой различни стойности. Например, помислете за атрибут с уникален идентификатор като customer_ID, който има нулева информация (D) поради чистото разделяне. Това увеличава до максимум информацията и създава безполезно разделяне.

C4.5, подобрение на ID3, използва разширение за усилване на информацията, известно като коефициент на усилване. Коефициентът на усилване се справя с проблема с отклонението чрез нормализиране на усилването на информацията с помощта на Split Info. Реализацията на Java на алгоритъма C4.5 е известна като J48, която е налична в инструмента за извличане на данни на WEKA.

Където,

  • |Dj|/|D| действа като тегло на j-тия дял.
  • v е броят на дискретните стойности в атрибута A.

Коефициентът на печалба може да се определи като

Атрибутът с най-висок коефициент на печалба се избира като разделящ атрибут.

Индекс Джини

Друг алгоритъм на дървото на решенията CART (Дърво за класификация и регресия) използва метода Gini за създаване на точки на разделяне.

Където pi е вероятността кортеж в D да принадлежи към клас Ci.

Индексът Gini разглежда двоично разделяне за всеки атрибут. можете да изчислите претеглена сума на примесите на всеки дял. Ако двоично разделяне на атрибут A разделя данните D на D1 и D2, индексът на Gini на D е:

В случай на атрибут с дискретна стойност, подмножеството, което дава минималния индекс на Gini за избрания, се избира като разделящ атрибут. В случай на атрибути с непрекъснати стойности, стратегията е да се избере всяка двойка съседни стойности като възможна точка на разделяне и точка с по-малък индекс на Gini, избран като точка на разделяне.

Атрибутът с минимален индекс Gini се избира като разделящ атрибут.

Изграждане на класификатор на дърво на решенията в Scikit-learn

Импортиране на необходимите библиотеки

Нека първо заредим необходимите библиотеки.

# Load libraries
import pandas as pd
# Import Decision Tree Classifier
from sklearn.tree import DecisionTreeClassifier
#Import train_test_split function
from sklearn.model_selection import train_test_split 
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics 

Зареждане на данни

Нека първо да заредим необходимия набор от данни за Pima Indian Diabetes, като използваме CSV функцията за четене на pandas. Можете да изтеглите данни от следната линк:

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
# load dataset
pima = pd.read_csv("pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()

Избор на функция

Тук трябва да разделите дадените колони на два типа променливи, зависими (или целева променлива) и независими променливи (или променливи на функции).

#split dataset in features and target variable
feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

Разделяне на данни

За да разберете ефективността на модела, разделянето на набора от данни на набор за обучение и тестов набор е добра стратегия.

Нека разделим набора от данни с помощта на функцията train_test_split(). трябва да предадете основно 3 параметъра функции, цел и размер на test_set.

# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1) # 70% training and 30% test

Изграждане на модел на дърво на решенията

Нека създадем модел на дървото на решенията с помощта на Scikit-learn.

# Create Decision Tree classifer object
clf = DecisionTreeClassifier()
# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)
#Predict the response for test dataset
y_pred = clf.predict(X_test)

Модел за оценка

Нека преценим колко точно класификаторът или моделът може да предвиди вида на сортовете.

Точността може да бъде изчислена чрез сравняване на действителните тестови зададени стойности и прогнозираните стойности.

# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Output:
Accuracy: 0.6753246753246753

Е, имате степен на класификация от 67,53%, считано за добра точност. Можете да подобрите тази точност, като настроите параметрите в алгоритъма на дървото на решенията.

Визуализиране на дървета на решенията

Можете да използвате функцията export_graphviz на Scikit-learn, за да покажете дървото в бележник на Jupyter. За изчертаване на дървета трябва също да инсталирате graphviz и pydotplus.

pip инсталирайте graphviz

pip инсталирайте pydotplus

Функцията export_graphviz преобразува класификатора на дървото на решенията в точков файл и pydotplus преобразува този точков файл в png или показваема форма на Jupyter.

In [50]:

from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus
​
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
filled=True, rounded=True,
special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('diabetes.png')
Image(graph.create_png())

В диаграмата на дървото на решенията всеки вътрешен възел има правило за вземане на решения, което разделя данните. Джини се позовава на съотношението на Джини, което измерва примесите на възела. можете да кажете, че един възел е чист, когато всички негови записи принадлежат към един и същи клас, такива възли са известни като листов възел.

Тук полученото дърво е неокастрено. Това неокастрено дърво е необяснимо и не е лесно за разбиране. В следващия раздел нека го оптимизираме чрез подрязване.

Оптимизиране на ефективността на дървото на решенията

  • критерий: незадължителен (по подразбиране=”gini”) или Изберете мярка за избор на атрибут: Този параметър ни позволява да използваме мярката за избор на различен-различен атрибут. Поддържаните критерии са „джини“ за индекса на Джини и „ентропия“ за придобиването на информация.
  • splitter: низ, по избор (по подразбиране =” best”) или Split Strategy: Този параметър ни позволява да изберем стратегията за разделяне. Поддържаните стратегии са „най-добри“, за да изберете най-добрия сплит и „случайни“, за да изберете най-добрия произволен сплит.
  • max_depth: int или Няма, по избор (по подразбиране=Няма) или Максимална дълбочина на дърво: Максималната дълбочина на дървото. Ако Няма, тогава възлите се разширяват, докато всички листа съдържат по-малко от min_samples_split проби. По-високата стойност на максималната дълбочина причинява прекомерно монтиране, а по-ниската стойност причинява недостатъчно монтиране.

В Scikit-learn, оптимизиране на класификатора на дървото на решенията, извършено само чрез предварително съкращаване. максималната дълбочина на дървото може да се използва като контролна променлива за предварително подрязване. В следващия пример можете да начертаете дърво на решенията върху същите данни с max_depth=3. Освен параметрите за предварително съкращаване, можете също да опитате друга мярка за избор на атрибут, като например ентропия.

# Create Decision Tree classifer object
clf = DecisionTreeClassifier(criterion="entropy", max_depth=3)
# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)

#Predict the response for test dataset
y_pred = clf.predict(X_test)
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

Output:
Accuracy: 0.7705627705627706

Е, степента на класификация се увеличи до 77,05%, което е по-добра точност от предишния модел.

Визуализиране на дървета на решенията

from sklearn.externals.six import StringIO
from IPython.display import Image
from sklearn.tree import export_graphviz
import pydotplus
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,filled=True, rounded=True,special_characters=True, 
feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('diabetes.png')
Image(graph.create_png())

Този съкратен модел е по-малко сложен, обясним и лесен за разбиране от предишния график на модела на дървото на решенията.

Професионалисти

  • Дърветата на решенията са лесни за тълкуване и визуализиране.
  • Може лесно да улавя нелинейни модели.
  • Изисква по-малко предварителна обработка на данни от потребителя, например няма нужда да се нормализират колони.
  • Може да се използва за проектиране на характеристики като предвиждане на липсващи стойности, подходящи за избор на променливи.
  • Дървото на решенията няма предположения относно разпределението поради непараметричния характер на алгоритъма.

минуси

  • Чувствителен към шумни данни. Може да прекалява с шумни данни.
  • Малката вариация (или вариация) в данните може да доведе до различно дърво на решенията. Това може да се намали чрез алгоритми за пакетиране и усилване.
  • Дърветата на решенията са предубедени с небалансираните набори от данни, така че се препоръчва да балансирате набора от данни, преди да създадете дървото на решенията.

Заключение

Поздравления, стигнахте до края на този урок!

В този урок вие покрихте много подробности за дървото на решенията; Работи, измерва мерки за подбор на атрибути като информация за печалба, коефициент на печалба и индекс на Джини, изграждане на модел на дърво на решенията, визуализация и оценка на набор от данни за диабет с помощта на пакета за обучение на Python Scikit. Също така, обсъдени са неговите плюсове, минуси и оптимизиране на ефективността на дървото на решенията чрез настройка на параметри.

Надяваме се, че вече можете да използвате алгоритъма на дървото на решенията, за да анализирате вашите собствени набори от данни. Благодаря, че прочетохте този урок!

Първоначално публикувано на https://www.datacamp.com/community/tutorials/naive-bayes-scikit-learn

Искате ли да научите наука за данните, разгледайте DataCamp.

За още подобни статии можете да посетите моя блог Machine Learning Geek

Свържете се с мен в Linkedin: https://www.linkedin.com/in/avinash-navlani/