Я смотрю файл 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 - Полный пример кода
После ответа и других предложений я получил правильный результат, если вам это нужно, вы можете найти полныйкод здесь .