CreateML для Swift: полное руководство с примерами
CreateML — это мощный фреймворк от Apple, предназначенный для создания и обучения моделей машинного обучения непосредственно на устройствах Apple (macOS, iOS, iPadOS). Он позволяет разработчикам, не имеющим глубоких знаний в области ML, быстро создавать, обучать и развертывать модели для классификации изображений, текста, табличных данных, рекомендательных систем и многого другого. В отличие от традиционных библиотек, таких как TensorFlow или PyTorch, CreateML полностью интегрирован в экосистему Apple и использует преимущества Metal (GPU) и Core ML для максимальной производительности.
Зачем нужен CreateML? Во-первых, он устраняет необходимость в сложной настройке окружения и знании Python. Вы работаете в знакомой среде Xcode или Playgrounds. Во-вторых, модели, созданные с помощью CreateML, автоматически оптимизируются для работы на устройствах Apple, что обеспечивает низкое энергопотребление и высокую скорость инференса. В-третьих, фреймворк предоставляет высокоуровневый API, который позволяет обучить модель буквально в несколько строк кода, используя данные в формате JSON, CSV или папки с изображениями.
Эта статья станет вашим полным руководством по CreateML. Мы рассмотрим установку, основные классы и методы, напишем реальный пример приложения для классификации изображений, а также разберем типичные ошибки и дадим советы по производительности.
1. Установка CreateML
CreateML не устанавливается через менеджеры пакетов, такие как pip или npm. Он является частью инструментов разработчика Apple и поставляется вместе с Xcode. Для начала работы вам потребуется:
- macOS 10.15 (Catalina) или новее (рекомендуется macOS 14 Sonoma или новее для последних возможностей)
- Xcode 12 или новее (рекомендуется Xcode 15+ для поддержки всех типов моделей)
- Swift 5.3+ (обычно идет в комплекте с Xcode)
Установка Xcode:
# Скачайте Xcode из Mac App Store или с сайта Apple Developer
# Или используйте командную строку (если установлен mas):
mas install 497799835 # ID Xcode в App Store
После установки Xcode CreateML доступен в двух формах:
- CreateML App — графическое приложение для визуального создания моделей (находится в Xcode → Open Developer Tool → CreateML).
- CreateML Framework — программный API для Swift, который мы будем рассматривать в этой статье.
Для использования программного API просто импортируйте фреймворк в ваш проект:
import CreateML
2. Быстрый старт: минимальный рабочий пример
Давайте создадим простую модель для классификации текста (анализ тональности). Мы будем использовать встроенный датасет из Xcode Playground.
import CreateML
import Foundation
// 1. Создаем данные для обучения (пример: тональность отзывов)
let data: [(text: String, label: String)] = [
("This product is amazing!", "positive"),
("I love this app", "positive"),
("Great experience", "positive"),
("Terrible quality", "negative"),
("I hate this", "negative"),
("Very disappointed", "negative"),
("Not bad, could be better", "neutral"),
("It's okay", "neutral"),
("Average product", "neutral")
]
// 2. Преобразуем в DataFrame
var dataFrame = DataFrame()
let texts = MLDataColumn(data.map { $0.text })
let labels = MLDataColumn(data.map { $0.label })
dataFrame.addColumn(texts, named: "text")
dataFrame.addColumn(labels, named: "label")
// 3. Разделяем на обучающую и тестовую выборки
let (trainingData, testingData) = dataFrame.randomSplit(by: 0.8, seed: 42)
// 4. Создаем и обучаем классификатор текста
let model = try MLTextClassifier(trainingData: trainingData,
textColumn: "text",
labelColumn: "label")
// 5. Оцениваем модель на тестовых данных
let evaluationMetrics = model.evaluation(on: testingData)
print("Accuracy: \(evaluationMetrics.classificationError)")
// 6. Сохраняем модель
let modelPath = URL(fileURLWithPath: "/tmp/TextSentimentClassifier.mlmodel")
try model.write(to: modelPath)
// 7. Делаем предсказание
let prediction = try model.prediction(from: "I really enjoy using this!")
print("Prediction: \(prediction)") // Должно вывести "positive"
Этот пример показывает, как за несколько строк кода создать, обучить и сохранить модель машинного обучения. Давайте теперь разберем основные компоненты CreateML подробнее.
3. Основные классы и методы CreateML
CreateML предоставляет множество классов для различных задач ML. Ниже приведены 8 ключевых классов и методов с примерами использования.
3.1 MLDataTable
init(contentsOf: URL, options: MLDataTable.ParsingOptions) throws
Что делает: Загружает данные из CSV, JSON или других поддерживаемых форматов в табличную структуру для дальнейшей обработки.
import CreateML
// Загрузка CSV-файла
let csvURL = URL(fileURLWithPath: "/path/to/data.csv")
let dataTable = try MLDataTable(contentsOf: csvURL)
// Загрузка JSON
let jsonURL = URL(fileURLWithPath: "/path/to/data.json")
let jsonTable = try MLDataTable(contentsOf: jsonURL)
// Просмотр первых 5 строк
print(dataTable.head(5))
// Получение описательной статистики
print(dataTable.description)
3.2 MLDataColumn
init(_ values: [MLDataValueConvertible])
Что делает: Создает колонку данных из массива значений. Используется для ручного конструирования DataFrame.
// Создание колонок
let ages = MLDataColumn([25, 30, 35, 40, 45])
let names = MLDataColumn(["Alice", "Bob", "Charlie", "Diana", "Eve"])
// Создание DataFrame из колонок
var df = DataFrame()
df.addColumn(ages, named: "age")
df.addColumn(names, named: "name")
// Фильтрация колонки
let filtered = ages.filter { $0.intValue! > 30 }
print(filtered) // [35, 40, 45]
3.3 MLImageClassifier
init(trainingData: MLDataTable, imageColumn: String, labelColumn: String, parameters: MLImageClassifier.Parameters) throws
Что делает: Создает и обучает модель классификации изображений на основе предоставленных данных (пути к изображениям и метки).
// Предположим, у нас есть папки с изображениями:
// /data/cats/ и /data/dogs/
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/data"))
// Настройка параметров обучения
let parameters = MLImageClassifier.Parameters(
featureExtractor: .scenePrint(revision: 1),
validationData: nil,
maxIterations: 25,
augmentationOptions: [.horizontalFlip, .crop]
)
// Обучение модели
let classifier = try MLImageClassifier(
trainingData: data,
imageColumn: "image_path",
labelColumn: "label",
parameters: parameters
)
// Оценка
let evaluation = classifier.evaluation(on: data)
print("Accuracy: \(1 - evaluation.classificationError)")
3.4 MLTextClassifier
init(trainingData: MLDataTable, textColumn: String, labelColumn: String, parameters: MLTextClassifier.Parameters) throws
Что делает: Создает модель для классификации текстовых данных (анализ тональности, определение языка, категоризация).
// Загрузка данных
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/path/to/reviews.csv"))
// Настройка параметров
let params = MLTextClassifier.Parameters(
algorithm: .maxEnt(revision: 1),
language: .english,
validationData: nil,
maxIterations: 100
)
// Обучение
let textClassifier = try MLTextClassifier(
trainingData: data,
textColumn: "review_text",
labelColumn: "sentiment",
parameters: params
)
// Предсказание
let prediction = try textClassifier.prediction(from: "This is a wonderful product!")
print("Predicted sentiment: \(prediction)")
3.5 MLRegressor (MLLinearRegressor, MLDecisionTreeRegressor)
init(trainingData: MLDataTable, targetColumn: String, featureColumns: [String]?) throws
Что делает: Создает регрессионную модель для предсказания непрерывных значений (цены, температуры, зарплаты).
// Данные: площадь дома и цена
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/path/to/houses.csv"))
// Линейная регрессия
let regressor = try MLLinearRegressor(
trainingData: data,
targetColumn: "price",
featureColumns: ["area", "bedrooms", "age"]
)
// Оценка
let metrics = regressor.evaluation(on: data)
print("RMSE: \(metrics.rootMeanSquaredError)")
print("R^2: \(metrics.rSquared)")
// Предсказание
var newHouse = DataFrame()
newHouse.addColumn(MLDataColumn([120.0]), named: "area")
newHouse.addColumn(MLDataColumn([3.0]), named: "bedrooms")
newHouse.addColumn(MLDataColumn([10.0]), named: "age")
let prediction = try regressor.predictions(from: newHouse)
print("Predicted price: \(prediction)")
3.6 MLRecommender
init(trainingData: MLDataTable, userColumn: String, itemColumn: String, ratingColumn: String, parameters: MLRecommender.Parameters) throws
Что делает: Создает рекомендательную систему на основе коллаборативной фильтрации (например, рекомендации фильмов или товаров).
// Данные: user_id, movie_id, rating
let data = try MLDataTable(contentsOf: URL(fileURLWithPath: "/path/to/ratings.csv"))
// Обучение рекомендательной модели
let recommender = try MLRecommender(
trainingData: data,
userColumn: "user_id",
itemColumn: "movie_id",
ratingColumn: "rating",
parameters: MLRecommender.Parameters(
algorithm: .probabilisticMatrixFactorization,
regularization: 0.01,
maxIterations: 100
)
)
// Рекомендации для пользователя с id = 42
let recommendations = try recommender.recommendations(
fromUsers: MLDataColumn([42]),
maxCount: 5
)
print("Top 5 recommendations for user 42:")
print(recommendations)
3.7 MLActivityClassifier
init(trainingData: MLDataTable, featureColumns: [String], labelColumn: String, parameters: MLActivityClassifier.Parameters) throws
Что делает: Классифицирует временные ряды данных (например, активность пользователя по данным акселерометра).