Compare commits
2 Commits
lipatov_il
...
senkin_ale
| Author | SHA1 | Date | |
|---|---|---|---|
| 213d03234c | |||
| 017623e084 |
1
senkin_alexander_lab_3/.gitignore
vendored
Normal file
1
senkin_alexander_lab_3/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.idea/
|
||||
32
senkin_alexander_lab_3/README.md
Normal file
32
senkin_alexander_lab_3/README.md
Normal 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
|
||||
- Добавляем две модели для сравнения их работы:
|
||||
- Дерево решений(по заданию)
|
||||
- Линейная регрессия(более подходящая модель)
|
||||
- Обучаем модели
|
||||
- вывод ранжированные признаки, производительность модели и среднюю ошибку
|
||||
|
||||
Программа выдает следующие результаты:
|
||||
|
||||

|
||||
|
||||
По этим результатам можно сделать вывод, что дерево решений не подходит для указанных данных, так как оценка производительности уходит в минус, а средняя квадратичная ошибка очень большая.
|
||||
Для данной модели больше подходит линейная регрессия, которая имеет неплохую производительность 0.88, хотя для этих данных имеет все же немаленькую ошибку. Поэтому было решено ранжировать признаки по модели линейной регрессии, и из 3 признаков самым бесполезным оказался признак года, а самым полезным - признак смертности.
|
||||
BIN
senkin_alexander_lab_3/img.png
Normal file
BIN
senkin_alexander_lab_3/img.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
BIN
senkin_alexander_lab_3/img_1.png
Normal file
BIN
senkin_alexander_lab_3/img_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
185
senkin_alexander_lab_3/senkin_alexander_lab_3.py
Normal file
185
senkin_alexander_lab_3/senkin_alexander_lab_3.py
Normal 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()
|
||||
|
||||
67559
senkin_alexander_lab_3/us_tornado_dataset_1950_2021.csv
Normal file
67559
senkin_alexander_lab_3/us_tornado_dataset_1950_2021.csv
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user