Compare commits

...

2 Commits

Author SHA1 Message Date
Rafael Volkov
2c7a1a1e18 volkov_rafael_lab_3 is done 2023-12-05 12:27:52 +04:00
a8c58683dd kutygin_andrey_lab_3_ready 2023-11-13 20:53:33 +04:00
7 changed files with 20674 additions and 0 deletions

View File

@@ -0,0 +1,118 @@
**Задание**
***
Решите с помощью библиотечной реализации дерева решений задачу из лабораторной работы «Веб-сервис «Дерево решений» по предмету «Методы искусственного интеллекта»на 99% ваших данных. Проверьте работу модели на оставшемся проценте, сделайте вывод
**Как запустить лабораторную**
***
Запустить файл main.py
**Используемые технологии**
***
Библиотеки pandas, scikit-learn, matplotlib, их компоненты
**Описание лабораторной (программы)**
***
В данном коде мы создаем и обучаем модель дерева решений для прогнозирования инцидентов с НЛО на основе набора данных.
1. В первой строке кода мы загружаем данные из CSV-файла 'ufo_data_nuforc.csv' с помощью функции pd.read_csv(). Эти данные содержат информацию о различных инцидентах с НЛО.
2. Далее мы выбираем набор признаков, в данном случае, эти признаки - населенность и время, которые будут использоваться для обучения модели, и сохраняем их в переменную features.
3. Затем преобразуем категориальные признаки в числовой вид при помощи функции pd.get_dummies(). Это необходимо, так как модель дерева решений работает только с числовыми данными.
4. После этого мы разделяем данные на обучающую и тестовую выборки с помощью функции train_test_split(). Обучающая выборка будет использоваться для обучения модели, а тестовая - для проверки ее точности.
5. Создаем модель дерева решений с помощью класса DecisionTreeClassifier() из библиотеки sklearn.tree.
6. Обучаем модель на обучающей выборке с помощью метода fit(). В процессе обучения модель настраивает параметры дерева решений, чтобы лучше предсказывать целевой признак.
7. После обучения модели, мы производим прогнозы на тестовых данных с помощью метода predict().
8. Оцениваем точность модели на тестовой выборке с помощью метода accuracy_score() из библиотеки sklearn.metrics. Этот метод сравнивает фактические значения целевого признака с предсказанными и возвращает точность модели.
9. Наконец, выводим точность модели на тестовой выборке, чтобы оценить, насколько хорошо модель предсказывает инциденты с НЛО.
10. Также, код визуализирует данные в виде графика с помощью библиотеки matplotlib.pyplot, отображая фактические значения целевого признака и предсказания модели. Это помогает наглядно оценить, насколько близки предсказания модели к реальным значениям.
**Результат**
***
Точность модели на тестовой выборке: 0.1377245508982036
Прогнозы по оставшемуся проценту данных: 'cylinder' 'circle' 'sphere' 'disk' 'disk' 'fireball' 'disk' 'oval'
'circle' 'disk' 'disk' 'other' 'light' 'light' 'oval' 'fireball' 'light'
'rectangle' 'chevron' 'unknown' 'sphere' 'oval' 'light' 'circle'
'unknown' 'unknown' 'disk' 'triangle' 'triangle' 'unknown' 'formation'
'unknown' 'cigar' 'unknown' 'light' 'other' 'rectangle' 'light' 'other'
'light' 'cylinder' 'delta' 'sphere' 'other' 'changing' 'fireball'
'cylinder' 'cigar' 'circle' 'triangle' 'light' 'fireball' 'fireball'
'sphere' 'circle' 'light' 'chevron' 'oval' 'oval' 'light' 'unknown'
'triangle' 'other' 'rectangle' 'triangle' 'triangle' 'flash' 'unknown'
'sphere' 'unknown' 'other' 'circle' 'oval' 'light' 'oval' 'formation'
'sphere' 'triangle' 'changing' 'sphere' 'oval' 'unknown' 'circle'
'circle' 'flash' 'light' 'light' 'sphere' 'other' 'other' 'egg' 'unknown'
'other' 'light' 'light' 'disk' 'diamond' 'oval' 'unknown' 'light'
'triangle' 'other' 'light' 'disk' 'unknown' 'light' 'changing' 'sphere'
'triangle' 'circle' 'flash' 'sphere' 'light' 'unknown' 'oval' 'formation'
'light' 'circle' 'unknown' 'other' 'triangle' 'other' 'light' 'disk'
'formation' 'oval' 'triangle' 'triangle' 'light' 'formation' 'oval'
'light' 'light' 'oval' 'disk' 'sphere' 'egg' 'unknown' 'unknown'
'unknown' 'light' 'disk' 'changing' 'light' 'light' 'circle' 'circle'
'formation' 'light' 'light' 'cigar' 'light' 'triangle' 'oval' 'fireball'
'cylinder' 'other' 'circle' 'egg' 'changing' 'triangle' 'circle' 'other'
'oval' 'disk' 'light' 'flash' 'fireball' 'circle' 'circle' 'circle'
'circle' 'light' 'disk' 'fireball' 'other' 'sphere' 'light' 'changing'
'cigar' 'light' 'cylinder' 'rectangle' 'chevron' 'light' 'light' 'light'
'light' 'circle' 'circle' 'light' 'light' 'circle' 'sphere' 'triangle'
'light' 'egg' 'circle' 'fireball' 'sphere' 'sphere' 'triangle' 'light'
'other' 'cigar' 'sphere' 'sphere' 'fireball' 'light' 'light' 'disk'
'oval' 'oval' 'other' 'cigar' 'triangle' 'light' 'light' 'light' 'disk'
'light' 'light' 'light' 'light' 'other' 'light' 'teardrop' 'triangle'
'teardrop' 'fireball' 'sphere' 'cylinder' 'fireball' 'circle' 'egg'
'sphere' 'disk' 'chevron' 'triangle' 'light' 'other' 'light' 'circle'
'rectangle' 'fireball' 'formation' 'light' 'light' 'circle' 'light'
'light' 'formation' 'light' 'triangle' 'light' 'oval' 'light' 'unknown'
'fireball' 'diamond' 'light' 'circle' 'light' 'triangle' 'oval' 'oval'
'cylinder' 'circle' 'light' 'disk' 'light' 'sphere' 'circle' 'light'
'triangle' 'light' 'fireball' 'triangle' 'light' 'flash' 'triangle' 'egg'
'disk' 'oval' 'circle' 'flash' 'light' 'oval' 'sphere' 'light' 'triangle'
'other' 'chevron' 'other' 'circle' 'unknown' 'unknown' 'sphere' 'light'
'cigar' 'light' 'fireball' 'circle' 'diamond' 'fireball' 'triangle'
'diamond' 'sphere' 'circle' 'chevron' 'cylinder' 'light' 'circle'
'fireball' 'unknown' 'light' 'circle' 'fireball' 'light' 'fireball'
'fireball' 'fireball' 'light' 'sphere' 'light' 'sphere' 'sphere'
'formation' 'light' 'fireball' 'fireball' 'disk' 'disk' 'circle'
'rectangle' 'unknown' 'disk' 'unknown' 'disk' 'triangle' 'other' 'sphere'
'diamond' 'light' 'light' 'unknown' 'sphere' 'circle' 'disk' 'circle'
'oval' 'changing' 'other' 'other' 'disk' 'unknown' 'unknown' 'disk'
'rectangle' 'disk' 'light' 'oval' 'unknown' 'sphere' 'light' 'changing'
'disk' 'disk' 'other' 'other' 'disk' 'cylinder' 'disk' 'rectangle'
'light' 'disk' 'disk' 'light' 'fireball' 'formation' 'cigar' 'oval'
'fireball' 'unknown' 'disk' 'light' 'light' 'triangle' 'triangle' 'light'
'sphere' 'triangle' 'sphere' 'circle' 'light' 'oval' 'oval' 'circle'
'oval' 'rectangle' 'disk' 'oval' 'light' 'light' 'other' 'cigar'
'triangle' 'disk' 'cigar' 'other' 'triangle' 'egg' 'unknown' 'triangle'
'light' 'triangle' 'disk' 'changing' 'triangle' 'disk' 'disk' 'rectangle'
'other' 'triangle' 'triangle' 'formation' 'triangle' 'egg' 'sphere'
'fireball' 'triangle' 'rectangle' 'light' 'triangle' 'triangle' 'other'
'light' 'light' 'disk' 'fireball' 'light' 'disk' 'oval' 'triangle'
'other' 'fireball' 'light' 'light' 'triangle' 'unknown' 'cigar' 'light'
'unknown' 'chevron' 'formation' 'disk' 'cigar' 'light' 'sphere' 'cigar'
'unknown' 'triangle' 'other' 'light' 'light' 'triangle' 'diamond' 'light'
'triangle' 'oval' 'changing' 'light' 'flash' 'circle' 'oval' 'other'
'sphere' 'circle' 'triangle' 'unknown' 'teardrop' 'unknown' 'fireball'
'light' 'light' 'cigar' 'cigar' 'light' 'fireball' 'other' 'egg' 'light'
'other' 'unknown' 'unknown' 'changing' 'circle' 'light' 'other' 'unknown'
'unknown' 'light' 'other' 'light' 'unknown' 'cylinder' 'triangle'
'circle' 'light' 'circle' 'circle' 'circle' 'light' 'light' 'changing'
'changing' 'circle' 'circle' 'triangle' 'triangle' 'light' 'light'
'light' 'light' 'other' 'changing' 'triangle' 'cylinder' 'light'
'unknown' 'circle' 'disk' 'sphere' 'oval' 'formation' 'teardrop'
'triangle' 'chevron' 'light' 'unknown' 'unknown' 'other' 'egg' 'circle'
'oval' 'cigar' 'unknown' 'chevron' 'oval' 'cigar' 'fireball' 'circle'
'unknown' 'light' 'sphere' 'fireball' 'changing' 'light' 'circle'
'unknown' 'fireball' 'light' 'sphere' 'light' 'formation' 'circle'
'fireball' 'formation' 'formation' 'formation' 'light' 'other' 'light'
'light' 'circle' 'diamond' 'oval' 'circle' 'oval' 'triangle' 'light'
'disk' 'light' 'other' 'triangle' 'triangle' 'cylinder' 'disk' 'cylinder'
'light' 'oval' 'cigar' 'circle' 'disk' 'light' 'unknown' 'circle' 'other'
'light' 'light' 'light' 'unknown' 'triangle' 'other' 'disk' 'cylinder'
'triangle' 'oval' 'disk' 'light' 'triangle' 'circle' 'light' 'other'
'light' 'other' 'circle' 'disk' 'other' 'triangle' 'oval' 'unknown'
'light' 'triangle' 'unknown' 'circle' 'unknown' 'light' 'fireball'
'fireball' 'rectangle' 'light' 'formation' 'unknown' 'light' 'light'
'formation' 'fireball' 'light' 'light' 'other' 'unknown' 'light'
'triangle' 'fireball' 'triangle' 'triangle' 'flash' 'circle' 'triangle'
'disk' 'light' 'unknown' 'light' 'light' 'fireball' 'circle' 'unknown'
'unknown' 'circle' 'disk' 'chevron' 'disk' 'disk' 'triangle' 'light'
'light' 'disk'
***Вывод:*** Наша модель дерева решений показала низкую точность предсказаний (Точность модели на тестовой выборке: 0.1377245508982036), что означает, что она не очень хорошо предсказывает форму НЛО на основе выбранных признаков (население и время). Из-за чего можно сделать вывод, что возможно, эти признаки недостаточно информативны или недостаточно связаны с формой НЛО.

