Лабораторная 3

This commit is contained in:
BulatReznik 2023-11-01 23:05:45 +04:00
parent b26c54a7e4
commit 63198665cc
4 changed files with 189 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View File

@ -0,0 +1,64 @@
Вариант 2
Задание:
Предсказание категории возраста дома (housingMedianAge) на основе других признаков, таких как широта, долгота, общее количество комнат и т.д.
Данные:
Данный набор данных использовался во второй главе недавней книги Аурелиена Жерона "Практическое машинное обучение с помощью Scikit-Learn и TensorFlow". Он служит отличным введением в реализацию алгоритмов машинного обучения, потому что требует минимальной предварительной обработки данных, содержит легко понимаемый список переменных и находится в оптимальном размере, который не слишком мал и не слишком большой.
Данные содержат информацию о домах в определенном районе Калифорнии и некоторую сводную статистику на основе данных переписи 1990 года. Следует отметить, что данные не прошли предварительную очистку, и для них требуются некоторые этапы предварительной обработки. Столбцы включают в себя следующие переменные, их названия весьма наглядно описывают их суть:
долгота longitude
широта latitude
средний возраст жилья median_house_value
общее количество комнат total_rooms
общее количество спален total_bedrooms
население population
домохозяйства households
медианный доход median_income
Запуск:
Запустите файл lab3.py
Описание программы:
1. Загружает набор данных из файла 'housing.csv', который содержит информацию о домах в Калифорнии, включая их координаты, возраст, количество комнат, население, доход и другие характеристики.
2. Удаляет строки с нулевыми значениями из набора данных для чистоты анализа.
3. Выбирает набор признаков (features) из данных, которые будут использоваться для обучения моделей регрессии и классификации.
4. Определяет задачу регрессии, где целевой переменной (target) является 'housing_median_age', и задачу классификации, где целевой переменной является 'housing_median_age'.
5. Разделяет данные на обучающий и тестовый наборы для обеих задач с использованием функции train_test_split. Тестовый набор составляет 1% от исходных данных.
6. Создает и обучает дерево решений для регрессии и классификации с использованием моделей DecisionTreeRegressor и DecisionTreeClassifier.
7. Предсказывает значения целевой переменной на тестовых наборах для обеих задач.
8. Оценивает качество моделей с помощью среднеквадратичной ошибки (MSE) для регрессии и точности (accuracy) для классификации.
9. Выводит среднеквадратичную ошибку для регрессии и точность для классификации, а также важности признаков для обеих задач.
Результаты:
![Alt text](1.png)
Выводы:
Для задачи регрессии, где целью было предсказать возраст жилья (housing_median_age), модель дерева решений показала среднюю ошибку (MSE) равную 117.65. Это означает, что модель регрессии вполне приемлемо предсказывает возраст жилья на основе выбранных признаков.
Для задачи классификации, где целью было предсказать стоимость жилья (housing_median_age), модель дерева решений показала низкую точность, всего 8.29%. Это свидетельствует о том, что модель классификации не справляется с предсказанием стоимости жилья на основе выбранных признаков. Низкая точность указывает на необходимость улучшения модели или выбора других методов для решения задачи классификации.
Анализ важности признаков для задачи регрессии показал, что наибольший вклад в предсказание возраста жилья вносят признаки 'longitude', 'latitude' и 'total_rooms'. Эти признаки оказывают наибольшее влияние на результаты модели.
Для задачи классификации наибольший вклад в предсказание стоимости жилья вносят признаки 'median_income', 'longitude' и 'latitude'. Эти признаки имеют наибольшее значение при определении классов стоимости жилья.
В целом, результаты указывают на успешное решение задачи регрессии с использованием модели дерева решений. Однако задача классификации требует дополнительных улучшений.

View File

