public ITrainerEstimator CreateInstance(MLContext mlContext, IEnumerable <SweepableParam> sweepParams, ColumnInformation columnInfo, IDataView validationSet) { LightGbmMulticlassTrainer.Options options = TrainerExtensionUtil.CreateLightGbmOptions <LightGbmMulticlassTrainer.Options, VBuffer <float>, MulticlassPredictionTransformer <OneVersusAllModelParameters>, OneVersusAllModelParameters>(sweepParams, columnInfo); return(mlContext.MulticlassClassification.Trainers.LightGbm(options)); }
LightGbm(this SweepableMultiClassificationTrainers trainer, string labelColumnName = "Label", string featureColumnName = "Features", SweepableOption <LightGbmMulticlassTrainer.Options> optionBuilder = null, LightGbmMulticlassTrainer.Options defaultOption = null) { var context = trainer.Context; if (optionBuilder == null) { optionBuilder = LightGbmMulticlassTrainerSweepableOptions.Default; } optionBuilder.SetDefaultOption(defaultOption); return(context.AutoML().CreateSweepableEstimator( (context, option) => { if (defaultOption != null) { Util.CopyFieldsTo(defaultOption, option); } option.LabelColumnName = labelColumnName; option.FeatureColumnName = featureColumnName; return context.MulticlassClassification.Trainers.LightGbm(option); }, optionBuilder, trainerName: nameof(LightGbmMulticlassTrainer), inputs: new string[] { featureColumnName }, outputs: new string[] { PredictedLabel })); }
// This example requires installation of additional NuGet package for // Microsoft.ML.FastTree at // https://www.nuget.org/packages/Microsoft.ML.FastTree/ public static void Example() { // Create a new context for ML.NET operations. It can be used for // exception tracking and logging, as a catalog of available operations // and as the source of randomness. Setting the seed to a fixed number // in this example to make outputs deterministic. var mlContext = new MLContext(seed: 0); // Create a list of training data points. var dataPoints = GenerateRandomDataPoints(1000); // Convert the list of data points to an IDataView object, which is // consumable by ML.NET API. var trainingData = mlContext.Data.LoadFromEnumerable(dataPoints); // Define trainer options. var options = new LightGbmMulticlassTrainer.Options { Booster = new DartBooster.Options() { TreeDropFraction = 0.15, XgboostDartMode = false } }; // Define the trainer. var pipeline = // Convert the string labels into key types. mlContext.Transforms.Conversion.MapValueToKey("Label") // Apply LightGbm multiclass trainer. .Append(mlContext.MulticlassClassification.Trainers .LightGbm(options)); // Train the model. var model = pipeline.Fit(trainingData); // Create testing data. Use different random seed to make it different // from training data. var testData = mlContext.Data .LoadFromEnumerable(GenerateRandomDataPoints(500, seed: 123)); // Run the model on test data set. var transformedTestData = model.Transform(testData); // Convert IDataView object to a list. var predictions = mlContext.Data .CreateEnumerable <Prediction>(transformedTestData, reuseRowObject: false).ToList(); // Look at 5 predictions foreach (var p in predictions.Take(5)) { Console.WriteLine($"Label: {p.Label}, " + $"Prediction: {p.PredictedLabel}"); } // Expected output: // Label: 1, Prediction: 1 // Label: 2, Prediction: 2 // Label: 3, Prediction: 3 // Label: 2, Prediction: 2 // Label: 3, Prediction: 3 // Evaluate the overall metrics var metrics = mlContext.MulticlassClassification .Evaluate(transformedTestData); PrintMetrics(metrics); // Expected output: // Micro Accuracy: 0.98 // Macro Accuracy: 0.98 // Log Loss: 0.07 // Log Loss Reduction: 0.94 // Confusion table // ||======================== // PREDICTED || 0 | 1 | 2 | Recall // TRUTH ||======================== // 0 || 156 | 0 | 4 | 0.9750 // 1 || 0 | 171 | 6 | 0.9661 // 2 || 1 | 0 | 162 | 0.9939 // ||======================== // Precision ||0.9936 |1.0000 |0.9419 | }
private static void Main(string[] args) { // Simuliert die Messungenauigkeit. Ist der relative Standardfehler. 0.1 bedeutet also, // dass bei einem berechneten Wert von 70 der Messwert in 68% der Fälle // (Normalverteilung) zwischen 70 +/- 7 ist. float bias = 0.1f; Randomizer.Seed = new Random(82541); Faker fkr = new Faker(); Accesspoint[] accesspoints = new Accesspoint[] { new Accesspoint("a1", new Point(0, 30)), new Accesspoint("a2", new Point(10, 20)), new Accesspoint("a3", new Point(0, 0)) }; // WIr positionieren 30 virtuelle Smartphones im Stockwerk. var devices = (from i in Enumerable.Range(0, 30) select new { Id = Guid.NewGuid().ToString("N"), Point = new Point(fkr.Random.Float(0, 10), fkr.Random.Float(0, 30)) }).ToArray(); List <Measurement> measurements = new List <Measurement>(); // Nun führen wir jede Minute eine Messung durch. for (DateTime date = new DateTime(2020, 1, 1, 12, 0, 0); date < new DateTime(2020, 1, 1, 13, 0, 0); date = date.AddMinutes(1)) { // Jedes Gerät liefert einen Messwert. foreach (var device in devices) { // Wir bekommen zwischen 1 und (Anz AP) pro Messung gesendet. Da nicht immer alle // APs empfangen werden, ist das ein guter Test, ob unser Programm damit umgehen // kann. var measuredAccesspoints = fkr.Random.ListItems(accesspoints, fkr.Random.Int(1, accesspoints.Length)); var signals = from ap in measuredAccesspoints let signalStrength = device.Point.SignalStrength(ap, val => fkr.Random.GaussianFloat(val, val * bias)) select new Signal(ap, signalStrength); Measurement m = new Measurement(device.Id, date, device.Point, signals); measurements.Add(m); } } var avgAp = measurements.Select(m => m.Signals.Count()).Average(); Console.WriteLine($"{measurements.Count} Messungen, {avgAp:0.00} APs pro Messung im Mittel."); var table = from m in measurements select new { m.Device, m.Date, m.Location.Room, // Floatarray mit den gemessenen Feldstärken der Accesspoint. Ist genau in // der Reihenfolge und größe wie unser accesspoints Array. // Details siehe in der Funktion Spread in der Datei ArrayExtensions.cs. Signals = m.Signals.Spread(accesspoints, s => s.Accesspoint).Select(s => s?.Value ?? 0).ToArray() }; using (var outStream = new StreamWriter("measurements.txt", false, Encoding.UTF8)) { outStream.WriteLine($"DEVICE\tROOM\tDATE\t{string.Join('\t', accesspoints.Select(s => s.Mac))}"); foreach (var row in table) { outStream.WriteLine($"{row.Device}\t{row.Room}\t{row.Date}\t{string.Join('\t', row.Signals)}"); } } // https://docs.microsoft.com/en-us/dotnet/api/microsoft.ml.lightgbmextensions.lightgbm?view=ml-dotnet // Define trainer options. var options = new LightGbmMulticlassTrainer.Options { LabelColumnName = nameof(RoomMeasurement.Label), FeatureColumnName = nameof(RoomMeasurement.Values), Booster = new DartBooster.Options() { TreeDropFraction = 0.15, XgboostDartMode = false } }; var mlContext = new MLContext(seed: 0); var trainData = mlContext.Data.LoadFromEnumerable(from m in measurements select new RoomMeasurement { Label = m.Location.Room, Values = m.Signals.Spread(accesspoints, s => s.Accesspoint).Select(s => s?.Value ?? 0).ToArray() }); // Define the trainer. var pipeline = mlContext.Transforms.Conversion.MapValueToKey(nameof(RoomMeasurement.Label)) .Append(mlContext.MulticlassClassification.Trainers.LightGbm(options)); var model = pipeline.Fit(trainData); // Create testing data. Use different random seed to make it different // from training data. var testData = trainData; // Wandelt die Label in UInt32 Werte für die interne Verarbeitung. var transformedTestData = model.Transform(testData); // Convert IDataView object to a list. var predictions = mlContext.Data .CreateEnumerable <RoomPrediction>(transformedTestData, reuseRowObject: false).ToList(); // Look at 5 predictions foreach (var p in predictions.Take(5)) { Console.WriteLine($"Label: {p.Label}, Prediction: {p.PredictedLabel}"); } var metrics = mlContext.MulticlassClassification.Evaluate(transformedTestData); PrintMetrics(metrics); }