C#机器学习之判断日报是否合格

原文作者:心莱科技肖鑫


简单来说机器学习的核心步骤在于“获取学习数据;选择机器算法;定型模型;评估模型,预测模型结果”,下面本人就以判断日报内容是否合格为例为大家简单的阐述一下C#的机器学习。

第一步:问题分析

根据需求可以得出我们的模型是以日报的内容做为学习的特征确定的,然后通过模型判断将该目标对象预测为是否符合标准(合格与不合格),简单来说就是一种分类场景(此场景结果属于二元分类,不是A就是B),那么也就确定了核心算法为分类算法当然还有其它的分类算法有兴趣的可以自己去了解一下在这里就不多做说明了。

第二步:环境准备

其他的代码编译运行的环境并没有太多要求,你只需要引用C#机器学习的NuGet 包,名为Microsoft.ML具体的安装步骤在此就不做详细介绍了。

第三步:准备数据

这里会准备两个数据集 一个定型模型的数据集(可以称之为学习资料)wikipedia-detox-250-line-data.tsv数据实例部分展示如下(你的数据按照这种排列格式即可该该格式的定义取决于你的输入数据集类的结构在下面会讲到):

SentimentSentimentText

1  第一天上班 无事

1 完成了领导的安排任务   

1 编写了一些代码然后写了一些杂七杂八的文档    

1  和一般的码农做了一样的事情

1 和产品经理一起做了一些项目上的事情  

1 早上来的时候就开始讨论需求,然后开始写代码,快下班的时候完成了整个过程的文档分享

0 ***项目的整体编排会议,设计图的首页以及我的个人中心制作   

0 **项目需求的对接,需求的梳理,实体结构的定义,数据库的迁移,脑图的完善

0   1、**项目的模板消息代码编写,2、**项目管理后台的模板发送完善,


定型模型数据集准备好之后还有一个评估模型的测试数据集(可以称之为标准答案)wikipedia-detox-250-line-test.tsv格式与上面展示的评估数据集一样

定型数据的数据越丰富算法的回归曲线方程就会越接近理想的模型方程,你的模型预测结果就会越符合你的要求。

第四步:定义特征类

根据分享的模型确定其分析的特征项并定义为相关的类并且需要引用机器学习的包using Microsoft.ML.Data;,由此模型定义的数据集类如下(结果可看注释):


 /// <summary>

    /// 输入数据集类

    /// </summary>

    public class SentimentData

    {

        /// <summary>

        /// 日志是否合格的值(0:为合格,1:不合格)

        /// </summary>

        [Column(ordinal:"0", name:"Label")]

        public float Sentiment;

 

        /// <summary>

        /// 日报内容

        /// </summary>

        [Column(ordinal:"1")]

        public string SentimentText;

    }

 

    /// <summary>

    /// 预测结果集类

    /// </summary>

    public class SentimentPrediction

    {

        /// <summary>

        /// 预测值(是否合格)

        /// </summary>

        [ColumnName("PredictedLabel")]

        public bool Prediction {get;set; }

 

        /// <summary>

        /// 或然率(结果分布概率)

        /// </summary>

        [ColumnName("Probability")]

        public float Probability {get;set; }

 

    }

第一个SentimentData类为输入数据集类,指的就是根据定型的数据集的特征项定义的集类,第二个SentimentPrediction类为预测结果集类,也就是你所需要的结果的类定义 该类的结构一般受你所使用的学习算法影响,根据你的学习管道输出的结果以及个人需求的综合考虑来定义。输入集类带的Column属性标注其在数据集的格式位置的编排以及何为Label值。预测集的PredictedLabel在预测和评估过程中使用。

第五步:代码实现

首先定义以指定这些路径和 _textLoader 变量,用来读取数据或者是保存实验数据,具体如下所示:

_trainDataPath 具有用于定型模型的数据集路径。

_testDataPath 具有用于评估模型的数据集路径。