View File

@@ -0,0 +1,39 @@
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
# Загрузка данных
data = pd.read_csv('ufo_sighting_data.csv')
# Выбор признаков
features = [ 'length_of_encounter_seconds', 'latitude', 'longitude']
target = 'UFO_shape'
# Удаление строк содержащих NaN
data.dropna(inplace=True)
# Удаление столбцов содержащих NaN
data.dropna(axis='columns', inplace=True)
# Разделение данных на обучающую и тестовую выборки
train_data, test_data, train_labels, test_labels = train_test_split(data[features], data[target], test_size=0.2, random_state=42)
# Создание и обучение модели дерева решений
model = DecisionTreeClassifier()
model.fit(train_data, train_labels)
# Прогнозирование на тестовой выборке
predictions = model.predict(test_data)
# Оценка точности модели
accuracy = accuracy_score(test_labels, predictions)
print('Точность модели на тестовой выборке:', accuracy)
# Прогнозирование на оставшемся проценте данных
remaining_data = data.drop(test_data.index)
remaining_predictions = model.predict(remaining_data[features])
# Вывод результатов
print('Прогнозы по оставшемуся проценту данных:', remaining_predictions)
# Сделайте необходимые выводы

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,80 @@
from flask import Flask, render_template, request
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.inspection import permutation_importance
app = Flask(__name__)
# Загрузите данные из файла
bgg_data = pd.read_csv("bgg_dataset.csv", delimiter=";")
# Преобразуйте столбцы Rating Average и Complexity Average в числа с плавающей точкой
bgg_data["Rating Average"] = bgg_data["Rating Average"].apply(lambda x: float(x.replace(',', '.')))
bgg_data["Complexity Average"] = bgg_data["Complexity Average"].apply(lambda x: float(x.replace(',', '.')))
# Создайте целевую переменную (успешность игры)
bgg_data["Success"] = bgg_data["Rating Average"].apply(lambda x: 1 if x > 7.5 else 0)
# Определите признаки и целевую переменную
features_bgg = ["Year Published", "Users Rated", "BGG Rank", "Owned Users", "Complexity Average"]
X_bgg = bgg_data[features_bgg]
y_bgg = bgg_data["Success"]
# Разделите данные на обучающий и тестовый наборы
X_train_bgg, X_test_bgg, y_train_bgg, y_test_bgg = train_test_split(X_bgg, y_bgg, test_size=0.01, random_state=42)
# Создайте и обучите модель дерева решений
model_bgg = DecisionTreeClassifier()
model_bgg.fit(X_train_bgg, y_train_bgg)
# Оцените модель на тестовом наборе данных
y_pred_bgg = model_bgg.predict(X_test_bgg)
accuracy_bgg = accuracy_score(y_test_bgg, y_pred_bgg)
# Оценка важности признаков с использованием permutation_importance
result = permutation_importance(model_bgg, X_test_bgg, y_test_bgg, n_repeats=30, random_state=42)
# Важности признаков
feature_importances_bgg = result.importances_mean
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "POST":
# Получите данные из запроса
year_published = int(request.form["year_published"])
users_rated = int(request.form["users_rated"])
bgg_rank = int(request.form["bgg_rank"])
owned_users = int(request.form["owned_users"])
complexity_average = float(request.form["complexity_average"].replace(',', '.'))
# Создайте DataFrame с введенными данными
input_data_bgg = pd.DataFrame({
"Year Published": [year_published],
"Users Rated": [users_rated],
"BGG Rank": [bgg_rank],
"Owned Users": [owned_users],
"Complexity Average": [complexity_average]
})
# Прогнозируйте успешность игры
prediction_bgg = model_bgg.predict(input_data_bgg)[0]
# Определите результат
result_bgg = "Высокая оценка" if prediction_bgg == 1 else "Низкая оценка"
# Передайте переменные в шаблон
return render_template("index.html", accuracy_bgg=accuracy_bgg, success_count_bgg=sum(y_test_bgg),
failure_count_bgg=len(y_test_bgg) - sum(y_test_bgg),
feature_importances_bgg=feature_importances_bgg, prediction_result_bgg=result_bgg,
X_train_bgg_columns=X_train_bgg.columns)
# Передайте переменные в шаблон
return render_template("index.html", accuracy_bgg=accuracy_bgg, success_count_bgg=sum(y_test_bgg),
failure_count_bgg=len(y_test_bgg) - sum(y_test_bgg),
feature_importances_bgg=feature_importances_bgg,
X_train_bgg_columns=X_train_bgg.columns)
if __name__ == "__main__":
app.run(host="localhost", port=5000)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,43 @@
Общее задание:
Решите с помощью библиотечной реализации дерева решений задачу из лабораторной работы «Веб-сервис «Дерево решений» по предмету
«Методы искусственного интеллекта» на 99% ваших данных. Проверьте работу модели на оставшемся проценте, сделайте вывод.
Задание по вариантам:
Датасет: Board Games
Ссылки:
https://www.kaggle.com/datasets/andrewmvd/board-games
Задача для древа решений:
Классифицировать игры на игры с высокой и низкой оценкой на основе их характеристик.
Признаки:
Year Published
Users Rated
BGG Rank
Owned Users
Complexity Average
Целевая переменная: Успех игры (Высокая оценка/Низкая оценка), если Rating Average > 7.5, то высокая оценка.
Запуск через файл app.py
Технологии:
Flask: Фреймворк для веб-приложений на языке программирования Python.
Pandas: Библиотека для обработки и анализа данных.
scikit-learn: Библиотека для машинного обучения в Python.
Описание работы программы:
Программа представляет собой веб-приложение, использующее машинное обучение для классификации на основе данных об играх на сайте BoardGameGeek (BGG). Она загружает данные из CSV-файла, предобрабатывает их, обучает модель дерева решений на основе выбранных признаков (год выпуска, количество оценок пользователей, рейтинг BGG и другие), а затем предоставляет интерфейс для ввода данных о новой игре и получения предсказания о ее "успешности" (высокий или низкий рейтинг).
Входные данные:
Год выпуска игры.
Количество оценивших игру.
Рейтинг BGG игры.
Ранг BGG игры.
Количество владельцев игры.
Средняя сложность игры.
Выходные данные:
Классификация игры: "Высокая оценка" или "Низкая оценка".
Дополнительная информация: Точность модели, количество игр с высокой и низкой оценкой, важность признаков.

