diff --git a/almukhammetov_bulat_lab_3/1.png b/almukhammetov_bulat_lab_3/1.png new file mode 100644 index 0000000..6675a87 Binary files /dev/null and b/almukhammetov_bulat_lab_3/1.png differ diff --git a/almukhammetov_bulat_lab_3/README.md b/almukhammetov_bulat_lab_3/README.md new file mode 100644 index 0000000..32a85f4 --- /dev/null +++ b/almukhammetov_bulat_lab_3/README.md @@ -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'. Эти признаки имеют наибольшее значение при определении классов стоимости жилья. + +В целом, результаты указывают на успешное решение задачи регрессии с использованием модели дерева решений. Однако задача классификации требует дополнительных улучшений. diff --git a/almukhammetov_bulat_lab_3/lab3(old).py b/almukhammetov_bulat_lab_3/lab3(old).py new file mode 100644 index 0000000..cb7e018 --- /dev/null +++ b/almukhammetov_bulat_lab_3/lab3(old).py @@ -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]) + diff --git a/almukhammetov_bulat_lab_3/lab3.py b/almukhammetov_bulat_lab_3/lab3.py new file mode 100644 index 0000000..f8b9c16 --- /dev/null +++ b/almukhammetov_bulat_lab_3/lab3.py @@ -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]) # За медианный доход домохозяйств в блоке