_modelPath 具有在其中保存定型模型的路径。

_textLoader 是用于加载和转换数据集的 TextLoader

 

640?wx_fmt=png

 

然后定义程序的入口(main函数)以及相应的处理方法:

定义SaveModelAsFile方法将模型保存为 .zip 文件代码如下所示:

 

        private static void SaveModelAsFile(MLContext mlContext, ITransformer model)

        {

            using (var fs =new FileStream(_modelPath, FileMode.Create, FileAccess.Write, FileShare.Write))

                mlContext.Model.Save(model, fs);

 

            Console.WriteLine("模型保存路径为{0}", _modelPath);

            Console.ReadLine();

        }

定义Train方法选择学习方法并且创建相应的学习管道,输出定型后的模型model代码如下所示:

 public static ITransformer Train(MLContext mlContext,string dataPath)

        {

            IDataView dataView = _textLoader.Read(dataPath);

 

            //数据特征化(按照管道所需的格式转换数据)

            var pipeline = mlContext.Transforms.Text.FeaturizeText(inputColumnName:"SentimentText", outputColumnName:"Features")

            //根据学习算法添加学习管道

                .Append(mlContext.BinaryClassification.Trainers.FastTree(numLeaves: 50, numTrees: 50, minDatapointsInLeaves: 20));

            //得到模型

            var model = pipeline.Fit(dataView);

            Console.WriteLine();

           //返回定型模型

            return model;

        }

模型定型之后,我们需要创建一个方法(Evaluate)来评测该模型的质量,根据你自己的标准测试数据集与该模型的符合程度来判断,并且输出相应的指标,该指标参数根据你所调用的评估方法返回具体的根据你的算法方程返回相应的方程的参数 。代码如下所示:

 public static void Evaluate(MLContext mlContext, ITransformer model)

        {

            var dataView = _textLoader.Read(_testDataPath);

            Console.WriteLine("===============用测试数据评估模型的准确性===============");

            var predictions = model.Transform(dataView);

          //评测定型模型的质量

            var metrics = mlContext.BinaryClassification.Evaluate(predictions,"Label");

            Console.WriteLine();

            Console.WriteLine("模型质量量度评估");

            Console.WriteLine("--------------------------------");

            Console.WriteLine($"精度:{metrics.Accuracy:P2}");

            Console.WriteLine($"Auc:{metrics.Auc:P2}");

            Console.WriteLine("=============== 模型结束评价 ===============");

            Console.ReadLine();

//评测完成之后开始保存定型的模型

            SaveModelAsFile(mlContext, model);

        }

定义单个数据的预测方法(Predict)与批处理预测的方法(PredictWithModelLoadedFromFile):

单个数据集的预测代码如下所示:

 private static void Predict(MLContext mlContext, ITransformer model)

        {

 //创建包装器

            var predictionFunction = model.CreatePredictionEngine<SentimentData, SentimentPrediction>(mlContext);

 

            SentimentData sampleStatement =new SentimentData

            {

                SentimentText ="爱车新需求开发;麦扣日志监控部分页面数据绑定;"

            };

//预测结果

            var resultprediction = predictionFunction.Predict(sampleStatement);

 

            Console.WriteLine();

            Console.WriteLine("===============单个测试数据预测 ===============");

 

            Console.WriteLine();

            Console.WriteLine($"日报内容:{sampleStatement.SentimentText} | 是否合格:{(Convert.ToBoolean(resultprediction.Prediction) ?"合格" :"不合格")} | 符合率:{resultprediction.Probability} ");

            Console.WriteLine("=============== 预测结束 ===============");

            Console.WriteLine();

            Console.ReadLine();

        }

