Modeli eğitme ve değerlendirme

ML .net ile makine öğrenimi modelleri oluşturmayı, ölçümleri toplamayı ve performansı ölçmeyi öğrenin. Bu örnek bir regresyon modeli sunmakla birlikte, kavramlar diğer algoritmaların çoğunluğu genelinde uygulanabilir.

Eğitim ve test için verileri bölme

Machine Learning modelinin amacı, eğitim verileri içindeki desenleri belirlemektir. Bu desenler, yeni verileri kullanarak tahmine dayalı hale getirmek için kullanılır.

Veriler, gibi bir sınıfa göre modellenebilir HousingData .

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; }
}

' A yüklenen aşağıdaki veriler verilirler IDataView .

HousingData[] housingData = new HousingData[]
{
    new HousingData
    {
        Size = 600f,
        HistoricalPrices = new float[] { 100000f ,125000f ,122000f },
        CurrentPrice = 170000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 200000f, 250000f, 230000f },
        CurrentPrice = 225000f
    },
    new HousingData
    {
        Size = 1000f,
        HistoricalPrices = new float[] { 126000f, 130000f, 200000f },
        CurrentPrice = 195000f
    },
    new HousingData
    {
        Size = 850f,
        HistoricalPrices = new float[] { 150000f,175000f,210000f },
        CurrentPrice = 205000f
    },
    new HousingData
    {
        Size = 900f,
        HistoricalPrices = new float[] { 155000f, 190000f, 220000f },
        CurrentPrice = 210000f
    },
    new HousingData
    {
        Size = 550f,
        HistoricalPrices = new float[] { 99000f, 98000f, 130000f },
        CurrentPrice = 180000f
    }
};

TrainTestSplitVerileri tren ve test kümelerine bölmek için yöntemini kullanın. Sonuç, TrainTestData IDataView biri tren kümesi ve diğeri test kümesi için olmak üzere iki üye içeren bir nesne olacaktır. Veri bölme yüzdesi parametreye göre belirlenir testFraction . Aşağıdaki kod parçacığı, test kümesi için özgün verilerin yüzde 20 ' sini tutuyor.

DataOperationsCatalog.TrainTestData dataSplit = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);
IDataView trainData = dataSplit.TrainSet;
IDataView testData = dataSplit.TestSet;

Verileri hazırlama

Bir makine öğrenimi modeli eğitimi öncesinde verilerin önceden işlenmesi gerekir. Veri hazırlama hakkında daha fazla bilgi için veri hazırlığı nasıl yapılır makalesi ve ' de bulunabilir transforms page .

ML .net algoritmalarının giriş sütunu türlerinde kısıtlamalar vardır. Ayrıca, hiçbir değer belirtilmediğinde, giriş ve çıkış sütun adları için varsayılan değerler kullanılır.

Beklenen sütun türleriyle çalışma

ML .net 'teki makine öğrenimi algoritmaları, girdi olarak bilinen boyutun kayan bir vektörünü bekler. VectorTypeTüm veriler zaten sayısal biçimde olduğunda ve birlikte işlenmek üzere tasarlanıyorsa (örn. resim piksel), özniteliği veri modelinize uygulayın.

Veriler tümüyle sayısal değilse ve her sütuna ayrı ayrı veri dönüştürmeleri uygulamak istiyorsanız, tüm sütunları Concatenate Yeni bir sütuna çıktı olan tek bir özellik vektöründe birleştirmek için tüm sütunlar işlendikten sonra yöntemi kullanın.

Aşağıdaki kod parçacığı, Size ve HistoricalPrices sütunlarını, adlı yeni bir sütuna çıktı olan tek bir özellik vektörü halinde birleştirir Features . Ölçeklerde bir farklılık olduğundan, NormalizeMinMax Features verileri normalleştirmek için sütuna uygulanmış olması gerekir.

// Define Data Prep Estimator
// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
        .Append(mlContext.Transforms.NormalizeMinMax("Features"));

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

// Apply transforms to training data
IDataView transformedTrainingData = dataPrepTransformer.Transform(trainData);

Varsayılan sütun adlarıyla çalışma

ML .net algoritmaları, hiçbiri belirtilmediğinde varsayılan sütun adlarını kullanır. Tüm traers, algoritmanın girdileri için çağrılan bir parametreye sahiptir featureColumnName ve geçerli olduğunda, beklenen değer için bir parametre de vardır labelColumnName . Varsayılan olarak bu değerler Features ve Label sırasıyla.

ConcatenateAdlı yeni bir sütun oluşturmak için ön işleme sırasında yöntemini kullanarak Features , önceden işlenmiş durumda olduğundan, algoritmanın parametrelerinde özellik sütunu adını belirtmeniz gerekmez IDataView . etiket sütunu CurrentPrice , ancak ColumnName özniteliği veri modelinde kullanıldığından, ML .net, CurrentPrice Label labelColumnName machine learning algoritması estimator 'a parametre sağlama gereksinimini kaldıran sütunu yeniden adlandırır.

