- •Распределение классов прочности
- •Визуализация распределения классов прочности бетона
- •Анализ сбалансированных классов
- •Визуализация взаимосвязей между признаками
- •Предобработка данных
- •Разделение данных и масштабирование
- •Визуализация распределения признаков:
- •Метод kNn для классификации прочности бетона
- •Метод дерева решений для классификации прочности бетона
- •Обучение и оценка дерева решений для классификации бетона
- •Обучение и оценка дерева решений
- •Визуализация дерева решений
- •Кривые для оценки качества классификации бетона
- •Визуализация roc-кривых для классификации прочности бетона
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра ИС
отчет
по лабораторной работе № 3
по дисциплине «Машинное обучение»
Тема: Исследование алгоритмов классификации
Студентка гр. 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['Strength_Class'] = pd.cut(df['Concrete compressive strength '],
bins=[0, 25, 40, 100],
labels=['Низкая', 'Средняя', 'Высокая'])
class_distribution = df['Strength_Class'].value_counts().sort_index()print("РАСПРЕДЕЛЕНИЕ КЛАССОВ ПРОЧНОСТИ:")print(class_distribution)print(f"\nВсего образцов: {len(df)}")
Результат:
РАСПРЕДЕЛЕНИЕ КЛАССОВ ПРОЧНОСТИ:
Strength_Class
Низкая 295
Средняя 356
Высокая 379
Name: count, dtype: int64
Всего образцов: 1030
Примечания:
Обоснование выбора границ:
< 25 МПа: Низкая прочность — для неответственных конструкций, фундаментов малоэтажных зданий
25-40 МПа: Средняя прочность — стандартный диапазон для большинства строительных работ
> 40 МПа: Высокая прочность — для ответственных конструкций, мостов, высотных зданий
Визуализация распределения классов прочности бетона
Программа:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
colors = ['#ff6b6b', '#4ecdc4', '#45b7d1']bars = ax1.bar(class_distribution.index, class_distribution.values,
color=colors, alpha=0.7, edgecolor='black')ax1.set_title('Распределение классов прочности бетона', fontsize=14, fontweight='bold')ax1.set_xlabel('Класс прочности')ax1.set_ylabel('Количество образцов')ax1.grid(True, alpha=0.3)
for bar, count in zip(bars, class_distribution.values):
height = bar.get_height()
ax1.text(bar.get_x() + bar.get_width()/2, height + 5,
f'{count}', ha='center', va='bottom', fontweight='bold')
wedges, texts, autotexts = ax2.pie(class_distribution.values,
labels=class_distribution.index,
autopct='%1.1f%%',
colors=colors,
startangle=90,
textprops={'fontsize': 12})ax2.set_title('Процентное распределение классов', fontsize=14, fontweight='bold')
for autotext in autotexts:
autotext.set_color('white')
autotext.set_fontweight('bold')
plt.tight_layout()plt.show()
Результат:
Анализ сбалансированных классов
Программа:
total = len(df)min_count = class_distribution.min()max_count = class_distribution.max()balance_ratio = min_count / max_count
print("АНАЛИЗ СБАЛАНСИРОВАННОСТИ КЛАССОВ:")
print(f"Общее количество образцов: {total}")print(f"Самый маленький класс: {min_count} образцов")print(f"Самый большой класс: {max_count} образцов")print(f"Соотношение min/max: {balance_ratio:.3f}")
if balance_ratio > 0.8:
status = "ХОРОШО СБАЛАНСИРОВАНЫ"elif balance_ratio > 0.5:
status = "УМЕРЕННО СБАЛАНСИРОВАНЫ"else:
status = "СИЛЬНО НЕСБАЛАНСИРОВАНЫ"
print(f"СТАТУС: {status}")
Результат:
АНАЛИЗ СБАЛАНСИРОВАННОСТИ КЛАССОВ:
Общее количество образцов: 1030
Самый маленький класс: 295 образцов
Самый большой класс: 379 образцов
Соотношение min/max: 0.778
СТАТУС: УМЕРЕННО СБАЛАНСИРОВАНЫ
