Çapraz doğrulama kullanarak makine öğrenmesi modelini eğitin

ML.NET'da daha güçlü makine öğrenmesi modelleri eğitmek için çapraz doğrulamayı kullanmayı öğrenin.

Çapraz doğrulama, verileri birkaç bölüme bölen ve bu bölümlerde birden çok algoritma eğiten bir eğitim ve model değerlendirme tekniğidir. Bu teknik, eğitim sürecindeki verileri tutarak modelin sağlamlığını artırır. Veri kısıtlanmış ortamlarda, görünmeyen gözlemlerde performansı artırmanın yanı sıra, daha küçük bir veri kümesine sahip modelleri eğitmek için etkili bir araç olabilir.

Veri ve veri modeli

Aşağıdaki biçime sahip bir dosyadan verilen veriler:

Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
620.00, 148330.32, 140913.81, 136686.39, 146105.37
550.00, 557033.46, 529181.78, 513306.33, 548677.95
1127.00, 479320.99, 455354.94, 441694.30, 472131.18
1120.00, 47504.98, 45129.73, 43775.84, 46792.41

Veriler gibi HousingData bir sınıf tarafından modellenebilir ve içine IDataViewyüklenebilir.

public class HousingData
{
    [LoadColumn(0)]
    public float Size { get; set; }

    [LoadColumn(1, 3)]
    [VectorType(3)]
    public float[] HistoricalPrices { get; set; }

    [LoadColumn(4)]
    [ColumnName("Label")]
    public float CurrentPrice { get; set; }
}

Verileri hazırlama

Makine öğrenmesi modelini oluşturmak için kullanmadan önce verileri önceden işleyin. Bu örnekte ve HistoricalPrices sütunları, Size yöntemi kullanılarak adlı Features yeni bir sütuna çıkış olan tek bir özellik vektörlerinde Concatenate birleştirilir. Sütunları birleştirmek, verileri ML.NET algoritmalar tarafından beklenen biçime getirmenin yanı sıra, işlemi ayrı sütunların her biri yerine birleştirilmiş sütun için bir kez uygulayarak işlem hattındaki sonraki işlemleri iyileştirir.

Sütunlar tek bir vektörde birleştirildikten sonra, NormalizeMinMax 0-1 arasında aynı aralıkta ve HistoricalPrices almak Size için sütuna uygulanırFeatures.

// Define data prep estimator
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", new string[] { "Size", "HistoricalPrices" })
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

// Create data prep transformer
ITransformer dataPrepTransformer = dataPrepEstimator.Fit(data);

// Transform data
IDataView transformedData = dataPrepTransformer.Transform(data);

Çapraz doğrulama ile modeli eğitin

Veriler önceden işlendikten sonra modeli eğitmek gerekir. İlk olarak, gerçekleştirilecek makine öğrenmesi göreviyle en yakından uyumlu algoritmayı seçin. Tahmin edilen değer sayısal olarak sürekli bir değer olduğundan, görev regresyondur. ML.NET tarafından uygulanan regresyon algoritmalarından biri algoritmadır StochasticDualCoordinateAscentCoordinator . Modeli çapraz doğrulama ile eğitmek için yöntemini kullanın CrossValidate .

Not

Bu örnek doğrusal regresyon modeli kullansa da CrossValidate, Anomali Algılama dışında ML.NET'daki diğer tüm makine öğrenmesi görevleri için geçerlidir.

// Define StochasticDualCoordinateAscent algorithm estimator
IEstimator<ITransformer> sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Apply 5-fold cross validation
var cvResults = mlContext.Regression.CrossValidate(transformedData, sdcaEstimator, numberOfFolds: 5);

CrossValidate aşağıdaki işlemleri gerçekleştirir:

  1. Verileri parametresinde belirtilen değere eşit sayıda bölüme numberOfFolds ayırır. Her bölümün sonucu bir TrainTestData nesnedir.
  2. Bir model, eğitim veri kümesinde belirtilen makine öğrenmesi algoritması tahmin aracı kullanılarak bölümlerin her birinde eğitilir.
  3. Her modelin performansı test veri kümesindeki Evaluate yöntemi kullanılarak değerlendirilir.
  4. Model, ölçümleriyle birlikte modellerin her biri için döndürülür.

içinde cvResults depolanan sonuç bir nesne koleksiyonudur CrossValidationResult . Bu nesne, eğitilen modelin yanı sıra sıra ve Metrics özellikleri için Model erişilebilir olan ölçümleri içerir. Bu örnekte özelliği Model türünde ITransformer ve Metrics özelliği türündedir RegressionMetrics.

Modeli değerlendirme

Farklı eğitilen modellerin ölçümlerine tek tek CrossValidationResult nesnenin Metrics özelliği aracılığıyla erişilebilir. Bu durumda R-Squared ölçümüne erişilir ve değişkeninde rSquareddepolanır.

IEnumerable<double> rSquared =
    cvResults
        .Select(fold => fold.Metrics.RSquared);

Değişkenin rSquared içeriğini incelerseniz, çıkış 0-1 arasında beş değer olmalıdır ve 1'e yakın olması en iyi anlama gelir. R-Squared gibi ölçümleri kullanarak en iyiden en kötü performansa kadar modelleri seçin. Ardından tahminde bulunmak veya ek işlemler gerçekleştirmek için en iyi modeli seçin.

// Select all models
ITransformer[] models =
    cvResults
        .OrderByDescending(fold => fold.Metrics.RSquared)
        .Select(fold => fold.Model)
        .ToArray();

// Get Top Model
ITransformer topModel = models[0];