Как перевести вводную демонстрацию ML.Net на F#?
Я смотрю на файл CS здесь: https://www.microsoft.com/net/learn/apps/machine-learning-and-ai/ml-dotnet/get-started/windows и в моей попытке перевести это к F# это компилируется просто отлично, но бросает System.Reflection.TargetInvocationException
когда бегать: FormatException: One of the identified items was in an invalid format
, Что мне не хватает?
Отредактировано: раньше использовал записи
open Microsoft.ML
open Microsoft.ML.Runtime.Api
open Microsoft.ML.Trainers
open Microsoft.ML.Transforms
open System
type IrisData =
[<Column("0")>] val mutable SepalLength : float
[<Column("1")>] val mutable SepalWidth : float
[<Column("2")>] val mutable PetalLength : float
[<Column("3")>] val mutable PetalWidth : float
[<Column("4");ColumnName("Label")>] val mutable Label : string
new(sepLen, sepWid, petLen, petWid, label) =
{ SepalLength = sepLen
SepalWidth = sepWid
PetalLength = petLen
PetalWidth = petWid
Label = label }
type IrisPrediction =
[<ColumnName("PredictedLabel")>] val mutable PredictedLabels : string
new() = { PredictedLabels = "Iris-setosa" }
[<EntryPoint>]
let main argv =
let pipeline = new LearningPipeline()
let dataPath = "iris.data.txt"
pipeline.Add(new TextLoader<IrisData>(dataPath,separator = ","))
pipeline.Add(new Dictionarizer("Label"))
pipeline.Add(new ColumnConcatenator("Features", "SepalLength", "SepalWidth", "PetalLength", "PetalWidth"))
pipeline.Add(new StochasticDualCoordinateAscentClassifier())
pipeline.Add(new PredictedLabelColumnOriginalValueConverter(PredictedLabelColumn = "PredictedLabel") )
let model = pipeline.Train<IrisData, IrisPrediction>()
let prediction = model.Predict(IrisData(3.3, 1.6, 0.2, 5.1,""))
Console.WriteLine("Predicted flower type is: {prediction.PredictedLabels}")
0 // return an integer exit code
1 ответ
Решение
Ниже вы можете найти рабочую версию кода F# для учебника по ML с использованием Microsoft.ML 0.1.0 (может не работать с более новыми версиями). Два основных отличия от вашего кода, которые заставляют пример работать, находятся в пределах IrisData
а также IrisPrediction
определения типа:
- Точная презентация C# POCO в F#, имеющая конструктор без параметров и открытый доступ к полям
- Правильное портирование C#
float
на F#, которыйfloat32
Вот код
open Microsoft.ML
open Microsoft.ML.Runtime.Api
open Microsoft.ML.Trainers
open Microsoft.ML.Transforms
open System
type IrisData() =
[<Column("0")>]
[<DefaultValue>]
val mutable public SepalLength: float32
[<DefaultValue>]
[<Column("1")>]
val mutable public SepalWidth: float32
[<DefaultValue>]
[<Column("2")>]
val mutable public PetalLength:float32
[<DefaultValue>]
[<Column("3")>]
val mutable public PetalWidth:float32
[<DefaultValue>]
[<Column("4")>]
[<ColumnName("Label")>]
val mutable public Label:string
type IrisPrediction() =
[<ColumnName("PredictedLabel")>]
[<DefaultValue>]
val mutable public PredictedLabel : string
[<EntryPoint>]
let main argv =
let pipeline = new LearningPipeline()
let dataPath = "iris.data.txt"
let a = IrisPrediction()
pipeline.Add(new TextLoader<IrisData>(dataPath,separator = ","))
pipeline.Add(new Dictionarizer("Label"))
pipeline.Add(new ColumnConcatenator("Features", "SepalLength", "SepalWidth", "PetalLength", "PetalWidth"))
pipeline.Add(new StochasticDualCoordinateAscentClassifier())
pipeline.Add(new PredictedLabelColumnOriginalValueConverter(PredictedLabelColumn = "PredictedLabel") )
let model = pipeline.Train<IrisData, IrisPrediction>()
let x = IrisData()
x.SepalLength <- 3.3f
x.SepalWidth <- 1.6f
x.PetalLength <- 0.2f
x.PetalWidth <- 5.1f
let prediction = model.Predict(x)
printfn "Predicted flower type is: %s" prediction.PredictedLabel
0
и вывод, который он производит:
Automatically adding a MinMax normalization transform, use 'norm=Warn' or 'norm=No' to turn this behavior off.
Using 4 threads to train.
Automatically choosing a check frequency of 4.
Auto-tuning parameters: maxIterations = 9996.
Auto-tuning parameters: L2 = 2.668802E-05.
Auto-tuning parameters: L1Threshold (L1/L2) = 0.
Using best model from iteration 892.
Not training a calibrator because it is not needed.
Predicted flower type is: Iris-virginica
Press any key to continue . . .