77 lines
6.2 KiB
Markdown
77 lines
6.2 KiB
Markdown
|
# Лабораторная работа №3. Вариант 21
|
|||
|
|
|||
|
## Тема:
|
|||
|
Деревья решений
|
|||
|
|
|||
|
## Модель:
|
|||
|
|
|||
|
Decision Tree Classifier
|
|||
|
|
|||
|
## Как запустить программу:
|
|||
|
Установить *python, numpy, matplotlib, sklearn*
|
|||
|
```
|
|||
|
python main.py
|
|||
|
```
|
|||
|
|
|||
|
## Какие технологии использовались:
|
|||
|
Язык программирования Python, библиотеки numpy, matplotlib, sklearn
|
|||
|
|
|||
|
Среда разработки VSCode
|
|||
|
|
|||
|
# Что делает лабораторная работа:
|
|||
|
Использует данные из набора "UCI Heart Disease Data" и обучает модель: ```Decision Tree Classifier```
|
|||
|
|
|||
|
Датасет UCI Heart Disease Data содержит информацию о различных клинических признаках, таких как возраст, пол, артериальное давление, холестерин, наличие электрокардиографических признаков и другие, а также целевую переменную, отражающую наличие или отсутствие заболевания сердца.
|
|||
|
|
|||
|
Для начала нужно предобработать данные, чтобы модель могла принимать их на вход. Изначально данный имеют следующий вид:
|
|||
|
|
|||
|
![](1.png "")
|
|||
|
|
|||
|
Так как модели машинного обучения умеют работать исключительно с числовыми значениями, то нужно свести все данных к данному формату и использовать только полные строки, значение признаков которых не являются пустыми значениями. Это происходит с использованием функции, представленной ниже:
|
|||
|
|
|||
|
![](2.png "")
|
|||
|
|
|||
|
Далее нужно привести целевое значение к бинарному виду, т.к изначально данное поле принимает 4 значения. После этого применить подход, называемый “feature engineering”, для получения большего количества признаков, которые возможно помогут модели при решении задачи, т.к. обычно в машинном и глубоком обучении действует следующая логика: Больше данных - лучше результат. Получение новых признаков происходит с помощью функции ниже и далее обновленный набор данных снова преобразовывается к численному формату.
|
|||
|
|
|||
|
```
|
|||
|
def fe_creation(df):
|
|||
|
# Feature engineering (FE)
|
|||
|
df['age2'] = df['age']//10
|
|||
|
df['trestbps2'] = df['trestbps']//10
|
|||
|
df['chol2'] = df['chol']//60
|
|||
|
df['thalch2'] = df['thalch']//40
|
|||
|
df['oldpeak2'] = df['oldpeak']//0.4
|
|||
|
for i in ['sex', 'age2', 'fbs', 'restecg', 'exang']:
|
|||
|
for j in ['cp','trestbps2', 'chol2', 'thalch2', 'oldpeak2', 'slope']:
|
|||
|
df[i + "_" + j] = df[i].astype('str') + "_" + df[j].astype('str')
|
|||
|
return df
|
|||
|
```
|
|||
|
После применения данной функции количество признаков увеличилось с 12 до 47. Далее все признаки стандартизируются с помощью следующей формулы z = (x-mean)/std, где х - текущее значение признак, mean - математическое ожидание столбца с этим признаком, std - стандартное отклонение данного признака, а z - соответственно новое значение признака x. После всех описанных действий данные стали готовыми для их использования для обучения деревьев.
|
|||
|
|
|||
|
```Decision Tree Classifier```- это алгоритм машинного обучения, который использует структуру дерева для принятия решений. Каждый узел дерева представляет собой тест по какому-то признаку, а каждая ветвь представляет возможный результат этого теста. Цель - разделить данные на подгруппы так, чтобы в каждой подгруппе преобладал один класс.
|
|||
|
|
|||
|
```
|
|||
|
decision_tree = DecisionTreeClassifier()
|
|||
|
param_grid = {'min_samples_leaf': [i for i in range(2,12)]}
|
|||
|
decision_tree_CV = GridSearchCV(decision_tree, param_grid=param_grid, cv=cv_train, verbose=False)
|
|||
|
decision_tree_CV.fit(train, train_target)
|
|||
|
print(decision_tree_CV.best_params_)
|
|||
|
|
|||
|
acc_all = acc_metrics_calc(0, acc_all, decision_tree_CV, train, valid, train_target, valid_target, title="Decision Tree Classifier")
|
|||
|
plot_learning_curve(decision_tree_CV, "Decision Tree", train, train_target, cv=cv_train)
|
|||
|
|
|||
|
feature_importances_dt = decision_tree_CV.best_estimator_.feature_importances_
|
|||
|
plot_feature_importance(feature_importances_dt, data.columns, "Decision Tree")
|
|||
|
```
|
|||
|
|
|||
|
Первым был обучен Decision Tree Classifier, который с помощью алгоритма GridSearch нашел наилучшие гиперпараметры для решения задачи. Ниже приведены графики, отображающие качество и процесс обучения данного классификатора.
|
|||
|
|
|||
|
![](3.png "")
|
|||
|
|
|||
|
На следующем графике мы можем увидеть какие признаки модель посчитала наиболее важными:
|
|||
|
|
|||
|
![](4.png "")
|
|||
|
|
|||
|
## Вывод
|
|||
|
|
|||
|
На обучающихся данных мы в большинстве случаев предсказываем правильно, а в валидационных появляется проблема с выявлением второго класса, которое отображает наличие заболеваний.
|