Compare commits

...

2 Commits

Author SHA1 Message Date
213d03234c for kurs work 2023-12-07 17:00:41 +04:00
017623e084 senkin_alexander_lab_3 is ready 2023-10-30 21:13:41 +04:00
6 changed files with 67777 additions and 0 deletions

1
senkin_alexander_lab_3/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.idea/

View File

@@ -0,0 +1,32 @@
Лабораторная №3
Вариант №2
Задание на лабораторную:
Решите с помощью библиотечной реализации дерева решений задачу: Запрограммировать дерево решений как минимум на 99% ваших данных для задачи: Количество жертв(inj) от года(yr), магнитуды(mag) и фатальных исходов(fat) от торнадо. Проверить работу модели на оставшемся проценте, сделать вывод.
Как запустить лабораторную работу:
Чтобы увидеть работу программы, нужно запустить исполняемый питон файл senkin_alexander_lab_3.py, после чего в консоли будут выведены первые 5 строк данных, показатель score насколько хорошо модель соответсвует данным, все признаки, их ранжирование, а также среднюю ошибку.
Библиотеки
Sklearn. Предоставляет инструменты и алгоритмы, которые упрощают задачи, связанные с машинным обучением.
Описание программы:
- Загружаем данные из csv файла
- С помощью функции train_test_split разделяем данные на тестовые и обучающие в соотношении 1 к 99
- Добавляем две модели для сравнения их работы:
- Дерево решений(по заданию)
- Линейная регрессия(более подходящая модель)
- Обучаем модели
- вывод ранжированные признаки, производительность модели и среднюю ошибку
Программа выдает следующие результаты:
![img_1.png](img_1.png)
По этим результатам можно сделать вывод, что дерево решений не подходит для указанных данных, так как оценка производительности уходит в минус, а средняя квадратичная ошибка очень большая.
Для данной модели больше подходит линейная регрессия, которая имеет неплохую производительность 0.88, хотя для этих данных имеет все же немаленькую ошибку. Поэтому было решено ранжировать признаки по модели линейной регрессии, и из 3 признаков самым бесполезным оказался признак года, а самым полезным - признак смертности.

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,185 @@
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
import seaborn as sns
# Загрузите данные
data = pd.read_csv('us_tornado_dataset_1950_2021.csv')
# Преобразуйте магнитуду в бинарный признак (сильные и не сильные торнадо)
data['mag_class'] = data['mag'].apply(lambda x: 1 if x >= 3 else 0)
# Выделите признаки для обучения
features = data[['yr', 'mag', 'fat']]
# Выделите целевую переменную
target = data['mag_class']
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.2, random_state=42)
# Инициализируйте и обучите классификатор (в данном случае, Random Forest)
clf = RandomForestClassifier(random_state=42)
clf.fit(X_train, y_train)
# Сделайте предсказания на тестовом наборе
predictions = clf.predict(X_test)
# Оцените результаты классификации
accuracy = accuracy_score(y_test, predictions)
conf_matrix = confusion_matrix(y_test, predictions)
print("Rendom tree:")
print("Accuracy:", accuracy)
print("\nConfusion Matrix:\n", conf_matrix)
print("\nClassification Report:\n", classification_report(y_test, predictions))
# Визуализация матрицы ошибок
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Not Strong', 'Strong'], yticklabels=['Not Strong', 'Strong'])
plt.title('Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()
# Инициализируйте и обучите дерево решений
dt_clf = DecisionTreeClassifier(random_state=42)
dt_clf.fit(X_train, y_train)
# Сделайте предсказания на тестовом наборе с деревом решений
dt_predictions = dt_clf.predict(X_test)
# Оцените результаты классификации для дерева решений
dt_accuracy = accuracy_score(y_test, dt_predictions)
dt_conf_matrix = confusion_matrix(y_test, dt_predictions)
print("Decision Tree Classifier:")
print("Accuracy:", dt_accuracy)
print("\nConfusion Matrix:\n", dt_conf_matrix)
print("\nClassification Report:\n", classification_report(y_test, dt_predictions))
# Визуализация матрицы ошибок для дерева решений
plt.figure(figsize=(8, 6))
sns.heatmap(dt_conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Not Strong', 'Strong'], yticklabels=['Not Strong', 'Strong'])
plt.title('Decision Tree Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()
# Инициализируйте и обучите линейную регрессию
lr_clf = LogisticRegression(random_state=42)
lr_clf.fit(X_train, y_train)
# Сделайте предсказания на тестовом наборе с линейной регрессией
lr_predictions = lr_clf.predict(X_test)
# Оцените результаты классификации для линейной регрессии
lr_accuracy = accuracy_score(y_test, lr_predictions)
lr_conf_matrix = confusion_matrix(y_test, lr_predictions)
print("\nLinear Regression Classifier:")
print("Accuracy:", lr_accuracy)
print("\nConfusion Matrix:\n", lr_conf_matrix)
print("\nClassification Report:\n", classification_report(y_test, lr_predictions))
# Визуализация матрицы ошибок для линейной регрессии
plt.figure(figsize=(8, 6))
sns.heatmap(lr_conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['Not Strong', 'Strong'], yticklabels=['Not Strong', 'Strong'])
plt.title('Linear Regression Confusion Matrix')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()
# Разделение данных на признаки (X) и целевую переменную (y)
X = data[['yr', 'mag', 'fat']]
print (X.head())
y = data['inj']
# Разделение данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01, random_state=42)
#Решение с помощью дерева регрессии
model = DecisionTreeRegressor()
model.fit(X_train, y_train)
test_score = model.score(X_test, y_test)
# Получение важности признаков
feature_importances = model.feature_importances_
# Предсказание значений на тестовой выборке
y_pre = model.predict(X_test)
# Оценка производительности модели
mse = mean_squared_error(y_test, y_pre)
#Решение с помощью линейной регрессии
model2 = LinearRegression()
model2.fit(X_train, y_train)
test_score2 = model2.score(X_test, y_test)
# Предсказание значений на тестовой выборке
y_pre2 = model2.predict(X_test)
# Оценка производительности модели
mse2 = mean_squared_error(y_test, y_pre2)
# Получение коэффициентов модели
coefficients = model2.coef_
# Создание DataFrame для отображения коэффициентов и соответствующих признаков
coef_df = pd.DataFrame({'Признак': X.columns, 'Коэффициент': coefficients})
# Вывод коэффициентов по убыванию их абсолютных значений
coef_df['Абсолютный_Коэффициент'] = coef_df['Коэффициент'].abs()
coef_df = coef_df.sort_values(by='Абсолютный_Коэффициент', ascending=False)
# Решение с помощью случайного леса (Random Forest)
rf_model = RandomForestRegressor(random_state=42)
rf_model.fit(X_train, y_train)
test_score3 = rf_model.score(X_test, y_test)
# Получение важности признаков для случайного леса
rf_feature_importances = rf_model.feature_importances_
# Предсказание значений на тестовой выборке
y_pred_rf = rf_model.predict(X_test)
# Оценка производительности модели
rf_mse = mean_squared_error(y_test, y_pred_rf)
print("Дерево решений")
print("score", test_score)
print("feature_importances", feature_importances)
print("Mean Squared Error: {:.2f}".format(mse) + "\n")
plt.figure(figsize=(10, 6))
plt.bar(X.columns, feature_importances)
plt.title('Decision Tree Feature Importances')
plt.xlabel('Features')
plt.ylabel('Importance')
plt.show()
print("Линейная регрессия")
print("score", test_score2)
print(coef_df)
print("Mean Squared Error: {:.2f}".format(mse2))
plt.figure(figsize=(10, 6))
plt.bar(coef_df['Признак'], coef_df['Абсолютный_Коэффициент'])
plt.title('Linear regression Feature Importances')
plt.xlabel('Features')
plt.ylabel('Importance')
plt.show()
print("Случайный лес")
print("score", test_score)
print("feature_importances", rf_feature_importances)
print("Mean Squared Error: {:.2f}".format(rf_mse) + "\n")
# Визуализация важности признаков для случайного леса
plt.figure(figsize=(10, 6))
plt.bar(X.columns, rf_feature_importances)
plt.title('Random Forest Feature Importances')
plt.xlabel('Features')
plt.ylabel('Importance')
plt.show()

File diff suppressed because it is too large Load Diff