@ -0,0 +1,48 @@
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import DecisionTreeClassifier
# Загрузка данных
data = pd.read_csv('titanic.csv', index_col='PassengerId')
# Функция для преобразования пола в числовое значение
def Sex_to_bool(sex):
if sex == "male":
return 0
return 1
# Преобразование пола в числовое значение
data['Sex'] = data['Sex'].apply(Sex_to_bool)
# Отбор строк с непустыми значениями
# Отбор строк с непустыми значениями
data = data.loc[~data['Name'].isna()
& ~data['Age'].isna()
& ~data['Sex'].isna()
& ~data['Survived'].isna()]
# Отбор нужных столбцов
features = data[['Name', 'Sex', 'Age']]
# Применение Label Encoding к столбцу 'Name'
label_encoder = LabelEncoder()
features['Name'] = label_encoder.fit_transform(features['Name'])
# Определение целевой переменной
y = data['Survived']
# Создание и обучение дерева решений
clf = DecisionTreeClassifier(random_state=241)
clf.fit(features, y)
# Получение важностей признаков
importance = clf.feature_importances_
# Печать важности каждого признака
print("Важность 'Name':", importance[0])
print("Важность 'Sex':", importance[1])
print("Важность 'Age':", importance[2])

View File

@ -0,0 +1,77 @@
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, accuracy_score
# Загрузка данных
data = pd.read_csv('housing.csv')
data = data.dropna()
# Отбор нужных столбцов
features = data[
['longitude', 'latitude', 'total_rooms', 'total_bedrooms', 'population', 'households', 'median_income']]
# Задача регрессии
target_regression = data['housing_median_age']
# Разделение данных на обучающий и тестовый наборы для регрессии
X_train_regression, X_test_regression, y_train_regression, y_test_regression = train_test_split(features,
target_regression,
test_size=0.01,
random_state=241)
# Создание и обучение дерева решений для регрессии
clf_regression = DecisionTreeRegressor(random_state=241)
clf_regression.fit(X_train_regression, y_train_regression)
# Предсказание на тестовом наборе для регрессии
y_pred_regression = clf_regression.predict(X_test_regression)
# Оценка качества модели для регрессии (MSE)
mse_regression = mean_squared_error(y_test_regression, y_pred_regression)
print("Средняя ошибка для регрессии:", mse_regression)
# Задача классификации
target_classification = data['median_house_value']
# Разделение данных на обучающий и тестовый наборы для классификации
X_train_classification, X_test_classification, y_train_classification, y_test_classification = train_test_split(
features, target_classification, test_size=0.01, random_state=241)
# Создание и обучение дерева классификации
clf_classification = DecisionTreeClassifier(random_state=241)
clf_classification.fit(X_train_classification, y_train_classification)
# Предсказание на тестовом наборе для классификации
y_pred_classification = clf_classification.predict(X_test_classification)
# Оценка качества модели для классификации (точность)
accuracy_classification = accuracy_score(y_test_classification, y_pred_classification)
print("Точность для классификации: {:.2f}%".format(accuracy_classification * 100))
# Важности признаков для регрессии
importance_regression = clf_regression.feature_importances_
print("Важность для регрессии")
# Печать важности каждого признака для регрессии
print("Важность 'longitude':", importance_regression[0]) # За западную долготу дома
print("Важность 'latitude':", importance_regression[1]) # За северную широту дома
print("Важность 'total_rooms':", importance_regression[2]) # За общее количество комнат в блоке
print("Важность 'total_bedrooms':", importance_regression[3]) # За общее количество спален в блоке
print("Важность 'population':", importance_regression[4]) # За общее количество проживающих в блоке
print("Важность 'households':", importance_regression[5]) # За общее количество домохозяйств в блоке
print("Важность 'median_income':", importance_regression[6]) # За медианный доход домохозяйств в блоке
# Важности признаков для классификации
importance_classification = clf_classification.feature_importances_
print()
print("Важность для классификации")
# Печать важности каждого признака для классификации
print("Важность 'longitude':", importance_classification[0]) # За западную долготу дома
print("Важность 'latitude':", importance_classification[1]) # За северную широту дома
print("Важность 'total_rooms':", importance_classification[2]) # За общее количество комнат в блоке
print("Важность 'total_bedrooms':", importance_classification[3]) # За общее количество спален в блоке
print("Важность 'population':", importance_classification[4]) # За общее количество проживающих в блоке
print("Важность 'households':", importance_classification[5]) # За общее количество домохозяйств в блоке
print("Важность 'median_income':", importance_classification[6]) # За медианный доход домохозяйств в блоке