// Definir les schemas des donnees d'entree et de sortie
public class SalesData
{
public float Age { get; set; }
public float Income { get; set; }
public float FamilyStatus { get; set; }
public float EducationLevel { get; set; }
public float ContractType { get; set; }
public float ContractDuration { get; set; }
public float PremiumAmount { get; set; }
public float Region { get; set; }
public float SalesAmount { get; set; }
}
public class SalesPrediction
{
[ColumnName("Score")]
public float SalesAmount { get; set; }
}
// Creer et preparer les donnees d'entrainement
var mlContext = new MLContext(seed: 42);
// Exemple de donnees d'entrainement
var trainingData = new List<SalesData>
{
new SalesData { Age = 30, Income = 50000, FamilyStatus = 1, EducationLevel = 1, ContractType = 0, ContractDuration = 5, PremiumAmount = 300, Region = 0, SalesAmount = 10000 },
new SalesData { Age = 45, Income = 75000, FamilyStatus = 1, EducationLevel = 2, ContractType = 1, ContractDuration = 10, PremiumAmount = 500, Region = 0, SalesAmount = 15000 },
new SalesData { Age = 50, Income = 100000, FamilyStatus = 0, EducationLevel = 2, ContractType = 2, ContractDuration = 15, PremiumAmount = 700, Region = 1, SalesAmount = 20000 },
new SalesData { Age = 30, Income = 55000, FamilyStatus = 0, EducationLevel = 1, ContractType = 1, ContractDuration = 5, PremiumAmount = 350, Region = 1, SalesAmount = 12000 },
new SalesData { Age = 40, Income = 60000, FamilyStatus = 1, EducationLevel = 0, ContractType = 0, ContractDuration = 8, PremiumAmount = 400, Region = 0, SalesAmount = 14000 },
new SalesData { Age = 35, Income = 65000, FamilyStatus = 0, EducationLevel = 2, ContractType = 2, ContractDuration = 7, PremiumAmount = 450, Region = 1, SalesAmount = 16000 },
new SalesData { Age = 55, Income = 80000, FamilyStatus = 1, EducationLevel = 1, ContractType = 0, ContractDuration = 10, PremiumAmount = 600, Region = 1, SalesAmount = 18000 },
new SalesData { Age = 25, Income = 40000, FamilyStatus = 0, EducationLevel = 0, ContractType = 1, ContractDuration = 3, PremiumAmount = 250, Region = 0, SalesAmount = 8000 },
new SalesData { Age = 65, Income = 90000, FamilyStatus = 1, EducationLevel = 2, ContractType = 2, ContractDuration = 12, PremiumAmount = 750, Region = 0, SalesAmount = 22000 },
new SalesData { Age = 50, Income = 70000, FamilyStatus = 0, EducationLevel = 1, ContractType = 1, ContractDuration = 15, PremiumAmount = 500, Region = 1, SalesAmount = 13000 },
new SalesData { Age = 38, Income = 72000, FamilyStatus = 1, EducationLevel = 2, ContractType = 0, ContractDuration = 9, PremiumAmount = 520, Region = 1, SalesAmount = 17000 },
new SalesData { Age = 44, Income = 68000, FamilyStatus = 1, EducationLevel = 1, ContractType = 2, ContractDuration = 11, PremiumAmount = 570, Region = 0, SalesAmount = 19000 },
new SalesData { Age = 60, Income = 85000, FamilyStatus = 1, EducationLevel = 2, ContractType = 1, ContractDuration = 13, PremiumAmount = 650, Region = 0, SalesAmount = 21000 },
new SalesData { Age = 27, Income = 44000, FamilyStatus = 0, EducationLevel = 0, ContractType = 0, ContractDuration = 4, PremiumAmount = 300, Region = 1, SalesAmount = 9000 },
new SalesData { Age = 31, Income = 47000, FamilyStatus = 0, EducationLevel = 1, ContractType = 1, ContractDuration = 6, PremiumAmount = 320, Region = 0, SalesAmount = 11000 },
};
Console.WriteLine($"Nombre d'echantillons : {trainingData.Count}");
// Charger les donnees d'entrainement
var trainingDataView = mlContext.Data.LoadFromEnumerable(trainingData);
// Definir la pipeline d'apprentissage automatique
var pipeline = mlContext.Transforms.Concatenate("Features",
"Age",
"Income",
"FamilyStatus",
"EducationLevel",
"ContractType",
"ContractDuration",
"PremiumAmount",
"Region")
.Append(mlContext.Regression.Trainers.Sdca(labelColumnName: "SalesAmount", maximumNumberOfIterations: 100));
// Entrainer le modele
Console.WriteLine("\nEntrainement du modele SDCA...");
var model = pipeline.Fit(trainingDataView);
Console.WriteLine("Modele entraine avec succes !");
// Evaluer le modele
var testData = trainingDataView;
var predictions = model.Transform(testData);
var metrics = mlContext.Regression.Evaluate(predictions, labelColumnName: "SalesAmount");
Console.WriteLine("\n=== Metriques d'evaluation ===");
Console.WriteLine($"R-squared : {metrics.RSquared:F4}");
Console.WriteLine($"Mean Absolute Error : {metrics.MeanAbsoluteError:F2}");
Console.WriteLine($"Root Mean Squared Error : {metrics.RootMeanSquaredError:F2}");
// Faire une prediction
var predictionFunc = mlContext.Model.CreatePredictionEngine<SalesData, SalesPrediction>(model);
var newSalesData = new SalesData { Age = 35, Income = 60000, FamilyStatus = 1, EducationLevel = 1, ContractType = 0, ContractDuration = 5, PremiumAmount = 400, Region = 0 };
var prediction = predictionFunc.Predict(newSalesData);
Console.WriteLine($"\nPrediction pour Age=35, Income=60000 : {prediction.SalesAmount:F2}");
// Collecter les donnees pour le graphique
var actualSales = trainingData.Select(x => (double)x.SalesAmount).ToArray();
var predictedSales = mlContext.Data.CreateEnumerable<SalesPrediction>(predictions, reuseRowObject: false).Select(x => (double)x.SalesAmount).ToArray();
var ages = trainingData.Select(x => (double)x.Age).ToArray();
// Graphique : Reel vs Predit
var plt = new ScottPlot.Plot();
plt.Title("Ventes reelles vs predites (Partie 1)");
plt.XLabel("Ventes reelles");
plt.YLabel("Ventes predites");
// Ligne diagonale parfaite
var maxVal = Math.Max(actualSales.Max(), predictedSales.Max()) * 1.1;
plt.Add.Line(0, 0, maxVal, maxVal).Color = ScottPlot.Color.FromHex("#CCCCCC");
plt.Add.Line(0, 0, maxVal, maxVal).LinePattern = ScottPlot.LinePattern.Dashed;
// Points de donnees
plt.Add.Scatter(actualSales, predictedSales);
plt.Axes.SetLimits(0, maxVal, 0, maxVal);
display(HTML(plt.GetPngHtml(600, 400)));