Section 7/201 menit

7. Create ML: Training Model Tanpa Python

7. Create ML: Training Model Tanpa Python

Create ML memungkinkan training model ML langsung di macOS dengan Swift — tanpa setup Python environment. Cocok untuk custom classifier sederhana.

Image Classifier dengan Create ML

swift
// Create ML: training image classifier (jalankan di macOS playground atau script)

import CreateML
import Foundation

func trainImageClassifier() async throws {
    // Dataset structure:
    // TrainingData/
    //   cat/
    //     image1.jpg, image2.jpg, ...
    //   dog/
    //     image1.jpg, image2.jpg, ...

    let trainingDataURL = URL(fileURLWithPath: "/path/to/TrainingData")
    let validationDataURL = URL(fileURLWithPath: "/path/to/ValidationData")

    // Konfigurasi training
    var parameters = MLImageClassifier.ModelParameters()
    parameters.maxIterations = 25
    parameters.validationData = .dataSource(.labeledDirectories(at: validationDataURL))
    parameters.augmentationOptions = [.flip, .blur, .exposure, .noise]  // Data augmentation

    // Mulai training (bisa memakan beberapa menit)
    let classifier = try await MLImageClassifier(
        trainingData: .labeledDirectories(at: trainingDataURL),
        parameters: parameters
    )

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

    // Simpan sebagai .mlpackage
    let modelURL = URL(fileURLWithPath: "/path/to/output/AnimalClassifier.mlpackage")
    let metadata = MLModelMetadata(
        author: "MyApp",
        shortDescription: "Klasifikasi anjing dan kucing",
        license: "MIT",
        version: "1.0"
    )
    try classifier.write(to: modelURL, metadata: metadata)
    print("Model saved to: \(modelURL.path)")
}

Text Classifier dengan Create ML

swift
// Create ML: training text classifier untuk kategori konten

import CreateML
import Foundation

func trainTextClassifier() async throws {
    // Dataset: CSV dengan kolom "text" dan "label"
    // text,label
    // "Produk ini sangat bagus!",positive
    // "Kualitas buruk, tidak sesuai deskripsi",negative

    let trainingCSV = URL(fileURLWithPath: "/path/to/reviews_train.csv")
    let trainingData = try MLDataTable(contentsOf: trainingCSV)

    var parameters = MLTextClassifier.ModelParameters()
    parameters.algorithm = .maxEnt(revision: 1)  // atau .transferLearning untuk akurasi lebih tinggi
    parameters.language = .indonesian

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

    print("Training accuracy: \(1 - classifier.trainingMetrics.classificationError)")

    let modelURL = URL(fileURLWithPath: "/path/to/output/SentimentClassifier.mlpackage")
    try classifier.write(to: modelURL, metadata: MLModelMetadata(
        author: "MyApp",
        shortDescription: "Analisis sentimen ulasan produk"
    ))
}

Tabular Classifier / Regressor

swift
// Create ML: training model untuk data tabular (prediksi numerik atau kategori)

import CreateML
import Foundation

func trainHousePriceRegressor() async throws {
    // CSV: size_m2, bedrooms, bathrooms, location, price
    let dataURL = URL(fileURLWithPath: "/path/to/house_prices.csv")
    let allData = try MLDataTable(contentsOf: dataURL)

    // Split 80/20
    let (trainingData, testData) = allData.randomSplit(by: 0.8, seed: 42)

    var parameters = MLBoostedTreeRegressor.ModelParameters()
    parameters.maximumDepth = 6
    parameters.maximumIterations = 100
    parameters.earlyStoppingRounds = 5

    let regressor = try await MLBoostedTreeRegressor(
        trainingData: trainingData,
        targetColumn: "price",
        parameters: parameters
    )

    // Evaluasi di test set
    let evaluationMetrics = regressor.evaluation(on: testData)
    print("RMSE: \(evaluationMetrics.rootMeanSquaredError)")
    print("Max Error: \(evaluationMetrics.maximumError)")

    let modelURL = URL(fileURLWithPath: "/path/to/output/HousePricePredictor.mlpackage")
    try regressor.write(to: modelURL)
}