Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lab2_3352_ГарееваКР.docx
Скачиваний:
0
Добавлен:
24.01.2026
Размер:
1.07 Mб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра ИС

отчет

по лабораторной работе № 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