C#使用Visual Studio2022自带的Machine Learning自动生成数据模型,并使用生成的模型进行结果预测。
添加机器学习功能,右击项目->添加->Machine leaning Model
跟具自身训练数据特征选择合适模型进行训练,数据放置Excel按一步步提示导入即可生成MLModel.zip模型
通过调用该模型对新数据进行结果预测
程序结构
//ML定义模型输入、输出
public class ModelInput
{
[ColumnName("Issue"), LoadColumn(0)]
public string Issue { get; set; }
[ColumnName("action"), LoadColumn(1)]
public string Action { get; set; }
}
public class ModelOutput
{
[ColumnName("PredictedLabel")]
public String Prediction { get; set; }
public float[] Score { get; set; }
}
//Form1.cs
ModelInput issue = new ModelInput()
{
Issue = "问题描述"
};
var predictionResult = ConsumeModel.Predict(issue);
string str = "";
//输出前5种可能解决方案及可能性占比
for(int i=0;i<5; i++)
{
str += predictionResult[i] + "\r\n";
}
txb_solution.Text += str;
//ConsumeModel.cs
public class ConsumeModel
{
public static string[] Predict(ModelInput input)
{
MLContext mlContext = new MLContext();
//模型存放路径
string modelPath = Application.StartupPath+ "\\MLModel.zip";
ITransformer mlModel = mlContext.Model.Load(modelPath, out var modelInputSchema);
var predEngine = mlContext.Model.CreatePredictionEngine
var laberBuffer = new VBuffer
predEngine.OutputSchema["Score"].Annotations.GetValue("SlotNames", ref laberBuffer);
var labers = laberBuffer.DenseValues().Select(l => l.ToString()).ToArray();
ModelOutput modelOutput = predEngine.Predict(input);
//更改原先的单结果输出方式,输出前5种可能结果并按可能性大小排序
// ModelOutput modelOutput = PredictionEngine.Value.Predict(input);
var index = Array.IndexOf(labers, modelOutput.Prediction);
var score = modelOutput.Score[index];
var top10Scores = labers.ToDictionary(
l => l,
l => (decimal)modelOutput.Score[Array.IndexOf(labers, l)]
)
.OrderByDescending(kv => kv.Value)
.Take(5)
;
//var labelBuffer = new VBuffer
//predictionEngine.OutputSchema["Score"].Annotations.GetValue("SlotNames", ref labelBuffer);
//var labels = labelBuffer.DenseValues().Select(l => l.ToString()).ToArray();
string[] str = new string[5];
for (int i = 0; i < 5; i++)
{
string rate = "<1%";
double value = Math.Round(Convert.ToDouble(top10Scores.ElementAt(i).Value) * 100, 1);
if (value >= 1)
{
rate = value + "%";
}
str[i] = top10Scores.ElementAt(i).Key + " : " + rate;
//str[i]= top10Scores.ElementAt(i).Key+ " : " +top10Scores.ElementAt(i).Value;
}
return str;
}
}