Compare commits

...

2 Commits

Author SHA1 Message Date
0941dcd3fb lab5 ready 2023-11-17 00:28:29 +04:00
a8c58683dd kutygin_andrey_lab_3_ready 2023-11-13 20:53:33 +04:00
14 changed files with 852479 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,48 @@
# Лабораторная работа №5
> Регрессия
### Как запустить лабораторную работу
1. Установить python, numpy, sklearn
2. Запустить команду `python main1.py` в корне проекта для запуска 1 части
3. Запустить команду `python main2.py` в корне проекта для запуска 2 части
### Использованные технологии
* Язык программирования `python`
* Библиотеки `numpy, sklearn`
* Среда разработки `PyCharm`
### Что делает программа?
Цель программы: на основе данных об автомобилях на вторичном рынке обучить модель регрессии на предсказание цены.
Используемая модель: Лассо-регрессия
#### Определим признаки
LINEAR [('Year', 1.0), ('Mileage', 0.4868), ('State', 0.0729), ('Vin', 0.015), ('City', 0.0037), ('Model', 0.0002), ('Make', 0.0)]
RIDGE [('Year', 1.0), ('Mileage', 0.4868), ('State', 0.0729), ('Vin', 0.015), ('City', 0.0037), ('Model', 0.0002), ('Make', 0.0)]
LASSO [('Year', 1.0), ('Mileage', 0.4868), ('State', 0.0729), ('Vin', 0.015), ('City', 0.0037), ('Model', 0.0002), ('Make', 0.0)]
RFE [('Year', 1.0), ('State', 1.0), ('Mileage', 1.0), ('City', 0.5), ('Vin', 0.5), ('Model', 0.0), ('Make', 0.0)]
f_regression [('Year', 1.0), ('State', 0.1438), ('Vin', 0.0878), ('City', 0.0845), ('Mileage', 0.0711), ('Model', 0.0335), ('Make', 0.0)]
MEAN [('Year', 0.2), ('Mileage', 0.0974), ('State', 0.0146), ('Vin', 0.003), ('City', 0.0007), ('Model', 0.0), ('Make', 0.0)]
Отсечение признаков, у которых MEAN ниже 0.001. Выделенные признаки для дальнейшего обучения модели Lasso.
##### Запуск модели Lasso с параметрами
![main2.py](main2.png)
#### Итоговые выводы
Были выбраны основные признаки для обучения модели, которые имеют большее влияние на предсказание.
Проведены несколько тестов по обучению модели Lasso с разными alpha (силой влияния регуляризации),
но это не оказало большого влияния. Точность в 94.33% приемлемая.

View File

@@ -0,0 +1,8 @@
LINEAR_TITLE = 'LINEAR'
RIDGE_TITLE = 'RIDGE'
LASSO_TITLE = 'LASSO'
RFE_TITLE = 'RFE'
F_REGRESSION_TITLE = 'f_regression'
DATA_SIZE = 1000
FEATURES_AMOUNT = 14

View File

@@ -0,0 +1,23 @@
import pandas as pd
from config import DATA_SIZE
def load_dataset():
data = pd.read_csv('true_car_listings.csv')[:DATA_SIZE]
names = ['Year', 'Mileage', 'City', 'State', 'Vin', 'Make', 'Model']
convert_to_num(data, 'City')
convert_to_num(data, 'State')
convert_to_num(data, 'Vin')
convert_to_num(data, 'Make')
convert_to_num(data, 'Model')
Y = data['Price']
X = data[names]
return X, Y, names
def convert_to_num(data, col):
unique_numbers = list(set(data[col]))
data[col] = data[col].apply(unique_numbers.index)

View File

@@ -0,0 +1,20 @@
from sklearn.linear_model import Lasso, Ridge, LinearRegression
from sklearn.feature_selection import RFE, f_regression
def fit_models(x, y):
lm = LinearRegression()
lm.fit(x, y)
ridge = Ridge(alpha=0.001)
ridge.fit(x, y)
lasso = Lasso(alpha=0.001)
lasso.fit(x, y)
rfe = RFE(lasso, step=2)
rfe.fit(x, y)
f, pval = f_regression(x, y, center=False)
return lm, ridge, lasso, rfe, f

View File

@@ -0,0 +1,17 @@
from scores import MAPE
from sklearn.linear_model import Lasso
def lasso_test(X_train, X_test, y_train, y_test, alpha):
lasso = Lasso(alpha=alpha)
# Train model
lasso.fit(X_train, y_train)
# Show score of model
lasso_predict = lasso.predict(X_test)
lasso_MAPE = MAPE(y_test, lasso_predict)
print("MAPE value: ", lasso_MAPE)
Accuracy = 100 - lasso_MAPE
print(
'Accuracy of Lasso Regression(alpha={:}): {:0.2f}%.'.format(alpha, Accuracy))

View File

@@ -0,0 +1,13 @@
from dataset import load_dataset
from fit import fit_models
from ranks import calc_mean, get_ranks
x, y, names = load_dataset()
lm, ridge, lasso, rfe, f = fit_models(x, y)
ranks = get_ranks(lm, ridge, lasso, rfe, f, names)
mean = calc_mean(ranks)
print("MEAN", mean)

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

View File

@@ -0,0 +1,15 @@
from sklearn.model_selection import train_test_split
from dataset import load_dataset
from lasso_test import lasso_test
# Load dataset
X, Y, name = load_dataset()
# Split dataset
X_train, X_test, y_train, y_test = train_test_split(
X, Y, test_size=0.05, random_state=42)
for i in range(6):
lasso_test(X_train, X_test, y_train, y_test, i/pow(10, i))

View File

@@ -0,0 +1,48 @@
import config
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from operator import itemgetter
from sklearn.linear_model import Lasso, Ridge, LinearRegression
def rank_to_dict(ranks, names):
ranks = np.abs(ranks)
minmax = MinMaxScaler()
ranks = minmax.fit_transform(
np.array(ranks).reshape(len(names), 1)).ravel()
ranks = map(lambda x: round(x, 4), ranks)
ranks = dict(zip(names, ranks))
ranks = sorted(ranks.items(), key=itemgetter(1), reverse=True)
return ranks
def flip_array(arr):
return -1 * arr + np.max(arr)
def get_ranks(lm: LinearRegression, ridge: Ridge, lasso: Lasso, rfe, f, names):
ranks = dict()
ranks[config.LINEAR_TITLE] = rank_to_dict(lm.coef_, names)
ranks[config.RIDGE_TITLE] = rank_to_dict(ridge.coef_, names)
ranks[config.LASSO_TITLE] = rank_to_dict(lasso.coef_, names)
ranks[config.RFE_TITLE] = rank_to_dict(flip_array(rfe.ranking_), names)
ranks[config.F_REGRESSION_TITLE] = rank_to_dict(f, names)
for key, value in ranks.items():
print(key, value, '\n')
return ranks
def calc_mean(ranks):
mean = {}
for key, value in ranks.items():
for item in value:
if (item[0] not in mean):
mean[item[0]] = 0
mean[item[0]] += item[1]
for key, value in mean.items():
res = value/len(ranks)
mean[key] = round(res, 4)
return sorted(mean.items(), key=itemgetter(1), reverse=True)

View File

@@ -0,0 +1,6 @@
import numpy as np
def MAPE(Y_actual, Y_Predicted):
mape = np.mean(np.abs((Y_actual - Y_Predicted)/Y_actual))*100
return mape

File diff suppressed because it is too large Load Diff