- •Добавление нового атрибута
- •Пропущенные значения
- •Удаление выбросов
- •Построение графиков для поиска кластеров
- •Анализ кластеров
- •Методы локтя и силуэта для определения оптимального числа кластеров
- •Применение k-Means
- •Графики для визуализации результатов кластеризации
- •Анализ характристик кластеров
- •Визуализация средних значений по кластерам
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ИС
отчет
по лабораторной работе № 2
по дисциплине «Машинное обучение»
Тема: Кластеризация методом K-Means
Студентка гр. 3352 |
________________ |
Гареева К.Р. |
Преподаватель |
________________ |
Молдовян Д.Н. |
Санкт-Петербург
2025
Общие сведения
Предметная область: Строительные материалы и инженерия
Источник данных: Данные собраны с помощью лабораторных экспериментов, где измерялась прочность бетона на сжатие через 28 дней для различных комбинаций ингредиентов. Ссылка на источник: Concrete Compressive Strength.
Характер данных: Реальные данные. Таблица содержит числовые признаки состава бетона и метку - прочность на сжатие. Каждая строка - это один экспериментальный образец бетона.
Атрибуты датасета:
№ |
Название |
Тип |
Описание |
1 |
Cement |
float |
Количество цемента (кг/м³) |
2 |
Blast Furnace Slag |
float |
Количество шлака (кг/м³) |
3 |
Fly Ash |
float |
Количество золы-уноса (кг/м³) |
4 |
Water |
float |
Количество воды (кг/м³) |
5 |
Superplasticizer |
float |
Количество суперпластификатора (кг/м³) |
6 |
Coarse Aggregate |
float |
Количество крупного заполнителя (кг/м³) |
7 |
Fine Aggregate |
float |
Количество мелкого заполнителя (кг/м³) |
8 |
Age |
float |
Возраст бетона (дни) |
9 |
Concrete Compressive Strength |
float |
Прочность на сжатие (МПа) — целевая переменная |
Добавление нового атрибута
Программа для добавления нового атрибута:
df_kmeans = df.copy()df_kmeans['Cement/Water'] = df_kmeans['Cement'] / df_kmeans['Water']
print("Добавлен новый атрибут 'Cement/Water'")print("Первые 5 строк обновленного датасета:")display(df_kmeans.head())
Добавлен новый атрибут 'Cement/Water'
Результаты:
|
Cement |
Slag |
Ash |
Water |
Plasticizer |
Coarse_Agg |
Fine_Agg |
Age |
Comp_Strength |
Cement/Water |
0 |
540.0 |
0.0 |
0.0 |
162.0 |
2.5 |
1040.0 |
676.0 |
28 |
79.986111 |
3.333333 |
1 |
540.0 |
0.0 |
0.0 |
162.0 |
2.5 |
1055.0 |
676.0 |
28 |
61.887366 |
3.333333 |
2 |
332.5 |
142.5 |
0.0 |
228.0 |
0.0 |
932.0 |
594.0 |
270 |
40.269535 |
1.458333 |
3 |
332.5 |
142.5 |
0.0 |
228.0 |
0.0 |
932.0 |
594.0 |
365 |
41.052780 |
1.458333 |
4 |
198.6 |
132.4 |
0.0 |
192.0 |
0.0 |
978.4 |
825.5 |
360 |
44.296075 |
1.034375 |
Примечание:
Новый атрибут: Cement/Water (цементно-водное отношение)
Физический смысл:
- Ключевой параметр в технологии бетона
- Определяет прочность бетона (чем выше отношение, тем выше прочность)
- Оптимальные значения обычно в диапазоне 1.5-4.0
- Значения <1.0 могут указывать на низкокачественные смеси
Пропущенные значения
Программа:
print("Пропущенные значения:")print(df_kmeans.isnull().sum())
print(f"\nБесконечные значения в Cement_Water_Ratio: {np.isinf(df_kmeans['Cement/Water']).sum()}")
# Удалим бесконечные значенияdf_kmeans = df_kmeans[~np.isinf(df_kmeans['Cement/Water'])]print(f"Размер датасета после очистки: {df_kmeans.shape}")
Результаты:
Пропущенные значения:
Cement 0
Slag 0
Ash 0
Water 0
Plasticizer 0
Coarse_Agg 0
Fine_Agg 0
Age 0
Comp_Strength 0
Cement/Water 0
В данном датасете нет пропущенных значений.
Варианты устранения пропущенных значений предложены в лабораторной работе №1
Удаление выбросов
Программа:
def remove_outliers(df, columns):
df_clean = df.copy()
for col in columns:
Q1 = df_clean[col].quantile(0.25)
Q3 = df_clean[col].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
df_clean = df_clean[(df_clean[col] >= lower_bound) & (df_clean[col] <= upper_bound)]
return df_clean
columns_to_clean = ['Cement', 'Water', 'Cement/Water', 'Comp_Strength']
df_clean = remove_outliers(df_kmeans, columns_to_clean)
print(f"Размер датасета после удаления выбросов: {df_clean.shape}")
print(f"Удалено записей: {len(df_kmeans) - len(df_clean)}")
print(f"Дубликатов в данных: {df_clean.duplicated().sum()}")
Результаты:
Размер датасета после удаления выбросов: (981, 10)
Удалено записей: 49
Дубликатов в данных: 19