Varsayılan sütun adlarını kullanmak istemiyorsanız, sonraki kod parçacığında gösterildiği gibi Machine Learning algoritması tahmin Aracı ' ı tanımlarken, özelliğin adlarını ve etiket sütunlarını parametre olarak etiketleyin:

var UserDefinedColumnSdcaEstimator = mlContext.Regression.Trainers.Sdca(labelColumnName: "MyLabelColumnName", featureColumnName: "MyFeatureColumnName");

Verileri önbelleğe alma

Varsayılan olarak, veriler işlendiğinde, geç yüklenir veya akışdır. Bu, traıners 'ın verileri diskten yükleyebileceği ve eğitim sırasında birden çok kez yineleyebilir olması anlamına gelir. Bu nedenle, verilerin diskten kaç kez yüklenemediğini azaltmak için belleğe sığan veri kümelerinde önbelleğe alma önerilir. Önbelleğe Alma, ' nin bir parçası olarak EstimatorChain kullanılarak yapılır AppendCacheCheckpoint .

İşlem AppendCacheCheckpoint hattının herhangi bir aşamasında önce kullanılması önerilir.

Aşağıdakileri kullanarak EstimatorChain , AppendCacheCheckpoint StochasticDualCoordinateAscent daha sonra eğitmen tarafından kullanılmak üzere önceki tahmini sonuçlarının önbelleğe alınmadan önce ekleme yapın.

// 1. Concatenate Size and Historical into a single feature vector output to a new column called Features
// 2. Normalize Features vector
// 3. Cache prepared data
// 4. Use Sdca trainer to train the model
IEstimator<ITransformer> dataPrepEstimator =
    mlContext.Transforms.Concatenate("Features", "Size", "HistoricalPrices")
        .Append(mlContext.Transforms.NormalizeMinMax("Features"))
        .AppendCacheCheckpoint(mlContext);
        .Append(mlContext.Regression.Trainers.Sdca());

Makine öğrenimi modelini eğitme

Veriler önceden işlendikten sonra, Fit makine öğrenimi modelini gerileme algoritmayla eğitme yöntemini kullanın StochasticDualCoordinateAscent .

// Define StochasticDualCoordinateAscent regression algorithm estimator
var sdcaEstimator = mlContext.Regression.Trainers.Sdca();

// Build machine learning model
var trainedModel = sdcaEstimator.Fit(transformedTrainingData);

Model parametrelerini Ayıkla

Model eğitilirken, ModelParameters denetleme veya yeniden eğitim için öğrenilen ' i ayıklayın. LinearRegressionModelParametersEğitilen modelin sapve öğrenilen katsayılarını veya ağırlıklarını sağlar.

var trainedModelParameters = trainedModel.Model as LinearRegressionModelParameters;

Not

Diğer modellerin görevlerine özgü parametreleri vardır. Örneğin, K-anlamı algoritması , verileri centroıd 'ler temelinde kümeye koyar ve KMeansModelParameters Bu öğrenilen centroıd 'leri depolayan bir özelliği içerir. Daha fazla bilgi edinmek için Microsoft.ML.Trainers API belgelerini ziyaret edin ve adlarını içeren sınıfları arayın ModelParameters .

Model kalitesini değerlendir

En iyi performans sağlayan modeli seçmenize yardımcı olmak için test verilerinde performansını değerlendirmek gereklidir. EvaluateEğitilen modele yönelik çeşitli ölçümleri ölçmek için yöntemini kullanın.

Not

EvaluateYöntemi, hangi makine öğrenimi görevinin gerçekleştirildiğine bağlı olarak farklı ölçümler üretir. Daha fazla ayrıntı için Microsoft.ML.Data API belgelerini ziyaret edin ve adlarını içeren sınıfları arayın Metrics .

// Measure trained model performance
// Apply data prep transformer to test data
IDataView transformedTestData = dataPrepTransformer.Transform(testData);

// Use trained model to make inferences on test data
IDataView testDataPredictions = trainedModel.Transform(transformedTestData);

// Extract model metrics and get RSquared
RegressionMetrics trainedModelMetrics = mlContext.Regression.Evaluate(testDataPredictions);
double rSquared = trainedModelMetrics.RSquared;

Önceki kod örneğinde:

  1. Test veri kümesi önceden tanımlanmış veri hazırlama dönüştürmeleri kullanılarak önceden işlenir.
  2. Eğitilen makine öğrenimi modeli, test verilerinde tahminleri yapmak için kullanılır.
  3. EvaluateYönteminde, CurrentPrice test veri kümesi sütunundaki değerler, Score regresyon modeli için ölçümleri hesaplamak üzere yeni çıkış tahminlerinin sütunuyla karşılaştırılır, biri de R-kare olarak rSquared değişkende depolanır.

Not

Bu küçük örnekte, R-kare, verilerin sınırlı büyüklüğü nedeniyle 0-1 aralığında olmayan bir sayıdır. Gerçek dünyada bir senaryoda, 0 ile 1 arasında bir değer görmeniz beklenir.