arzamaskina_milana_lab_3 is ready

This commit is contained in:
Арзамаскина Милана 2023-12-01 22:12:53 +04:00
parent a8c58683dd
commit b3c9da8f15
4 changed files with 63284 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,83 @@
## Лабораторная работа №3
### Деревья решений
## Задание:
+ Задача регресcии: предсказание общего объема выбросов СО2 (Total) страной (Country) за определённый год (Year).
+ Задача классификации: предсказание процента выбросов СО2 от добычи нефти (procent oil) страной (Country)
с учётом общего объёма выбросов (Total) за определённый год (Year)
(или: какая часть выбросов придётся на добычу нефти).
## Данные:
Этот набор данных обеспечивает углубленный анализ глобальных выбросов CO2 на уровне страны, позволяя лучше понять,
какой вклад каждая страна вносит в глобальное совокупное воздействие человека на климат.
Он содержит информацию об общих выбросах, а также от добычи и сжигания угля, нефти, газа, цемента и других источников.
Данные также дают разбивку выбросов CO2 на душу населения по странам, показывая,
какие страны лидируют по уровням загрязнения, и определяют потенциальные области,
где следует сосредоточить усилия по сокращению выбросов.
Этот набор данных необходим всем, кто хочет получить информацию о своем воздействии на окружающую среду
или провести исследование тенденций международного развития.
Данные организованы с использованием следующих столбцов:
+ Country: название страны
+ ISO 3166-1 alpha-3: трехбуквенный код страны
+ Year: год данных исследования
+ Total: общее количество CO2, выброшенный страной в этом году
+ Coal: количество CO2, выброшенное углем в этом году
+ Oil: количество выбросов нефти
+ Gas: количество выбросов газа
+ Cement: количество выбросов цемента
+ Flaring: сжигание на факелах уровни выбросов
+ Other: другие формы, такие как промышленные процессы
+ Per Capita: столбец «на душу населения»
### Какие технологии использовались:
Используемые библиотеки:
* math
* pandas
* sklearn
### Как запустить:
* установить python, math, pandas, sklearn
* запустить проект (стартовая точка - main.py)
### Что делает программа:
* Загружает набор данных из файла 'CO2.csv', который содержит информацию о выбросах странами CO2 в год от различной промышленной деятельности.
* Очищает набор данных путём удаления строк с нулевыми значениями из набора.
* Добавляет в набор столбец с хеш-кодом наименования страны.
* Добавляет в набор столбец 'procent oil' - процент выбросов от добычи нефтепродуктов от общего объема выбросов страны за год (для возможности классификации).
* Выбирает набор признаков (features) из данных, которые будут использоваться для обучения моделей регрессии и классификации.
* Определяет задачу регрессии, где целевой переменной (task) является 'Total', и задачу классификации, где целевой переменной является 'procent oil'.
* Делит данные на обучающий и тестовый наборы для обеих задач с использованием функции train_test_split. Тестовый набор составляет 1% от исходных данных.
* Создает и обучает деревья решений для регрессии и классификации с использованием моделей DecisionTreeRegressor и DecisionTreeClassifier.
* Предсказывает значения целевой переменной на тестовых наборах для обеих задач.
* Оценивает качество моделей с помощью оценки точности (score) для регрессии и классификации.
* Выводит важности признаков для обеих задач.
#### Результаты работы программы:
![Result](img.png)
### Вывод:
Для задачи регрессии, где целью было предсказание общего объема выбросов СО2 страной за определённый год, модель дерева решений показала оценку точности равную 0.99. Это очень хороший показатель, значит модель вполне приемлемо предсказывает объём выбросов определенной страной в определенный год.
Для задачи классификации, где целью было предсказать какая часть выбросов придётся на добычу нефти, модель дерева решений показала более низкую точность - 18%. Это означает, что модель классификации не справляется с предсказанием доли выбросов от добычи нефтепродуктов на основе выбранных признаков.
Низкая точность указывает на необходимость улучшения модели или выбора других методов для решения задачи классификации.
Анализ важности признаков для задачи регрессии показал, что наибольший вклад в предсказание объёма выбросов страной за год вносит признак 'hashcode' или 'Country'.
Наименование страны оказывает наибольшее влияние на результаты модели.
Из этого можно сделать вывод, что количество выбросов CO2 определённой страной не сильно изменяется с течением времени
и каждая страна ежегодно производит примерно одинаковый объём выбросов CO2, что может быть связано с наличием месторождений ископаемых.
Для задачи классификации наибольший вклад в предсказание стоимости жилья вносят признаки 'Year' и 'Total'.
Эти признаки имеют наибольшее значение при определении классов по объёму выбросов от добычи нефтепродуктов.

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View File

