Я делаю двоичную классификацию в виде ворот XOR, используя ML.NET и SdcaLogisticRegression.
Моя проблема заключается в том, что модель выдает неточные прогнозы для входных данных, которые я ей даю. Например, он предсказывает значение 0 с вероятностью 0,459 для входных данных 0,8 и 0,2.
Не могли бы вы посмотреть, не подходит ли мой код или алгоритм для создания XOR Gate?
Я тренировал модель с различными объемами обучающих данных и каждый раз получал одинаковые результаты (от 200 до 1 млн строк в файле обучающих данных).
IDataView trainingData = context.Data.LoadFromTextFile<XorInput>(trainDataFile, separatorChar: ',', hasHeader: true);
IDataView testData = context.Data.LoadFromTextFile<XorInput>(testDataFile, separatorChar: ',', hasHeader: true);
var trainingPipeline = context.Transforms.Concatenate("Features", "Inputs").Append(context.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName: "Label", featureColumnName: "Features"));
ITransformer trainedModel = trainingPipeline.Fit(trainingData);
XorInput sampleInput = new XorInput { Inputs = new float[] {0.8f, 0.2f } };
var predEngine = context.Model.CreatePredictionEngine<XorInput, XorOutputPrediction>(trainedModel);
var resultprediction = predEngine.Predict(sampleInput);
Console.WriteLine($"=============== Single Prediction ============== = ");
Console.WriteLine($"Inputs: {sampleInput.Inputs[0]}, {sampleInput.Inputs[1]} | Prediction: {(Convert.ToInt16(resultprediction.Prediction))} | Probability: {resultprediction.Probability} ");
Console.WriteLine($"================================================= = ");
Просто для справки, мои классы XorInput и XorOutputPrediction выглядят так:
public class XorInput
{
[LoadColumn(0), ColumnName("Label")]
public bool Label;
[LoadColumn(1,2)]
[VectorType(2)]
//[ColumnName("Features")]
public float[] Inputs;
}
public class XorOutputPrediction
{
[ColumnName("PredictedLabel")]
public bool Prediction { get; set; }
public float Probability { get; set; }
public float Score { get; set; }
}
Данные, содержащиеся в trainDataFile и testDataFile, выглядят следующим образом:
0, 0.9173474, 0.8329648
0, 0.4942033, 0.1281894
0, 0.4558121, 0.1869916
1, 0.738331, 0.4427712
0, 0.8739759, 0.5859472
1, 0.7447554, 0.1089314
1, 0.2433814, 0.6192696
Для входных значений 0,8 и 0,2 я ожидаю выходной прогноз 1.
Я только что переобучил модель с ~ 32 тыс. строк и снова попытался получить правильный прогноз как для 0,8, так и для 0,2, но вероятность составляет всего около 0,52. Как бы мне это увеличить? Редактировать: после переобучения он снова неправильно предсказывает 0 как для обращенного, так и для необратимого.
Я переключил алгоритм обучения на Fast Forest и получил точность до 99,97% с правильными выводами.
Вы пытались поменять местами входы 0,8 и 0,2?