Share via


Modeli eğitme ve değerlendirme

ML.NET ile makine öğrenmesi modelleri oluşturmayı, ölçümleri toplamayı ve performansı ölçmeyi öğrenin. Bu örnek bir regresyon modelini eğitse de, kavramlar diğer algoritmaların çoğu boyunca geçerlidir.

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

Makine öğrenmesi modelinin amacı, eğitim verileri içindeki desenleri belirlemektir. Bu desenler, yeni verileri kullanarak tahminlerde bulunmak için kullanılır.

Veriler gibi HousingDatabir sınıf tarafından modellenebilir.

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

bir içine IDataViewyüklenen aşağıdaki veriler göz önünde bulundurulduğunda.

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

TrainTestSplit Verileri eğitmek ve test kümelerine bölmek için yöntemini kullanın. Sonuç, biri tren kümesi, diğeri de test kümesi için olmak üzere iki IDataView üye içeren bir TrainTestData nesne olacaktır. Veri bölme yüzdesi parametresi tarafından testFraction belirlenir. 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 öğrenmesi modelini eğitmeden önce verilerin önceden işlenmesi gerekir. Veri hazırlama hakkında daha fazla bilgi için veri hazırlama nasıl yapılır makalesinde ve makalesinde transforms pagebulunabilir.

ML.NET algoritmaları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 içindeki makine öğrenmesi algoritmaları, giriş olarak bilinen boyutta bir float vektörünün olmasını bekler. VectorType Tüm veriler zaten sayısal biçimdeyse ve birlikte işlenmek üzere tasarlandığında (görüntü pikselleri gibi) özniteliğini veri modelinize uygulayın.

Verilerin tümü sayısal değilse ve sütunların her birine ayrı ayrı farklı veri dönüştürmeleri uygulamak istiyorsanız, tüm sütunlar işlendikten sonra tek tek sütunların tümünü yeni bir sütuna çıkış olan tek bir özellik vektörünün içinde birleştirmek için yöntemini kullanın Concatenate .

Aşağıdaki kod parçacığı, ve HistoricalPrices sütunlarını Size adlı Featuresyeni bir sütuna çıkış olan tek bir özellik vektörlerinde birleştirir. Ölçekler farklı olduğundan, NormalizeMinMax verileri normalleştirmek için Features sütuna uygulanır.

// 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ı, belirtilmezken varsayılan sütun adlarını kullanır. Tüm eğitmenlerin algoritma girişleri için adlı featureColumnName bir parametresi vardır ve uygun olduğunda da adlı labelColumnNamebeklenen değer için bir parametresi vardır. Varsayılan olarak bu değerler sırasıyla ve Label şeklindedirFeatures.

adlı yeni bir sütun Featuresoluşturmak için ön işleme sırasında yöntemini kullanarakConcatenate, önceden işlenmiş IDataViewiçinde zaten mevcut olduğundan algoritmanın parametrelerinde özellik sütun adını belirtmeye gerek yoktur. Etiket sütunu olurCurrentPrice, ancak öznitelik veri modelinde kullanıldığından ColumnName ML.NET, parametreyi makine öğrenmesi algoritması tahmin aracına Label sağlama labelColumnName gereksinimini ortadan kaldıran sütunu yeniden adlandırırCurrentPrice.

Varsayılan sütun adlarını kullanmak istemiyorsanız, sonraki kod parçacığında gösterildiği gibi makine öğrenmesi algoritması tahmin aracısını tanımlarken özellik adlarını ve etiket sütunlarını parametre olarak geçirin:

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

Verileri önbelleğe alma

Varsayılan olarak, veriler işlendiğinde, gevşek bir şekilde yüklenir veya akış yapılır, bu da eğitmenlerin diskten veri yükleyebileceği ve eğitim sırasında birden çok kez yineleyebilecekleri anlamına gelir. Bu nedenle önbelleğe alma, diskten veri yükleme sayısını azaltmak için belleğe sığan veri kümeleri için önerilir. Önbelleğe Alma kullanılarak AppendCacheCheckpointbir EstimatorChain parçası olarak yapılır.

İşlem hattındaki herhangi bir eğitmenden önce kullanılması AppendCacheCheckpoint önerilir.

Aşağıdakini EstimatorChainkullanarak, eğitmenin StochasticDualCoordinateAscent daha sonra kullanması için önceki tahmin edicilerin sonuçlarını önbelleğe almadan önce ekleyinAppendCacheCheckpoint.

// 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 öğrenmesi modelini eğitin

Veriler önceden işlendikten sonra, makine öğrenmesi Fit modelini regresyon algoritmasıyla StochasticDualCoordinateAscent eğitmek için yöntemini kullanın.

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

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

Model parametrelerini ayıklama

Model eğitildikten sonra, inceleme veya yeniden eğitme için öğrenilenleri ModelParameters ayıklayın. , LinearRegressionModelParameters eğitilen modelin sapma ve öğ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-Means algoritması verileri centroids temelinde kümeye yerleştirir ve KMeansModelParameters bu öğrenilen centroid'leri depolayan bir özellik içerir. Daha fazla bilgi edinmek için API Belgeleri'ni Microsoft.ML.Trainers ziyaret edin ve adında sınıflar ModelParameters bulun.

Model kalitesini değerlendirme

En iyi performansa sahip modeli seçmeye yardımcı olmak için test verilerinde performansını değerlendirmek önemlidir. Eğitilen modelin Evaluate çeşitli ölçümlerini ölçmek için yöntemini kullanın.

Not

yöntemi, Evaluate hangi makine öğrenmesi görevinin gerçekleştirildiğine bağlı olarak farklı ölçümler üretir. Daha fazla ayrıntı için API Belgeleri'ni Microsoft.ML.Data ziyaret edin ve adında sınıflar Metrics bulun.

// 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üşümleri kullanılarak önceden işlenir.
  2. Eğitilen makine öğrenmesi modeli, test verileriyle ilgili tahminlerde bulunmak için kullanılır.
  3. yönteminde Evaluate , test veri kümesinin CurrentPrice sütunundaki değerler, regresyon modelinin ölçümlerini hesaplamak için yeni çıktı tahminlerinin sütunuyla karşılaştırılır Score ve bunlardan biri R-Squared değişkeninde rSquared depolanır.

Not

Bu küçük örnekte, verilerin sınırlı boyutu nedeniyle R-Squared değeri 0-1 aralığında olmayan bir sayıdır. Gerçek dünya senaryosunda 0 ile 1 arasında bir değer görmeniz gerekir.