Compare commits
2 Commits
orlov_arte
...
volkov_raf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
85c872b17a | ||
| a8c58683dd |
118
kutygin_andre_lab_3/README.md
Normal file
118
kutygin_andre_lab_3/README.md
Normal 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), что означает, что она не очень хорошо предсказывает форму НЛО на основе выбранных признаков (население и время). Из-за чего можно сделать вывод, что возможно, эти признаки недостаточно информативны или недостаточно связаны с формой НЛО.
|
||||
39
kutygin_andre_lab_3/main.py
Normal file
39
kutygin_andre_lab_3/main.py
Normal 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)
|
||||
|
||||
# Сделайте необходимые выводы
|
||||
1
kutygin_andre_lab_3/ufo_sighting_data.csv
Normal file
1
kutygin_andre_lab_3/ufo_sighting_data.csv
Normal file
File diff suppressed because one or more lines are too long
77
volkov_rafael_lab_6/app.py
Normal file
77
volkov_rafael_lab_6/app.py
Normal 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)
|
||||
20344
volkov_rafael_lab_6/bgg_dataset.csv
Normal file
20344
volkov_rafael_lab_6/bgg_dataset.csv
Normal file
File diff suppressed because it is too large
Load Diff
BIN
volkov_rafael_lab_6/mlp_regressor_model.joblib
Normal file
BIN
volkov_rafael_lab_6/mlp_regressor_model.joblib
Normal file
Binary file not shown.
37
volkov_rafael_lab_6/readme.md
Normal file
37
volkov_rafael_lab_6/readme.md
Normal 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 для введенных пользователем данных.
|
||||
36
volkov_rafael_lab_6/templates/index.html
Normal file
36
volkov_rafael_lab_6/templates/index.html
Normal 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>
|
||||
Reference in New Issue
Block a user