批处理数据集预测方法代码如下所示

 public static void PredictWithModelLoadedFromFile(MLContext mlContext)

        {

            IEnumerable<SentimentData> sentiments =new[]

                     {

                           new SentimentData

                      {

                     SentimentText ="1、完成爱车年卡代码编写 2、与客户完成需求对接"

                      },

                            new SentimentData

                      {

                         SentimentText ="没有工作内容"

                      }

                     };

 

            ITransformer loadedModel;

using (var stream =new FileStream(_modelPath, FileMode.Open, FileAccess.Read, FileShare.Read))

            {

                loadedModel = mlContext.Model.Load(stream);

            }

            //创建预测(也称之为创建预测房屋)            

var sentimentStreamingDataView = mlContext.Data.ReadFromEnumerable(sentiments);

            var predictions = loadedModel.Transform(sentimentStreamingDataView);

            //使用模型预测结果值为1(不合格)还是0  (合格)  

       var predictedResults = mlContext.CreateEnumerable<SentimentPrediction>(predictions, reuseRowObject:false);

            Console.WriteLine();

 

            Console.WriteLine("=============== 多样本加载模型的预测试验 ===============");

 

            var sentimentsAndPredictions = sentiments.Zip(predictedResults, (sentiment, prediction) => (sentiment, prediction));

 

            foreach (var itemin sentimentsAndPredictions)

            {

                Console.WriteLine($"日报内容:{item.sentiment.SentimentText} | 是否合格:{(Convert.ToBoolean(item.prediction.Prediction) ?"合格" :"不合格")} | 符合率:{item.prediction.Probability} ");

            }

            Console.WriteLine("=============== 预测结束 ===============");

            Console.ReadLine();

        }

在以上的方法定义完成之后开始进行方法的调用:

public  static void Main(string[] args)

        {

//创建一个MLContext,为ML作业提供一个上下文

            MLContext mlContext =new MLContext(seed: 0);

//初始化_textLoader以将其重复应用于所需要的数据集

         _textLoader = mlContext.Data.CreateTextLoader(

        columns:new TextLoader.Column[]

        {

        new TextLoader.Column("Label", DataKind.Bool,0),

        new TextLoader.Column("SentimentText", DataKind.Text,1)

        },

         separatorChar:'\t',

         hasHeader:true

            );

 //定型模型

          var model = Train(mlContext, _trainDataPath);

//评测模型

          Evaluate(mlContext, model);

//单个数据预测

          Predict(mlContext, model);

           //批处理预测数据

          PredictWithModelLoadedFromFile(mlContext);

 

        }

准备代码之后,你的小小的机器人就要开始学习啦,好吧开始编译运行吧。。。。。。

运行产生结果为: 

640?wx_fmt=png

由于训练的数据集特征化参数的准确性以及数据的涵盖广度不够导致定义的模型质量非常的不理想因此我们可以看到我们的预测结果也是不够符合我们的理想状态,可见我们小机器的学习之路是非常漫长的过程啊。

由此次的机器学习的小小实践本人也深有体会,机器就像一个小孩一样首先你得根据他的性格(特征化参数)确定应该给予他什么样的学习环境(学习算法创建的学习管道)并提供学习资料(定型机器学习模型数据集),然后为其确定一个发展目标(评估模型数据集),并且不断的进行考试(单个数据的预测与批量数据的预测),考试需要特定的考试场地(预测所需要调用的方法)。通过该种方式让机器不断的学习不断的精进。

原文地址:https://www.cnblogs.com/codelove/p/10493970.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SignalR2结合ujtopo实现拓扑图动态变化

上一篇文章基于jTopo的拓扑图设计工具库ujtopo&#xff0c;介绍了拓扑设计工具&#xff0c;这一篇我们使用SignalR2结合ujtopo实现拓扑图的动态变化。仅仅作为演示&#xff0c;之前的文章SignalR2简易数据看板演示&#xff0c;用一个小的示例演示了SignalR作为数据看板的用法&a…

Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)

来源&#xff1a;https://www.cnblogs.com/7tiny/p/10493805.html【前言】Ocelot是一个用.NET Core实现并且开源的API网关&#xff0c;它功能强大&#xff0c;包括了&#xff1a;路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Butterf…

