Compare commits

...

2 Commits

Author SHA1 Message Date
88f5268b31 mashkova_margarita_lab_3 ready 2023-11-22 06:33:50 +04:00
a8c58683dd kutygin_andrey_lab_3_ready 2023-11-13 20:53:33 +04:00
11 changed files with 1674 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,88 @@
# Лабораторная работа №3
## ПИбд-42 Машкова Маргарита (Вариант 19)
## Задание
Решить с помощью библиотечной реализации дерева решений на 99% данных задачу:
Выявить зависимость стоимости телефона от других его признаков.
Проверить работу модели на оставшемся проценте, сделать вывод.
### Данные:
> Датасет о характеристиках мобильных телефонов и их ценах
>
> Ссылка на датасет в kaggle: [Mobile Phone Specifications and Prices](https://www.kaggle.com/datasets/pratikgarai/mobile-phone-specifications-and-prices/data)
### Модели:
> - DecisionTreeClassifier
## Запуск программы
Для запуска программы необходимо запустить файл main.py
## Используемые технологии
> **Язык программирования:** python
>
> **Библиотеки:**
> - `pandas` - предоставляет функциональность для обработки и анализа набора данных.
> - `sklearn` - предоставляет широкий спектр инструментов для машинного обучения, статистики и анализа данных.
## Описание работы программы
### Описание набора данных
Данный набор содержит характеристики различных телефонов, в том числе их цену.
Названия столбцов набора данных и их описание:
- **Id** - идентификатор строки (int)
- **Name** - наименование телефона (string)
- **Brand** - наименование бренда телефона (string)
- **Model** - модель телефона (string)
- **Battery capacity (mAh)** - емкость аккумулятора в мАч (int)
- **Screen size (inches)** - размер экрана в дюймах по противоположным углам (float)
- **Touchscreen** - имеет телефон сенсорный экран или нет (string - Yes/No)
- **Resolution x** - разрешение телефона по ширине экрана (int)
- **Resolution y** - разрешение телефона по высоте экрана (int)
- **Processor** - количество ядер процессора (int)
- **RAM (MB)** - доступная оперативная память телефона в МБ (int)
- **Internal storage (GB)** - внутренняя память телефона в ГБ (float)
- **Rear camera** - разрешение задней камеры в МП (0, если недоступно) (float)
- **Front camera** - разрешение фронтальной камеры в МП (0, если недоступно) (float)
- **Operating system** - ОС, используемая в телефоне (string)
- **Wi-Fi** - имеет ли телефон функция Wi-Fi (string - Yes/No)
- **Bluetooth** - имеет ли телефон функцию Bluetooth (string - Yes/No)
- **GPS** - имеет ли телефон функцию GPS (string - Yes/No)
- **Number of SIMs** - количество слотов для SIM-карт в телефоне (int)
- **3G** - имеет ли телефон сетевую функкцию 3G (string - Yes/No)
- **4G/ LTE** - имеет ли телефон сетевую функкцию 4G/LTE (string - Yes/No)
- **Price** - цена телефона в индийских рупиях (int)
### Обработка данных
Выведем информацию о данных при помощи функции DataFrame `data.info()`:
![Информация о данных](data_info.png)
Данные не содержат пустых строк. Все значения в столбцах необходимо привести к численным значениям.
Для преобразования полей, содержащих значения Yes/No воспользуемся числовым кодированием `LabelEncoder`.
Значение "Yes" станет равным 1, значение "No" - 0.
Остальные строковых поля будем преобразовывать при помощи векторайзер с суммированием `TfidfVectorizer`.
Данные после обработки:
![Обработанные данные](data_processed.png)
Далее создается Y - массив значений целового признака (цены).
Задача классификации решается дважды: сначала на всех признаках, затем на выявленных четырех важных.
Сначала в X передаются все признаки, выборка разделяется на тестовые (1%) и обучающие данные (99%),
модель дерева решений обучается, отображаются список важности признаков (по убыванию) и оценка модели.
Затем из списка берутся первые 4 признаки и задача решается повторно.
## Тесты
### Результат решения задачи классификации на всех признаках:
![Решение задачи на всех признаках](all_features.png)
### Результат решения задачи классификации на выявленных четырех важных признаках:
![Решение задачи на значимых признаках](important_features.png)
**Вывод:** исходя из полученных результатов, средняя точность работы модели на всех признаках составляет 7%,
т.е. модель работает слишком плохо на данных. При выборе только важных признаков средняя точность падает до 0.
Большое значение среднеквадратичной ошибки подтверждает тот факт, что модель имеет низкое качество.

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,68 @@
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import mean_squared_error
filename = "mobiles.csv"
# Считываем данные из файла в DataFrame
data = pd.read_csv(filename, sep=',')
# Удаляем столбец с идентификатором
data.pop("Id")
# print(data)
# data.info()
# Приведение строковых значений признаков к численным при помощи векторайзера с суммированием
FEATURE_COLUMNS_TO_PROC = ['Name', 'Brand', 'Model', 'Operating system']
for column_name in FEATURE_COLUMNS_TO_PROC:
vectorizer = TfidfVectorizer()
train_text_feature_matrix = vectorizer.fit_transform(data[column_name]).toarray()
a = pd.DataFrame(train_text_feature_matrix)
data[column_name] = a[a.columns[1:]].apply(lambda x: sum(x.dropna().astype(float)), axis = 1)
# Приведение строковых значений к численным при помощи числового кодирования LabelEncoder
le = LabelEncoder()
data['Touchscreen'] = le.fit_transform(data['Touchscreen'])
data['Wi-Fi'] = le.fit_transform(data['Wi-Fi'])
data['Bluetooth'] = le.fit_transform(data['Bluetooth'])
data['GPS'] = le.fit_transform(data['GPS'])
data['3G'] = le.fit_transform(data['3G'])
data['4G/ LTE'] = le.fit_transform(data['4G/ LTE'])
# Разделение данных на обучающую и тестовую выборки
# В Y помещаем целевой признак - цену
Y = data['Price']
def predict(X):
# Размер обучающей выборки - 99%, тестовой - 1%
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.01, random_state=42)
# Создание и обучение модели DecisionTreeClassifier
dtc = DecisionTreeClassifier(max_depth=5, random_state=241)
dtc.fit(X_train, y_train)
# Создание DataFrame с именами признаков и их важностью
feature_importance_df = pd.DataFrame({'Признак': X_train.columns, 'Важность': dtc.feature_importances_}) \
.sort_values(by='Важность', ascending=False)
print("Важность признаков:")
print(feature_importance_df)
mean_accuracy = dtc.score(X_test, y_test)
y_pred = dtc.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Среднеквадратичная ошибка: {mse}")
print(f"Средняя точность: {mean_accuracy}")
return feature_importance_df
print("\n***Решение задачи классификации, используя все параметры***")
# В Х помещаем все признаки, кроме цены
X = data.drop(columns='Price')
importance_df = predict(X)
print("\n***Решение задачи классификации, используя только 4 значимых параметра***")
# Выбираем только 4 значимых признака
important_features = importance_df.iloc[:4, 0].tolist()
X_important = data[important_features]
predict(X_important)

File diff suppressed because it is too large Load Diff