Лекция посвящена использованию пакета Caret в языке R для решения задач классификации. На примере классического датасета «Ирис Фишера» (три вида цветка, четыре метрических признака) демонстрируется полный цикл машинного обучения: загрузка данных, их разбиение на обучающую и тестовую выборки, визуальный анализ, обучение сразу пяти алгоритмов (линейный дискриминантный анализ, деревья решений, k-ближайшие соседи, метод опорных векторов, случайный лес), сравнение моделей с помощью кросс-валидации и выбор лучшей модели для предсказания.
Основные мысли
1. Пакет Caret — универсальный инструмент в R, содержащий большинство алгоритмов машинного обучения с единым интерфейсом.
2. Разделение данных — обязательный этап: 80% на обучение, 20% на проверку (через createDataPartition).
3. Визуализация (boxplot, feature plot, density plot) помогает предварительно оценить разделимость классов (например, класс setosa отделяется идеально).
4. Кросс-валидация (Cross-Validation, 10 фолдов) используется для надежной оценки качества моделей.
5. Сравнение моделей — одна из главных возможностей Caret; победители (LDA и kNN) показали точность ~98% на кросс-валидации.
6. Единый синтаксис: обучение через train(), предсказание через predict(), метрика accuracy.
7. Краткость кода: на ~30 строках можно реализовать полный пайплайн ML.
Показывать лекцию целиком
Краткое изложение
Введение в задачу
• Используется датасет iris: 150 цветков, 3 вида (setosa, versicolor, virginica), 4 признака (длина/ширина чашелистика и лепестка).
• Цель: предсказать вид цветка по четырем измерениям.
Загрузка и подготовка данных
• Данные загружаются из интернета (архив UCI) или локально через read.csv (без заголовков).
• Пакет Caret предварительно устанавливается (требует много зависимостей).
• Назначаются имена столбцов: Sepal.Length, Sepal.Width, Petal.Length, Petal.Width, Species.
Разделение выборки
• Используется createDataPartition (доля 0.8 = 80% для обучения).
• Создаются validationIndex (номера строк для обучения) и выборки:
o Обучающая: 120 строк (80%)
o Тестовая (валидационная): 30 строк (20%)
• Целевая переменная преобразуется в фактор (as.factor).
• Выборка сбалансирована: по 40 представителей каждого класса.
Визуальный анализ
• summary() — статистика по признакам.
• par(mfrow=c(1,4)) + boxplot() — распределение каждого признака.
• featurePlot() — показывает, что класс setosa полностью отделим по длине/ширине лепестка, а два других вида пересекаются (требуют ML).
Обучение моделей
• Параметры обучения: метрика = "Accuracy", контроль = trainControl(method="cv", number=10) (10-кратная кросс-валидация), set.seed(7).
• Обучены 5 моделей:
1. LDA (линейный дискриминантный анализ)
2. CART (дерево решений)
3. kNN (k ближайших соседей)
4. SVM (метод опорных векторов)
5. Random Forest (случайный лес)
Сравнение результатов
• resamples() + summary(): лучшие — LDA и kNN (средняя точность 0.983, min 0.917, max 1.000).
• На тестовой выборке LDA допустил 1 ошибку (точность 0.967, 97%), kNN — 2 ошибки.
Итог и философия R
• Достаточно 30 строк кода для полного цикла ML.
• Главное преимущество: единый синтаксис для разных алгоритмов (меняется только аргумент method).
Выводы
1. Пакет Caret значительно упрощает применение машинного обучения в R, предоставляя стандартизированный интерфейс.
2. Кросс-валидация обязательна для объективной оценки модели, особенно на небольших данных (150 наблюдений).
3. Визуализация на этапе EDA (разведочного анализа) может сразу выявить легко разделимые классы, снижая потребность в сложных моделях.
4. Для задачи с тремя классами и четырьмя признаками простые модели (LDA, kNN) работают не хуже сложных ансамблей.
5. Язык R эффективен для быстрого прототипирования и интеграции с визуализацией (Power BI, базовая графика).
Вопросы для самопроверки
1. Для чего нужна функция createDataPartition и чем её использование удобнее ручной индексации строк?
2. Почему в лекции выбрано соотношение 80/20, а не 70/30?
3. Какой график помог визуально определить, что класс setosa отделим без машинного обучения?
4. Что такое кросс-валидация (cv) и зачем указывать number=10?
5. Зачем устанавливать set.seed(7) перед обучением моделей?
6. Какие две модели показали наилучший результат на кросс-валидации, и сколько ошибок каждая допустила на тестовой выборке?
7. Что означает знак ~ . в формуле train(Species ~ ., ...) ?
8. Почему в лекции упоминается необходимость установки дополнительных пакетов (ellipse, randomForest), хотя основным является Caret?
9. Каким образом функция predict() применяет обученную модель к новым данным?
10. Опишите основные шаги конвейера машинного обучения, которые демонстрируются на лекции (от загрузки данных до итоговой оценки).