博弈论(基础概念+例题)

博弈论(b站视频) 文章目录一些概念以Nim游戏为例Nim游戏介绍定义 必败/必胜局面必败/必胜局面的判定引理Nim游戏判定引理的等价命题有向图游戏对判定引理的数学描述-Sg函数有向图游戏的和题目&#xff1a;[有向图游戏][有向图游戏的和][构造/转化类]一些概念 以Nim游戏为例 Ni…

.NET Core 3.0 linux 部署小贴士

dotnet core 3.0 目前还是测试版&#xff0c;在linux下安装 sdk 需要有一些注意事项1.下载urlhttps://dotnet.microsoft.com/download/thank-you/dotnet-sdk-3.0.100-preview-009812-linux-x64-binaries2.安装指令mkdir -p $HOME/dotnet && tar zxf dotnet-sdk-3.0.100…

PuppeteerSharp: 更友好的 Headless Chrome C# API

前端就有了对 headless 浏览器的需求&#xff0c;最多的应用场景有两个UI 自动化测试&#xff1a;摆脱手工浏览点击页面确认功能模式爬虫&#xff1a;解决页面内容异步加载等问题也就有了很多杰出的实现&#xff0c;前端经常使用的莫过于 PhantomJS 和 selenium-webdriver&…

中国.NET:东莞+长沙.NET俱乐部现场花絮及合肥、苏州、上海等地活动预

《传承有序》与微软技术的发展历程相似&#xff0c;微软俱乐部的发展经历着沉沉浮浮&#xff0c;曾经随着微软走向封闭与固执&#xff0c;.NET社区年轻一代的声音被忽略&#xff0c;.NET社区后继无人。社区的沉默是可怕的&#xff0c;很多社区沉寂消亡。但是在2018年&#xff0…

【AcWing 235. 魔法珠

【AcWing 235. 魔法珠 题意&#xff1a; 有n堆魔法珠&#xff0c;第i堆有ai个&#xff0c;两个人轮流进行以下操作&#xff1a; 当轮到某人操作时&#xff0c;如果每堆中魔法珠的数量均为 1&#xff0c;那么他就输了。 问谁赢谁输 题解&#xff1a; 经典博弈论问题 注意本…

Abp vNext 切换MySql数据库

Abp vNext是Abp的下一代版本&#xff0c;目前还在经一步完善&#xff0c;代码已经全部重写了&#xff0c;好的东西保留了下来&#xff0c;去除了很多笨重的东西&#xff0c;从官宣来看&#xff0c;Abp vNext主要是为了以后微服务架构而诞生的。从源码来看&#xff0c;Abp vNext…

采用.NET CORE的全异步模式打造一款免费的内网穿透工具--NSmartProxy

什么是NSmartProxy&#xff1f;NSmartProxy是一款免费的内网穿透工具。特点跨平台&#xff0c;客户端和服务端均可运行在MacOS&#xff0c;Linux&#xff0c;Windows系统上&#xff1b;使用方便&#xff0c;配置简单&#xff1b;多端映射&#xff0c;一个NSmart Proxy客户端可以…

Acwing 236. 格鲁吉亚和鲍勃(博弈论妙题)

Acwing 236. 格鲁吉亚和鲍勃 题意&#xff1a; 一排网格&#xff0c;将网格从左到右依次编号 1,2,3&#xff0c;…&#xff0c;并将 N 个西洋棋棋子放在不同的网格上&#xff0c;如下图所示&#xff1a; 两个人轮流移动棋子 每次玩家选择一个棋子&#xff0c;并将其向左移动…

.NET Core 跨平台 串口通讯 ,Windows/Linux 串口通讯

1&#xff0c;前言开发环境&#xff1a;在 Visual Studio 2017&#xff0c;.NET Core 2.x串口通讯用于设备之间&#xff0c;传递数据&#xff0c;物联网设备中广泛使用串口方式连接通讯&#xff0c;物联网通讯协议 &#xff1a;Modbus 协议 ASCII、RTU、TCP模式是应用层的协议&…