View File

@@ -0,0 +1,49 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Классификация игр</title>
</head>
<body>
<h1>Классификация игр</h1>
<!-- Форма для ввода данных -->
<form method="POST">
<label for="year_published">Год выпуска игры:</label>
<input type="text" name="year_published" id="year_published" required>
<br>
<label for="users_rated">Количество оценивших игру:</label>
<input type="text" name="users_rated" id="users_rated" required>
<br>
<label for="bgg_rank">BGG Рейтинг игры:</label>
<input type="text" name="bgg_rank" id="bgg_rank" required>
<br>
<label for="owned_users">Количество владельцев игры:</label>
<input type="text" name="owned_users" id="owned_users" required>
<br>
<label for="complexity_average">Средняя сложность игры:</label>
<input type="text" name="complexity_average" id="complexity_average" required>
<br>
<button type="submit">Выполнить</button>
</form>
<!-- Результат классификации -->
{% if prediction_result_bgg %}
<h2>Результат классификации:</h2>
<p>Игра классифицирована как: {{ prediction_result_bgg }}</p>
{% endif %}
<!-- Другие результаты (точность, количество успешных и неуспешных игр, важности признаков) -->
<h2>Другие результаты:</h2>
<p>Точность модели: {{ "%.4f"|format(accuracy_bgg) }}</p>
<p>Количество игр с высокой оценкой: {{ success_count_bgg }}</p>
<p>Количество игр с низкой оценкой: {{ failure_count_bgg }}</p>
<p>Важность признаков:</p>
<ul>
{% for idx in range(feature_importances_bgg|length) %}
{% set feature = X_train_bgg_columns[idx] %}
<li>{{ feature }}: {{ "%.4f"|format(feature_importances_bgg[idx]) }}</li>
{% endfor %}
</ul>
</body>
</html>