Compare commits

...

2 Commits

Author SHA1 Message Date
Rafael Volkov
85c872b17a volkov_rafael_lab_6 is done 2023-12-05 12:28:39 +04:00
a8c58683dd kutygin_andrey_lab_3_ready 2023-11-13 20:53:33 +04:00
8 changed files with 20652 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,77 @@
from flask import Flask, render_template, request
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.pipeline import Pipeline
import joblib
app = Flask(__name__)
# Загрузка данных
data_bgg = pd.read_csv("bgg_dataset.csv", delimiter=";")
# Выбор нужных столбцов
selected_columns_bgg = ['Year Published', 'Users Rated', 'Rating Average', 'BGG Rank', 'Owned Users', 'Complexity Average']
features = data_bgg[selected_columns_bgg]
# Замена запятых на точки в столбцах 'Rating Average' и 'Complexity Average'
features['Rating Average'] = features['Rating Average'].str.replace(',', '.').astype(float)
features['Complexity Average'] = features['Complexity Average'].str.replace(',', '.').astype(float)
# Замена пропущенных значений средними значениями по столбцам
features = features.fillna(features.mean())
# Разделение данных
X_bgg = features.drop('Rating Average', axis=1)
y_bgg = features['Rating Average']
X_train_bgg, X_test_bgg, y_train_bgg, y_test_bgg = train_test_split(X_bgg, y_bgg, test_size=0.2, random_state=42)
# Масштабирование данных
scaler = StandardScaler()
X_train_bgg_scaled = scaler.fit_transform(X_train_bgg)
X_test_bgg_scaled = scaler.transform(X_test_bgg)
# Обучение модели нейронной сети
mlp_regressor_model = Pipeline([
('scaler', StandardScaler()),
('mlp_regressor', MLPRegressor(hidden_layer_sizes=(100, 50), max_iter=2000, random_state=42))
])
mlp_regressor_model.fit(X_train_bgg_scaled, y_train_bgg)
# Сохранение модели
joblib.dump(mlp_regressor_model, 'mlp_regressor_model.joblib')
# Загрузка модели
mlp_regressor_model = joblib.load('mlp_regressor_model.joblib')
# Обновление маршрута для предсказания
@app.route('/')
def index():
return render_template('index.html')
@app.route('/predict', methods=['POST'])
def predict():
if request.method == 'POST':
# Получение данных из формы
input_data_bgg = {
'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'])
}
# Преобразование данных в DataFrame
input_df_bgg = pd.DataFrame([input_data_bgg])
# Масштабирование входных данных
input_data_scaled = scaler.transform(input_df_bgg)
# Предсказание
prediction_bgg = mlp_regressor_model.predict(input_data_scaled)[0]
return render_template('index.html', prediction_bgg=prediction_bgg)
if __name__ == '__main__':
app.run(debug=True)

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,37 @@
Общее задание:
Использовать нейронную сеть (четные варианты MLPRegressor, нечетные MLPClassifier) для данных из датасета выбранного для курсовой работы, самостоятельно сформулировав задачу. Интерпретировать результаты и оценить, насколько хорошо она подходит для решения сформулированной вами задачи.
Задание по вариантам:
модель MLPRegressor
Датасет: Board Games
Ссылки:
https://www.kaggle.com/datasets/andrewmvd/board-games
Задача для нейронной сети:
предсказание рейтинга игры на основе характеристик: 'Year Published', 'Users Rated', 'Rating Average', 'BGG Rank', 'Owned Users', 'Complexity Average'
Запуск через файл app.py
Технологии:
Flask: фреймворк для создания веб-приложений на языке Python.
Pandas: библиотека для работы с данными и анализа данных.
scikit-learn: библиотека для машинного обучения.
Описание работы программы:
Программа представляет собой веб-приложение с использованием Flask.
Загружает данные из CSV-файла, обрабатывает их (заменяет запятые на точки, заполняет пропущенные значения средними) и разделяет на обучающий и тестовый наборы.
Обучает модель (линейная регрессия или нейронная сеть) на основе выбранных признаков.
Пользователь вводит данные через веб-форму (Year Published, Users Rated, BGG Rank, Owned Users, Complexity Average).
Программа использует обученную модель для предсказания Rating Average на основе введенных данных.
Предсказанное значение выводится пользователю на веб-странице.
Входные данные (вводимые пользователем через веб-форму):
Year Published (год публикации игры).
Users Rated (количество пользователей, оценивших игру).
BGG Rank (рейтинг игры на BoardGameGeek).
Owned Users (количество пользователей, которые владеют игрой).
Complexity Average (средняя сложность игры).
Выходные данные:
Прогнозируемое значение Rating Average для введенных пользователем данных.

View File

@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Board Game Rating Prediction</title>
</head>
<body>
<h1>Board Game Rating Prediction</h1>
<!-- Форма для ввода данных -->
<form method="post" action="/predict">
<label for="Year Published">Year Published:</label>
<input type="number" name="Year Published" required><br>
<label for="Users Rated">Users Rated:</label>
<input type="number" name="Users Rated" required><br>
<label for="BGG Rank">BGG Rank:</label>
<input type="number" name="BGG Rank" required><br>
<label for="Owned Users">Owned Users:</label>
<input type="number" name="Owned Users" required><br>
<label for="Complexity Average">Complexity Average:</label>
<input type="number" step="0.01" name="Complexity Average" required><br>
<button type="submit">Predict Rating Average</button>
</form>
<!-- Отображение предсказания -->
{% if prediction_bgg %}
<p>Predicted Rating Average: {{ prediction_bgg }}</p>
{% endif %}
</body>
</html>