Compare commits
6 Commits
06116369e5
...
5a2ec3e827
Author | SHA1 | Date | |
---|---|---|---|
5a2ec3e827 | |||
|
8c47411bf1 | ||
|
401a5454ee | ||
|
a847058d44 | ||
|
059d5b0b12 | ||
|
c943260db9 |
85
antonov_dmitry_lab_3/README.md
Normal file
85
antonov_dmitry_lab_3/README.md
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
# Лаб 3
|
||||||
|
|
||||||
|
Деревья решений
|
||||||
|
|
||||||
|
Часть 1. По данным о пассажирах Титаника решите задачу классификации
|
||||||
|
(с помощью дерева решений), в которой по различным характеристикам
|
||||||
|
пассажиров требуется найти у выживших пассажиров два наиболее важных
|
||||||
|
признака из трех рассматриваемых (по варианту). Пример решения задачи
|
||||||
|
можно посмотреть здесь: [1] (стр.188). Скачать данные можно по ссылке:
|
||||||
|
https://www.kaggle.com/datasets/heptapod/titanic
|
||||||
|
|
||||||
|
Часть 2. Решите с помощью библиотечной реализации дерева решений
|
||||||
|
задачу из лабораторной работы «Веб-сервис «Дерево решений» по предмету
|
||||||
|
«Методы искусственного интеллекта» на 99% ваших данных. Проверьте
|
||||||
|
работу модели на оставшемся проценте, сделайте вывод.
|
||||||
|
|
||||||
|
# Вариант 3
|
||||||
|
|
||||||
|
Признаки Sex,Age,SibSp
|
||||||
|
|
||||||
|
# Запуск
|
||||||
|
|
||||||
|
Выполнением скрипта файла (вывод в консоль).
|
||||||
|
|
||||||
|
# Описание модели:
|
||||||
|
|
||||||
|
DecisionTreeClassifier - это алгоритм машинного обучения, используемый для задач классификации и регрессии.
|
||||||
|
Он представляет собой дерево решений, где на каждом узле дерева решается, какой вопрос задать дальше
|
||||||
|
(признак для дальнейшего разбиения данных), а в листьях находятся окончательные ответы.
|
||||||
|
|
||||||
|
# Результаты
|
||||||
|
|
||||||
|
На данных для Титаника модель определяет важность признаков с точность 75% (исключает 'sibsp').
|
||||||
|
Эти два признака обладают статистической важностью.
|
||||||
|
<p>
|
||||||
|
<div>Титаник</div>
|
||||||
|
<img src="screens/titanic.png" width="650" title="Титаник 1">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
На данных моего датасета модель справляется на 52.768%, если в качестве предлагаемых параметров
|
||||||
|
на вход идут ['Gender', 'Debtor', 'International'] (исключает 'International').
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<div>Мой датасет 1</div>
|
||||||
|
<img src="screens/mydataset1.png" width="650" title="Мой датасет 1">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
И на 70.961, если на вход идут ['Gender', 'Debtor', 'Curricular units 2nd sem (approved)']
|
||||||
|
(исключает 'Gender').
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<div>Мой датасет 2</div>
|
||||||
|
<img src="screens/mydataset2.png" width="650" title="Мой датасет 2">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
Такой результат можно объяснить большей значимостью признака 'Curricular units 2nd sem (approved)'
|
||||||
|
вместо 'International' (было показано в предыдущей лабораторной).
|
||||||
|
|
||||||
|
Из-за того, что мы взяли статистически более значимый признак, модель выдает нам большую точность.
|
||||||
|
|
||||||
|
Точность 52.768% указывает на то, что модель работает на уровне случайности, что означает, что она
|
||||||
|
работает не лучше, чем случайное угадывание. Для этого может быть несколько причин:
|
||||||
|
|
||||||
|
1. Признаки все имеет малое значение: то есть для сравнения подаются признаки статистически малозначимые.
|
||||||
|
|
||||||
|
2. Недостаточно данных: Набор данных может содержать недостаточно информации или примеров для
|
||||||
|
изучения моделью. Если набор данных невелик или нерепрезентативен, модель, возможно, не сможет
|
||||||
|
хорошо обобщить новые данные.
|
||||||
|
|
||||||
|
3. Несбалансированные классы: Если классы в вашей целевой переменной несбалансированы
|
||||||
|
(например, случаев, не связанных с отсевом, гораздо больше, чем случаев отсева), модель может
|
||||||
|
быть смещена в сторону прогнозирования класса большинства.
|
||||||
|
|
||||||
|
4. Переобучение: Модель может быть переобучена обучающими данным, что означает, что она изучает шум
|
||||||
|
в данных, а не лежащие в их основе закономерности. Это может произойти, если модель слишком сложна по
|
||||||
|
сравнению с объемом доступных данных.
|
||||||
|
|
||||||
|
5. Недостаточное соответствие: С другой стороны, модель может быть слишком простой, чтобы отразить
|
||||||
|
взаимосвязи в данных. Важно выбрать соответствующий уровень сложности модели.
|
||||||
|
|
||||||
|
<div>
|
||||||
|
При отборе признаков должна учитываться их статистическая значимость, вычисленная различными способами
|
||||||
|
(например с помощью лин регрессии, Random Forest Regressor, линейной корреляции f_regression или других).
|
||||||
|
Так же должно быть достаточно данных, в модели должно быть сведено к минимуму переобучение.
|
||||||
|
</div>
|
4425
antonov_dmitry_lab_3/dataset.csv
Normal file
4425
antonov_dmitry_lab_3/dataset.csv
Normal file
File diff suppressed because it is too large
Load Diff
35
antonov_dmitry_lab_3/lab3.py
Normal file
35
antonov_dmitry_lab_3/lab3.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import pandas as pd
|
||||||
|
from sklearn.metrics import accuracy_score
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
from sklearn.tree import DecisionTreeClassifier
|
||||||
|
|
||||||
|
# прочитали датасет
|
||||||
|
data = pd.read_csv('dataset.csv')
|
||||||
|
|
||||||
|
# определение признаков
|
||||||
|
# целевая переменная - Target
|
||||||
|
X = data[['Gender', 'Debtor', 'Curricular units 2nd sem (approved)']]
|
||||||
|
y = data['Target'] # Assuming 'Dropout' is the target variable
|
||||||
|
|
||||||
|
# разделили данные на тренировочную и тестовую выборки
|
||||||
|
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
|
||||||
|
|
||||||
|
# создали модель decision tree classifier
|
||||||
|
dt_classifier = DecisionTreeClassifier(random_state=42)
|
||||||
|
dt_classifier.fit(X_train, y_train)
|
||||||
|
|
||||||
|
# получили значения модели для 2ух самых важных признаков
|
||||||
|
feature_importances = dt_classifier.feature_importances_
|
||||||
|
|
||||||
|
top_features_indices = feature_importances.argsort()[-2:][::-1]
|
||||||
|
top_features = X.columns[top_features_indices]
|
||||||
|
|
||||||
|
# вывод результата
|
||||||
|
print("2 самых важных признака:", top_features)
|
||||||
|
|
||||||
|
# получили значения модели для проверки точности
|
||||||
|
predictions = dt_classifier.predict(X_test)
|
||||||
|
|
||||||
|
# вычислили точность модели
|
||||||
|
accuracy = accuracy_score(y_test, predictions)
|
||||||
|
print("точность модели:", accuracy)
|
BIN
antonov_dmitry_lab_3/screens/mydataset1.png
Normal file
BIN
antonov_dmitry_lab_3/screens/mydataset1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
BIN
antonov_dmitry_lab_3/screens/mydataset2.png
Normal file
BIN
antonov_dmitry_lab_3/screens/mydataset2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
BIN
antonov_dmitry_lab_3/screens/titanic.png
Normal file
BIN
antonov_dmitry_lab_3/screens/titanic.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
40
antonov_dmitry_lab_3/titanic.py
Normal file
40
antonov_dmitry_lab_3/titanic.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import pandas as pd
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
from sklearn.tree import DecisionTreeClassifier
|
||||||
|
from sklearn.metrics import accuracy_score
|
||||||
|
|
||||||
|
# прочитали датасет
|
||||||
|
data = pd.read_csv("titanic_data.csv")
|
||||||
|
|
||||||
|
# определение признаков
|
||||||
|
features = ['Sex', 'Age', 'sibsp']
|
||||||
|
|
||||||
|
# целевая переменная - выжившие
|
||||||
|
target = 'Survived'
|
||||||
|
|
||||||
|
# разделили данные на тренировочную и тестовую выборки
|
||||||
|
train_data, test_data, train_labels, test_labels = train_test_split(
|
||||||
|
data[features],
|
||||||
|
data[target],
|
||||||
|
test_size=0.2,
|
||||||
|
random_state=42
|
||||||
|
)
|
||||||
|
|
||||||
|
# создали модель decision tree classifier
|
||||||
|
model = DecisionTreeClassifier()
|
||||||
|
|
||||||
|
# натренировали модель
|
||||||
|
model.fit(train_data, train_labels)
|
||||||
|
|
||||||
|
# получили значения модели для проверки точности
|
||||||
|
predictions = model.predict(test_data)
|
||||||
|
|
||||||
|
# вычислили точность модели
|
||||||
|
accuracy = accuracy_score(test_labels, predictions)
|
||||||
|
print("точность модели:", accuracy)
|
||||||
|
|
||||||
|
# нашли два самых важных признака
|
||||||
|
importances = model.feature_importances_
|
||||||
|
indices = (-importances).argsort()[:2]
|
||||||
|
important_features = [features[i] for i in indices]
|
||||||
|
print("два самых важных признака:", important_features)
|
1310
antonov_dmitry_lab_3/titanic_data.csv
Normal file
1310
antonov_dmitry_lab_3/titanic_data.csv
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user