本地预配向导和预配代理。
下载并安装 Visual Studio 2022。
在安装过程中,应选择 .NET 桌面开发工作负载以及可选的 ML.NET Model Builder 组件。使用上面的链接时应预先正确选择所有先决条件,如下图所示:
创建应用
打开 Visual Studio 并新建 .NET 控制台应用:
- 从 Visual Studio 2022 开始窗口中选择 新建项目。
- 选择 C# 控制台应用 项目模板。
- 将项目名称更改为
myMLApp
。 - 确保不选中将解决方案和项目置于同一目录中。
- 选择“下一步”按钮。
- 选择 .NET 7.0 (标准期限支持) 作为 Framework。
- 选择“创建”按钮。Visual Studio 将创建项目并加载
Program.cs
文件。
添加机器学习
- 右击 解决方案资源管理器 中的
myMLApp
项目,并选择 添加 > 机器学习模型。
2.在“添加新项目”对话框中,确保选中“机器学习模型(ML.NET)”。
3.将“名称”字段更改为 SentimentModel.mbconfig
,然后选择“添加”按钮。
一个名为 SentimentModel.mbconfig
的新文件将添加到你的解决方案中,并且 Model Builder UI 将在 Visual Studio 的新停靠工具窗口中打开。mbconfig 文件只是一个 JSON 文件,用于跟踪 UI 的状态。
Model Builder 将通过以下步骤指导你完成构建机器学习模型的过程
选取方案
若要生成模型,首先需要选择机器学习场景。Model Builder 支持多种场景:
注意: 如果本教程屏幕截图与你看到的内容不匹配,则可能需要更新 Model Builder 版本。请转到 扩展 > 管理扩展,以确保没有可用于 Model Builder 的更新。本教程中使用的版本为 16.14.0。
在这种情况下,将根据客户评价的内容(文字)预测情绪。
- 在“Model Builder 方案”屏幕中,选择数据分类 方案,因为要预测注释属于哪个类别(正或负)。
- 在选择 数据分类方案后,必须选择训练环境。虽然一些方案支持在 Azure 中进行训练,但“分类”目前仅支持本地训练,因此,请保持选择 本地 环境,并继续执行 数据 步骤。
- 以上为官网文档,本文将使用预测文本类别
格式化的文本内容
文本内容中"|"为分隔符,数字5为文本类别,当然也可以是文字类别
【医疗保险】再次提醒: 杭州尾号0038用户,您的重疾保障已到达!不验证作废,戳 1tq.cn/Iub?3663cM 敬请谅解退回T|5
加载文本文件
需要选择预测列,预测列及类别列
训练
选择根据文本数据多少选择时长,ML.NET Model Builder解决方案会为数据分类提供最优算法及最佳模型
训练完成
评估
点击预测
使用
代码片段,这就是预测使用的代码
//Load sample data
var sampleData = new MlApp.ModelInput()
{
Col0 = @"【医疗保险】再次提醒: 杭州尾号0038用户,您的重疾保障已到达!不验证作废,戳 1tq.cn/Iub?3663cM 敬请谅解退回T",
};
//Load model and predict output
var result = MlApp.Predict(sampleData);
点击添加控制台解决方案
其中1是生成的控制台解决方案,2是ML.NET Model Builder解决方案,二者训练和预测代码完全一样
如上图俩个部分类,mlApp.training.cs 在训练时使用,mlApp.consumption在预测时使用,其中在项目中使用代码训练时,需注意ModelInput类的注解需要LoadColumn
using Microsoft.ML;
using MlApp_ConsoleApp1;
using static MlApp_ConsoleApp1.MlApp;
#region MyRegion
//预测部分
// Create single instance of sample data from first line of dataset for model input
//MlApp.ModelInput sampleData = new MlApp.ModelInput()
//{
// Col0 = @"【医疗保险】再次提醒: 杭州尾号0038用户,您的重疾保障已到达!不验证作废,戳 1tq.cn/Iub?3663cM 敬请谅解退回T",
//};
//// Make a single prediction on the sample data and print results
//var predictionResult = MlApp.Predict(sampleData);
//Console.WriteLine("Using model to make single prediction -- Comparing actual Col1 with predicted Col1 from sample data...\n\n");
//Console.WriteLine($"Col0: {@"【医疗保险】再次提醒: 杭州尾号0038用户,您的重疾保障已到达!不验证作废,戳 1tq.cn/Iub?3663cM 敬请谅解退回T"}");
//Console.WriteLine($"Col1: {5F}");
//Console.WriteLine($"\n\nPredicted Col1: {predictionResult.PredictedLabel}\n\n");
//Console.WriteLine("=============== End of process, hit any key to finish ===============");
//Console.ReadKey();
#endregion
//训练部分
MLContext mlContext = new MLContext();
string _dataPath = Path.Combine(Environment.CurrentDirectory, "原始文本confirm.txt");
IDataView dataView = mlContext.Data.LoadFromTextFile<ModelInput>(path: _dataPath, separatorChar: '|');
//俩种加载数据方式
//var data = new ModelInput[] {
//new ModelInput{ Col0="【医疗保险】再次提醒: 潍坊尾号9043用户,您的重疾保障已到达!不验证作废,戳 1tq.cn/kA?4do04m 敬请谅解退回T",Col1=5},
//new ModelInput{ Col0="【建设银行】尊敬的纳税人您好,根据税务评级,我行已为您的企业预授信最高1000万元备用金,随借随还,办理回1,急用回2,退订回T",Col1=1},
//new ModelInput{ Col0="【农业银行】尊敬的客户,您可在我行申请1892000元储备金,授额5年随借随还,如有需要请及时回复,回1查利率,回2办理,退订回T",Col1=1},
//new ModelInput{ Col0="【行者节】免费发放抗原试剂5000份,每人限领取2支。点击链接,上行者节公益平台即刻领取: https://zyouxin.net/Fh5D 守望相助,共克时艰!",Col1=9},
//};
//IDataView newData = mlContext2.Data.LoadFromEnumerable(data);
ITransformer model = RetrainPipeline(mlContext, dataView);
mlContext.Model.Save(model, dataView.Schema, "model.zip");
mlApp.training.cs
// This file was auto-generated by ML.NET Model Builder.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ML.Data;
using Microsoft.ML.Trainers;
using Microsoft.ML;
namespace MlApp_ConsoleApp1
{
public partial class MlApp
{
/// <summary>
/// Retrains model using the pipeline generated as part of the training process. For more information on how to load data, see aka.ms/loaddata.
/// </summary>
/// <param name="mlContext"></param>
/// <param name="trainData"></param>
/// <returns></returns>
public static ITransformer RetrainPipeline(MLContext mlContext, IDataView trainData)
{
var pipeline = BuildPipeline(mlContext);
var model = pipeline.Fit(trainData);
return model;
}
/// <summary>
/// build the pipeline that is used from model builder. Use this function to retrain model.
/// </summary>
/// <param name="mlContext"></param>
/// <returns></returns>
public static IEstimator<ITransformer> BuildPipeline(MLContext mlContext)
{
// Data process configuration with pipeline data transformations
var pipeline = mlContext.Transforms.Text.FeaturizeText(inputColumnName:@"col0",outputColumnName:@"col0")
.Append(mlContext.Transforms.Concatenate(@"Features", new []{@"col0"}))
.Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName:@"col1",inputColumnName:@"col1"))
.Append(mlContext.Transforms.NormalizeMinMax(@"Features", @"Features"))
.Append(mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(new LbfgsMaximumEntropyMulticlassTrainer.Options(){L1Regularization=1F,L2Regularization=1F,LabelColumnName=@"col1",FeatureColumnName=@"Features"}))
.Append(mlContext.Transforms.Conversion.MapKeyToValue(outputColumnName:@"PredictedLabel",inputColumnName:@"PredictedLabel"));
return pipeline;
}
}
}
mlApp.consumption.cs
// This file was auto-generated by ML.NET Model Builder.
using Microsoft.ML;
using Microsoft.ML.Data;
using System;
using System.Linq;
using System.IO;
using System.Collections.Generic;
namespace MlApp_ConsoleApp1
{
public partial class MlApp
{
/// <summary>
/// model input class for MlApp.
/// </summary>
#region model input class
public class ModelInput
{
[LoadColumn(0), ColumnName(@"col0")]
public string Col0 { get; set; }
[LoadColumn(1), ColumnName(@"col1")]
public float Col1 { get; set; }
}
#endregion
/// <summary>
/// model output class for MlApp.
/// </summary>
#region model output class
public class ModelOutput
{
[ColumnName(@"col0")]
public float[] Col0 { get; set; }
[ColumnName(@"col1")]
public uint Col1 { get; set; }
[ColumnName(@"Features")]
public float[] Features { get; set; }
[ColumnName(@"PredictedLabel")]
public float PredictedLabel { get; set; }
[ColumnName(@"Score")]
public float[] Score { get; set; }
}
#endregion
private static string MLNetModelPath = Path.GetFullPath("mlApp.zip");
public static readonly Lazy<PredictionEngine<ModelInput, ModelOutput>> PredictEngine = new Lazy<PredictionEngine<ModelInput, ModelOutput>>(() => CreatePredictEngine(), true);
/// <summary>
/// Use this method to predict on <see cref="ModelInput"/>.
/// </summary>
/// <param name="input">model input.</param>
/// <returns><seealso cref=" ModelOutput"/></returns>
public static ModelOutput Predict(ModelInput input)
{
var predEngine = PredictEngine.Value;
return predEngine.Predict(input);
}
private static PredictionEngine<ModelInput, ModelOutput> CreatePredictEngine()
{
var mlContext = new MLContext();
ITransformer mlModel = mlContext.Model.Load(MLNetModelPath, out var _);
return mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(mlModel);
}
}
}
标签:Model,mlContext,MlApp,ML,public,using,NET,文本,model
From: https://blog.51cto.com/u_1099805/6423918