@ -0,0 +1,96 @@
import math
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.model_selection import train_test_split
### Деревья решений для регрессии и классификации
### с использованием моделей DecisionTreeRegressor и DecisionTreeClassifier
# Загрузка данных
data = pd.read_csv('CO2.csv')
data = data.dropna()
# Хеширование наименований стран
countries = {}
for country in data['Country']:
countries[country] = hash(country)
hash_column = []
for country in data['Country']:
hash_column.append(countries[country])
data.insert(loc=0, column='hashcode', value=hash_column)
# Добавление колонки "процент выбросов от добычи нефти в стране за год" для классификации
procent_oil = []
oils = []
totals = []
for oil in data['Oil']:
oils.append(oil)
for total in data['Total']:
totals.append(total)
for i in range(len(oils)):
procent_oil.append(math.ceil(oils[i]/totals[i]*100))
data.insert(loc=0, column='procent oil', value=procent_oil)
#------ Дерево решений для регрессии ------#
# ЗАДАЧА: предсказание общего объема выбросов СО2 страной за определённый год.
# Необходимые признаки для дерева регрессии
features_for_regr = data[['Year', 'hashcode']]
# Задача дерева регрессии
task_regr = data['Total']
# Разделение данных на обучающий и тестовый наборы для регрессии
X_train_r, X_test_r, \
y_train_r, y_test_r = train_test_split(features_for_regr, task_regr, test_size=0.01, random_state=250)
# Создание и обучение дерева решений для регрессии
model_regr = DecisionTreeRegressor(random_state=250)
model_regr.fit(X_train_r, y_train_r)
# Предсказание на тестовом наборе для регрессии
y_pred_r = model_regr.predict(X_test_r)
# Точечная оценка модели
score_r = model_regr.score(X_test_r, y_test_r)
print("\n\nТочность дерева регрессии:", score_r)
# Важности признаков для дерева регрессии
imp_regr = model_regr.feature_importances_
print("Важность признаков для дерева регрессии: ")
print("Важность 'Year':", imp_regr[0])
print("Важность 'hashcode':", imp_regr[1], "\n\n")
#------ Дерево решений для классификации ------#
# ЗАДАЧА: предсказание процента выбросов СО2 от добычи нефти страной за определённый год
# с учётом общего объёма выбросов за год (или: какая часть выбросов придётся на добычу нефти).
# Необходимые признаки для дерева классификации
features_for_class = data[['Total', 'Year', 'hashcode']]
# Задача дерева классификации
task_class = data['procent oil']
# Разделение данных на обучающий и тестовый наборы для классификации
X_train_c, X_test_c, \
y_train_c, y_test_c = train_test_split(features_for_class, task_class, test_size=0.01, random_state=250)
# Создание и обучение дерева решений для классификации
model_class = DecisionTreeClassifier(random_state=250)
model_class.fit(X_train_c, y_train_c)
# Предсказание на тестовом наборе для классификации
y_pred_c = model_class.predict(X_test_c)
# Точечная оценка модели
score_c = model_class.score(X_test_c, y_test_c)
print("Точность дерева классификации:", score_c)
# Важности признаков для дерева классификации
imp_class = model_class.feature_importances_
print("Важность признаков для дерева классификации: ")
print("Важность 'Total':", imp_class[0])
print("Важность 'Year':", imp_class[1])
print("Важность 'hashcode':", imp_class[2])