ML.NET System.ArgumentOutOfRangeException: 'Scole column 'Score' not found

0

Cześć, przerabiam przykładowy kod z tej strony: https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-started/Regression_TaxiFarePrediction, ale otrzymałem następujący błąd:
screenshot-20201212175909.png
Mój kod wygląda następująco:

 public Context(int yearStart, int yearEnd, double testFraction)
        {
            this.mlContext = new MLContext(seed: 0);
            DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<InputData>();
            string query = string.Format("select * from ExportData where Year > {0} and Year < {1}", yearStart, yearEnd);
            DatabaseSource source = new DatabaseSource(SqlClientFactory.Instance, SqlOperations.Connection.ConnectionString, query);

            IDataView data = loader.Load(source);

            DataOperationsCatalog.TrainTestData datasetSplit = this.mlContext.Data.TrainTestSplit(data, 0.4);
            this.trainData = datasetSplit.TrainSet;
            this.testData = datasetSplit.TestSet;

            var pipeline = this.mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: nameof(InputData.Prices)).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "Prices", inputColumnName: nameof(InputData.Prices))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "GPD", inputColumnName: nameof(InputData.GPD))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "Inflation", inputColumnName: nameof(InputData.Inflation))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "InterestRate", inputColumnName: nameof(InputData.InterestRate))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "Employment", inputColumnName: nameof(InputData.Employment))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "Unemployment", inputColumnName: nameof(InputData.Unemployment))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "Population", inputColumnName: nameof(InputData.Population))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "Salaries", inputColumnName: nameof(InputData.Salaries))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "Migrations", inputColumnName: nameof(InputData.Migrations))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "Marriages", inputColumnName: nameof(InputData.Marriages))).
                Append(this.mlContext.Transforms.NormalizeMeanVariance(outputColumnName: "BirghtRate", inputColumnName: nameof(InputData.BirghtRate))).
                Append(this.mlContext.Transforms.Concatenate("Features", "Prices", "GPD", "Inflation", "InterestRate", "Employment", "Unemployment", "Population", "Salaries", "Migrations", "Marriages", "BirghtRate"));

            pipeline.Append(this.mlContext.Regression.Trainers.Sdca(labelColumnName: "Label", featureColumnName: "Features"));

            this.model = pipeline.Fit(this.trainData);

            IDataView predictions = this.model.Transform(this.testData);
            var metrics = mlContext.Regression.Evaluate(predictions, labelColumnName: "Label", scoreColumnName: "Score"); 
        }

W przykładzie nie znalazłem odpowiedzi na to, a wygląda, że ta kolumna ma być wynikiem działania tego uczenia. Dalszej części tego kodu jeszcze nie ruszyłem, bo utknąłem na tym problemie. Z góry dziękuję za pomoc, dopiero uczę się tej biblioteki.

0

Podałeś w definicji klasy atrybut z nazwą kolumny?

 public class TaxiTripFarePrediction
    {
        [ColumnName("Score")]
        public float FareAmount;
    }
0

@AdamWox: Nie miałem dodanych. Dodałem teraz i błąd jest ten sam. Trzeba gdzieś jeszcze to pole zadeklarować?

using Microsoft.ML.Data;

namespace Praca.Models
{
    public class InputData
    {
        public float Year { get; set; }
        public float Prices { get; set; }
        public float GPD { get; set; }
        public float Inflation { get; set; }
        public float InterestRate { get; set; }
        public float Employment { get; set; }
        public float Unemployment { get; set; }
        public float Population { get; set; }
        public float Salaries { get; set; }
        public float Migrations { get; set; }
        public float Marriages { get; set; }
        public float BirghtRate { get; set; }
        public float ForecastPrice { get; set; }
    }

    public class TaxiTripFarePrediction
    {
        [ColumnName("Score")]
        public float FareAmount;
    }
}

0

Mam! ;-)

var pipeline = this.mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: nameof(InputData.Prices)).

W tym miejscu powinieneś mieć nameof(TaxiTripFarePrediction.FareAmount)

Linia 67
https://github.com/dotnet/machinelearning-samples/tree/master/samples/csharp/getting-started/Regression_TaxiFarePrediction

0

Dzisiaj podjąłem kolejne próby. Nie doszedłem jeszcze do etapu ewaluacji modelu, ale natrafiłem na problem (a może to normalne). Robiłem wszystko według przykładu na stronie, pominąłem tylko normalizację i konwersje stringów, bo w moich danych nie ma ani jednego stringa. Zauważyłem teraz ze po uruchomieniu tego konstruktora działa on bardzo długo, gdy po godzinie sprawdziłem co się dzieje, to program dalej działał i dalej wykonywał uczenie, czy to normalne?

Mój aktualny kod:

public Context(int yearStart, int yearEnd, double testFraction = 0.2)
        {
            this.mlContext = new MLContext(seed: 0);

            //Załadowanie danych
            DatabaseLoader loader = this.mlContext.Data.CreateDatabaseLoader<InputData>();
            string query = string.Format("select * from ExportData where Year >= {0} and Year < {1}", yearStart, yearEnd);
            DatabaseSource source = new DatabaseSource(SqlClientFactory.Instance, SqlOperations.Connection.ConnectionString, query);

            IDataView data = loader.Load(source);

            //Zastąpienie pustych wartości wartościami średnimi
            var replacmentEstimator = this.mlContext.Transforms.ReplaceMissingValues("Prices", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean).
                Append(this.mlContext.Transforms.ReplaceMissingValues("GPD", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("Inflation", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("InterestRate", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("Employment", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("Unemployment", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("Population", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("Salaries", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("Migrations", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("Marriages", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean)).
                Append(this.mlContext.Transforms.ReplaceMissingValues("BirghtRate", replacementMode: MissingValueReplacingEstimator.ReplacementMode.Mean));

            ITransformer replacmentTransformer = replacmentEstimator.Fit(data);
            IDataView ReplacmentData = replacmentTransformer.Transform(data);

            var pipeline = this.mlContext.Transforms.CopyColumns("Label", nameof(InputData.Prices)).Append(this.mlContext.Transforms.Concatenate("Features", new string[] { nameof(InputData.Prices), nameof(InputData.GPD), nameof(InputData.Inflation), nameof(InputData.InterestRate), nameof(InputData.Employment), nameof(InputData.Unemployment), nameof(InputData.Population), nameof(InputData.Salaries), nameof(InputData.Migrations), nameof(InputData.Marriages), nameof(InputData.BirghtRate)}));

            var trainer = this.mlContext.Regression.Trainers.Sdca(labelColumnName: "Label", featureColumnName: "Features");

            //Podział na zbiór uczący i testowy
            DataOperationsCatalog.TrainTestData datasetSplit = this.mlContext.Data.TrainTestSplit(ReplacmentData, testFraction);
            IDataView trainData = datasetSplit.TrainSet;
            IDataView testData = datasetSplit.TestSet;

            //Uczenie modelu
            var trainingPipeline = pipeline.Append(trainer);
            var trainedModel = trainingPipeline.Fit(trainData);

            MessageBox.Show("Koniec");
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1