首页 > 其他分享 >ML.NET 之文本多分类

ML.NET 之文本多分类

时间:2023-06-06 12:32:28浏览次数:49  
标签:Model mlContext MlApp ML public using NET 文本 model

本地预配向导和预配代理。

下载并安装 Visual Studio 2022。

下载 Visual Studio 2022

在安装过程中,应选择 .NET 桌面开发工作负载以及可选的 ML.NET Model Builder 组件。使用上面的链接时应预先正确选择所有先决条件,如下图所示:

ML.NET 之文本多分类_解决方案

创建应用

打开 Visual Studio 并新建 .NET 控制台应用:

  1. 从 Visual Studio 2022 开始窗口中选择 新建项目
  2. 选择 C# 控制台应用 项目模板。
  3. 将项目名称更改为 myMLApp
  4. 确保不选中将解决方案和项目置于同一目录中
  5. 选择“下一步”按钮。
  6. 选择 .NET 7.0 (标准期限支持) 作为 Framework。
  7. 选择“创建”按钮。Visual Studio 将创建项目并加载 Program.cs 文件。

添加机器学习

  1. 右击 解决方案资源管理器 中的 myMLApp 项目,并选择 添加 > 机器学习模型

ML.NET 之文本多分类_System_02

2.在“添加新项目”对话框中,确保选中“机器学习模型(ML.NET)”。

3.将“名称”字段更改为 SentimentModel.mbconfig,然后选择“添加”按钮。

ML.NET 之文本多分类_System_03

一个名为 SentimentModel.mbconfig 的新文件将添加到你的解决方案中,并且 Model Builder UI 将在 Visual Studio 的新停靠工具窗口中打开。mbconfig 文件只是一个 JSON 文件,用于跟踪 UI 的状态。

Model Builder 将通过以下步骤指导你完成构建机器学习模型的过程

选取方案

若要生成模型,首先需要选择机器学习场景。Model Builder 支持多种场景:

ML.NET 之文本多分类_解决方案_04

注意: 如果本教程屏幕截图与你看到的内容不匹配,则可能需要更新 Model Builder 版本。请转到 扩展 > 管理扩展,以确保没有可用于 Model Builder 的更新。本教程中使用的版本为 16.14.0。

在这种情况下,将根据客户评价的内容(文字)预测情绪。

  1. 在“Model Builder 方案”屏幕中,选择数据分类 方案,因为要预测注释属于哪个类别(正或负)。
  2. 在选择 数据分类方案后,必须选择训练环境。虽然一些方案支持在 Azure 中进行训练,但“分类”目前仅支持本地训练,因此,请保持选择 本地 环境,并继续执行 数据 步骤。
  3. 以上为官网文档,本文将使用预测文本类别

格式化的文本内容

文本内容中"|"为分隔符,数字5为文本类别,当然也可以是文字类别

【医疗保险】再次提醒: 杭州尾号0038用户,您的重疾保障已到达!不验证作废,戳 1tq.cn/Iub?3663cM 敬请谅解退回T|5

加载文本文件

ML.NET 之文本多分类_解决方案_05

需要选择预测列,预测列及类别列

训练

ML.NET 之文本多分类_ML_06

选择根据文本数据多少选择时长,ML.NET Model Builder解决方案会为数据分类提供最优算法及最佳模型

训练完成

ML.NET 之文本多分类_ML_07

评估

ML.NET 之文本多分类_解决方案_08

点击预测

ML.NET 之文本多分类_解决方案_09

使用

ML.NET 之文本多分类_ML_10

代码片段,这就是预测使用的代码

//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);

点击添加控制台解决方案

ML.NET 之文本多分类_ML_11

其中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

相关文章

  • 常用HTML代码解释
    常用HTML代码解释一、文字1.标题文字<h#>..........</h#>#=1~6;h1为最大字,h6为最小字2.字体变化<font>..........</font>【1】字体大小<fontsize=#>..........</font>#=1~7;数字愈大字也愈大【2】指定字型<fontface="字体名称">..........</font>【3】文字颜色<fo......
  • “AI Earth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学
    1.“AIEarth”人工智能创新挑战赛:助力精准气象和海洋预测Baseline[1]、NetCDF4使用教学、Xarray使用教学,针对气象领域.nc文件读取处理比赛官网:https://tianchi.aliyun.com/specials/promotion/aiearth2021?spm=a2c22.12281976.0.0.4d0d19efK2FngK1.1背景描述聚焦全球大气海......
  • Asp.Net Core 程序部署到Linux(centos)生产环境(二):docker部署
    运行环境照例,先亮环境;软件的话我这里假设你已经批准好了.netcore运行环境,未配置可以看我的这篇[linux(centos)搭建.netcore运行环境]腾讯云centos:7.2cpu:1核2G内存1M带宽docker:18.06.1-ce安装docker安装其实很简单,就不重复说了,请查看纯洁大神这篇文章准备你的.netcoreweb程......
  • uniGUI学习之UniHTMLMemo1(62)
    https://blog.csdn.net/dlboy2018/article/details/82903680UniHTMLMemo1.Lines.Add("<p>"+UniHTMLMemo3.Text);//发UniHTMLMemo1.Lines.Clear();//清空输入框在这里你会发现我在发送文字处增加了“<p>”,那是因为如果不增加这个,接收窗口显示时会把多次信息链接到一起,没有换......
  • C#操作XML之保存参数
    usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;usingSystem.Xml;usingSystem.Xml.Serialization;namespaceXMLtest{publicclassParamH......
  • NET Core CLI命令小结
    dotnetrundotnetrun--urls=http://*:8080//urls指定ip和端口dotnetwatchrun//watch监听程序修改,一旦修改则重新启动dotnetwatchrun--urls=http://*:8080dotnetrun-pNETCoreCLI.csproj//一个“-”是简称的pdotnetrun--projectNETCoreCLI.csproj//两个“-”是全......
  • k8s中设置hostNetwork: true,怎么修改冲突的端口,yaml使用的是DaemonSet
    apiVersion:apps/v1kind:DaemonSetmetadata:name:cadvisornamespace:monitoringspec:selector:matchLabels:app:cAdvisortemplate:metadata:labels:app:cAdvisorspec:tolerations:#污点容忍,忽略master的......
  • 记一次线上问题,Netty接收到的报文一次有数据一次没有数据
    最近线上遇到一个问题,客户端发送的tcp报文第一次连接成功后没有数据,第二次连接后正常带数据,第三次又没有数据...问题排查1:是否有负载均衡,其中有一台机器出现了异常,会出现一次成功一次失败的情况经过排查,本服务是没有负载均衡的,排除问题排查2:抓包分析 根据抓包数据,异常情况时......
  • OCR -- 文本识别 -- 实践篇
    OCR--文本识别--理论篇本章将详细介绍如何基于PaddleOCR完成CRNN文本识别模型的搭建、训练、评估和预测。数据集采用icdar2015,其中训练集有4468张,测试集有2077张。CRNN是基于CTC的算法,CRNN是较早被提出也是目前工业界应用较多的方法。主要用于识别规则文本,有效快的预测速......
  • 浏览器环境下JS构建xml文本
    虽然许多地方json替代了xml,但是仍然有部分领域使用xml来描述数据。可以使用浏览器环境下js中dom的API,来快速构建xml文本,避免手动拼接字符串。//创建XML文档对象letxmlDoc=document.implementation.createDocument("","",null);//创建根节点letroot=......