Вопрос по f#, .net, ml.net – stackoverflow.com/questions/50910370/...

9

трю на файл 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
Обратите внимание, что больше нет необходимости в уродливых изменяемых полях:github.com/dotnet/machinelearning/pull/616 , Таким образом, стиль кода в вопросе и ответах не соответствует текущему состоянию ML.Net. Charles Roddie
Использование POCO по-прежнему вызывает ту же ошибку. jks612
F # эквивалент C #IrisData а такжеIrisPrediction классы, используемые в руководстве, являются пользовательскими типами (POCO), а не записями F #, используемыми в вашем коде. Gene Belitski
Поля в ваших POCO неpublic как в C #. Gene Belitski

Ваш Ответ

1   ответ
9

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 . . .
На сегодняшний день (Microsoft.ML 0.2) для этого требуется дополнительныйopen Microsoft.ML.Data в шапке иpipeline.Add(TextLoader(dataPath).CreateFrom<IrisData>(separator=',')) чтобы загрузить CSV, см. такжеstackoverflow.com/questions/50910370/... Davide Fiocco
Спасибо, Джин. Это работает и многому меня учит. jks612
@ jks612 - С удовольствием, я тоже учусь на своих F # ответах. Gene Belitski

Похожие вопросы