Section 8/151 menit

8. Create ML — Training Model di Mac dan iPad

8. Create ML — Training Model di Mac dan iPad

Image Classifier

swift
import CreateML
import Foundation

// Buat image classifier dari labeled folder structure:
// Training/
// ├── cat/
// │   ├── cat1.jpg, cat2.jpg, ...
// └── dog/
//     ├── dog1.jpg, dog2.jpg, ...

func trainImageClassifier() async throws {
    let trainingDataURL = URL(fileURLWithPath: "/Users/dev/TrainingData")
    let validationDataURL = URL(fileURLWithPath: "/Users/dev/ValidationData")

    let trainingData = MLImageClassifier.DataSource.labeledDirectories(
        at: trainingDataURL
    )
    let validationData = MLImageClassifier.DataSource.labeledDirectories(
        at: validationDataURL
    )

    var parameters = MLImageClassifier.ModelParameters(
        featureExtractor: .scenePrint(revision: 2),  // transfer learning dari Scene Print
        validation: .dataSource(validationData),
        maxIterations: 25,
        augmentationOptions: [.flip, .rotate, .blur, .crop, .noise]
    )

    let classifier = try await MLImageClassifier(
        trainingData: trainingData,
        parameters: parameters
    )

    // Evaluasi
    let trainingAccuracy = classifier.trainingMetrics.classificationError
    let validationAccuracy = classifier.validationMetrics?.classificationError
    print("Training accuracy: \(1 - (trainingAccuracy ?? 0))%")
    print("Validation accuracy: \(1 - (validationAccuracy ?? 0))%")

    // Save model
    let outputURL = URL(fileURLWithPath: "/Users/dev/MyClassifier.mlmodel")
    try classifier.write(to: outputURL, metadata: MLModelMetadata(
        author: "Company iOS Team",
        shortDescription: "Product photo classifier",
        version: "1.0"
    ))
}

Text Classifier

swift
import CreateML

func trainTextClassifier() async throws {
    // Training data: CSV dengan kolom "text" dan "label"
    let trainingURL = URL(fileURLWithPath: "/Users/dev/support_tickets.csv")
    let trainingData = try MLDataTable(contentsOf: trainingURL)

    var parameters = MLTextClassifier.ModelParameters(
        validation: .split(strategy: .stratified, proportion: 0.1),
        maxIterations: 15,
        algorithm: .maxEnt(revision: 1)
    )

    let classifier = try await MLTextClassifier(
        trainingData: trainingData,
        textColumn: "text",
        labelColumn: "category",
        parameters: parameters
    )

    print("Training accuracy: \(classifier.trainingMetrics.accuracy * 100)%")

    let outputURL = URL(fileURLWithPath: "/Users/dev/SupportClassifier.mlmodel")
    try classifier.write(to: outputURL)
}

Sound Classifier

swift
import CreateML

func trainSoundClassifier() async throws {
    // Struktur folder:
    // SoundData/
    // ├── cough/
    // │   ├── cough1.wav, cough2.wav, ...
    // └── sneeze/
    //     ├── sneeze1.wav, ...

    let trainingDataURL = URL(fileURLWithPath: "/Users/dev/SoundData")

    let trainingData = MLSoundClassifier.DataSource.labeledDirectories(
        at: trainingDataURL
    )

    var parameters = MLSoundClassifier.ModelParameters(
        validation: .split(strategy: .stratified, proportion: 0.15),
        maxIterations: 25,
        algorithm: .audioFeaturePrint  // transfer learning untuk audio
    )

    let classifier = try await MLSoundClassifier(
        trainingData: trainingData,
        parameters: parameters
    )

    print("Accuracy: \(classifier.trainingMetrics.classificationError)")

    let outputURL = URL(fileURLWithPath: "/Users/dev/SoundClassifier.mlmodel")
    try classifier.write(to: outputURL)
}