Как предсказать целочисленные значения, используя ML.NET? - PullRequest
0 голосов
/ 24 мая 2018

Я смотрю файл CS здесь: https://www.microsoft.com/net/learn/apps/machine-learning-and-ai/ml-dotnet/get-started/windows и все работает хорошо.

Теперь я хотел бы улучшить пример: я хотел бы предсказать число-только набор данных, а не набор числовых данных, например, предсказать выходной результат отображения семи сегментов.

Вот мой супер простой набор данных, последний столбец - это целое число, которое я хочу предсказать:

1,0,1,1,1,1,1,0
0,0,0,0,0,1,1,1
1,1,1,0,1,1,0,2
1,1,1,0,0,1,1,3
0,1,0,1,0,1,1,4
1,1,1,1,0,0,1,5
1,1,1,1,1,0,1,6
1,0,0,0,0,1,1,7
1,1,1,1,1,1,1,8
1,1,1,1,0,1,1,9

А вот мой тестовый код:

public class Digit
{
    [Column("0")] public float Up;

    [Column("1")] public float Middle;

    [Column("2")] public float Bottom;

    [Column("3")] public float UpLeft;
    [Column("4")] public float BottomLeft;
    [Column("5")] public float TopRight;
    [Column("6")] public float BottomRight;

    [Column("7")] [ColumnName("DigitValue")]
    public float DigitValue;
}

public class DigitPrediction
{
    [ColumnName("PredictedDigits")] public float PredictedDigits;
}

public PredictDigit()
{
    var pipeline = new LearningPipeline();
    var dataPath = Path.Combine("Segmenti", "segments.txt");
    pipeline.Add(new TextLoader<Digit>(dataPath, false, ","));
    pipeline.Add(new ColumnConcatenator("Label", "DigitValue"));
    pipeline.Add(new ColumnConcatenator("Features", "Up", "Middle", "Bottom", "UpLeft", "BottomLeft", "TopRight", "BottomRight"));
    pipeline.Add(new StochasticDualCoordinateAscentClassifier());
    var model = pipeline.Train<Digit, DigitPrediction>();
    var prediction = model.Predict(new Digit
    {
        Up = 1,
        Middle = 1,
        Bottom = 1,
        UpLeft = 1,
        BottomLeft = 1,
        TopRight = 1,
        BottomRight = 1,
    });

    Console.WriteLine($"Predicted digit is: {prediction.PredictedDigits}");
    Console.ReadLine();
}

Как вы можете видеть, он очень похож на приведенный пример, за исключением обработки последнего столбца («Метка»), поскольку мне нужно предсказатьчисло, а не строка.Я пытаюсь с:

pipeline.Add(new ColumnConcatenator("Label", "DigitValue"));

, но это не работает, исключение:

Training label column 'Label' type is not valid for multi-class: Vec<R4, 1>. Type must be R4 or R8.

Я уверен, что что-то упустил, но на самом деле я не могу найти в Интернете ничего, что могло бы помочь мне решитьэта проблема.

ОБНОВЛЕНИЕ

Я обнаружил, что набор данных должен иметь столбец Label, например:

[Column("7")] [ColumnName("Label")] public float Label;

и столбец DigitPrediction a Score, например:

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

Теперь система «работает», и я получил значение prediction.Score a Single[], где индекс связан с более высоким значениемэто прогнозируемое значениеЭто правильный подход?

ОБНОВЛЕНИЕ 2 - Полный пример кода

После ответа и других предложений я получил правильный результат, если вам это нужно, вы можете найти полныйкод здесь .

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Похоже, вам нужно добавить это поле в свой класс DigitPrediction:

public class DigitPrediction
{
    [ColumnName("PredicatedLabel")]
    public uuint ExpectedDigit; // <-- This is the predicted value

    [ColumnName("Score")]
    public float[] Score; // <-- This is the probability that the predicted value is the right classification
}

И я думаю, вам нужно изменить строку, в которую записывается результат:

    Console.WriteLine($"Predicted digit is: {prediction.ExpectedDigit}");

Еще одна вещь, похоже, есть ошибка в API, когда ожидаемая цифра будет выключена на единицу, но если вы сдвинете ее, добавив +1 к прогнозируемому значению, это будет правильное значение.Я ожидаю, что они исправят это в будущем, есть проблема для этого: (https://github.com/dotnet/machinelearning/issues/235)

0 голосов
/ 14 июня 2018

Теперь необходимо следовать шаблону:

  • Элементы столбца (все функции - они должны иметь одинаковый тип)

  • Метка столбца (Ваши «ответы»)

Если в исходном наборе данных есть другой столбец ответа, используйте:

pipeline.Add(new ColumnCopier(("DigitValue", "Label")));

Первым является источник, вторым являетсяместо назначения.Как я вижу, требуется двойное '('.

0 голосов
/ 24 мая 2018

Вы также можете использовать попробуйте заменить ColumnConcatenator на ColumnCopier в конвейере для столбца Label.

pipeline.Add(new ColumnCopier ("Label", "DigitValue"));

Это будет указывать конвейеру, какой столбец является меткой, но вывод ColumnCopier не будет вектором, в отличие от вывода ColumnConcatenator.

И также можно добавить столбец «Оценка».

...