Game of Cards Gym - 102822G

Game of Cards Gym - 102822G 题意&#xff1a; 小兔子和小马喜欢玩奇怪的纸牌游戏。现在&#xff0c;他们正在玩一种叫做0123游戏的纸牌游戏。桌子上有几张牌。其中c0标记为0&#xff0c;c1标记为1&#xff0c;c2标记为2&#xff0c;c3标记为3。小兔子和小马轮流玩游戏&…

开源组件ExcelReport 3.x.x 使用手册(为.netcore而来

ExcelReport转眼已经开源4年了&#xff0c;期间有很长时间也停止了对它的维护。18年年末有人联系到我&#xff0c;说“兄弟&#xff0c;ExcelReport不错&#xff0c;但什么时候支持.netcore呢&#xff1f;”。我寥寥的回了几句搪塞的话&#xff0c;也没当回事。后来这兄弟又来问…

《.NET Core 和前后端那些事儿》技术交流活动纪实

长沙.NET技术社区.NET Core和前后端那些事儿技术交流纪实2019年3月10日&#xff0c;下午&#xff0c;在位于沁园春御院的长沙市互联网活动基地&#xff0c;在长沙市.NET技术社区的组织下&#xff0c;长沙市.NET技术圈第一次纯粹的技术沙龙在这里召开。这次活动总共参加人数超过…

10个小技巧助您写出高性能的ASP.NET Core代码

今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能&#xff0c;本文的大部分内容来自翻译&#xff0c;当然中间穿插着自己的理解&#xff0c;希望对大家有所帮助&#xff01;话不多说开始今天的主题吧&#xff01;我们都知道性能是公共网站取得成功的关键因素…

CF 1529D Kavi on Pairing Duty

CF 1529D Kavi on Pairing Duty 题意&#xff1a; 有2 * n个点&#xff0c;现在要求两个点连成线段&#xff0c;每个连法都可以得到n个线段&#xff0c;合法的连接方式为&#xff1a;连接的n个线段&#xff0c;任意两个线段要么长度相等&#xff0c;要么有包含关系 n<1e6 …

东莞.NET技术线下沙龙活动资料分享

今天天气虽然很不好&#xff0c;但不减广大.NET开发者的热情&#xff0c;仍然到场率很高。因图片还在整理中&#xff0c;暂时只发出个简单的活动资料整理分享&#xff0c;后续摄影师图片修图好后&#xff0c;再一并给到场者发送图片&#xff0c;和对活动的现场报道作更详细的图…

对弈(nim-k游戏博弈)

problem AliceAliceAlice 和 BobBobBob 又在玩游戏。 AliceAliceAlice 和 BobBobBob 在一个 1n1\times n1n 的网格图上玩游戏&#xff0c;网格图的 nnn 个格子中&#xff0c;有 kkk 个格子内被各放了一个棋子&#xff0c;其中 kkk 是一个偶数。 从左到右&#xff0c;这 kkk 个…

.Netcore 2.0 Ocelot Api网关教程(6)- 配置管理

本文介绍Ocelot中的配置管理&#xff0c;配置管理允许在Api网关运行时动态通过Http Api查看/修改当前配置。由于该功能权限很高&#xff0c;所以需要授权才能进行相关操作。有两种方式来认证&#xff0c;外部Identity Server或内部Identity Server。1、外部Identity Server修改…

最短路径(虚树+期望)

problem 给定一棵 nnn 个结点的无根树&#xff0c;每条边的边权均为 111 。 树上标记有 mmm 个互不相同的关键点&#xff0c;小 A 会在这 mmm 个点中等概率随机地选择 kkk 个不同的点放上小饼干。 你想知道&#xff0c;经过有小饼干的 kkk 个点的最短路径长度的期望是多少。…