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

第一步:问题分析

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

第二步:环境准备

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

第三步:准备数据

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

Sentiment SentimentText

   第一天上班 无事

  完成了领导的安排任务   

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

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

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

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

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

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

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

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

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

第四步:定义特征类

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

/// <summary>

    /// 输入数据集类

    /// </summary>

    public class SentimentData

    {

        /// <summary>

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

        /// </summary>

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

        public float Sentiment;

        /// <summary>

        /// 日报内容

        /// </summary>

        [Column(ordinal: "")]

        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

然后定义程序的入口(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: , numTrees: , minDatapointsInLeaves: ));

            //得到模型

            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 item in 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: );

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

         _textLoader = mlContext.Data.CreateTextLoader(

        columns: new TextLoader.Column[]

        {

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

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

        },

         separatorChar: '\t',

         hasHeader: true

            );

 //定型模型

          var model = Train(mlContext, _trainDataPath);

//评测模型

          Evaluate(mlContext, model);

//单个数据预测

          Predict(mlContext, model);

           //批处理预测数据

          PredictWithModelLoadedFromFile(mlContext);

        }

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

运行产生结果为:

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

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

C#机器学习之判断日报是否合格的更多相关文章

  1. 吴裕雄 python 机器学习——线性判断分析LinearDiscriminantAnalysis

    import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...

  2. java判断姓是否合格 千家姓

    package com.sycx.domain; import java.lang.reflect.Array; public class FirstName { public static bool ...

  3. java判断姓是否合格 百家姓

    package util; import java.lang.reflect.Array; public class FirstName { public static boolean ClearNa ...

  4. Andrew Ng机器学习 二: Logistic Regression

    一:逻辑回归(Logistic Regression) 背景:假设你是一所大学招生办的领导,你依据学生的成绩,给与他入学的资格.现在有这样一组以前的数据集ex2data1.txt,第一列表示第一次测验 ...

  5. 如何准备算法工程师面试,斩获一线互联网公司机器学习岗offer?

    原文:https://zhuanlan.zhihu.com/p/76827460?utm_source=wechat_session&utm_medium=social&utm_oi= ...

  6. py004.python的逻辑运算,随机数及判断语句if,elif,else

    判断语句又称 "分支语句" if判断语句的格式: if 条件1: 条件1满足时,执行的代码 -- # 前面有缩进4个空格 elif 条件2: 条件2满足时,执行的代码 -- # 前 ...

  7. [2] TensorFlow 向前传播算法(forward-propagation)与反向传播算法(back-propagation)

    TensorFlow Playground http://playground.tensorflow.org 帮助更好的理解,游乐场Playground可以实现可视化训练过程的工具 TensorFlo ...

  8. 深入浅出TensorFlow(二):TensorFlow解决MNIST问题入门

    2017年2月16日,Google正式对外发布Google TensorFlow 1.0版本,并保证本次的发布版本API接口完全满足生产环境稳定性要求.这是TensorFlow的一个重要里程碑,标志着 ...

  9. tensorflow学习笔记——常见概念的整理

    TensorFlow的名字中已经说明了它最重要的两个概念——Tensor和Flow.Tensor就是张量,张量这个概念在数学或者物理学中可以有不同的解释,但是这里我们不强调它本身的含义.在Tensor ...

随机推荐

  1. 算法训练 2的次幂表示(蓝桥杯C++写法)

    问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=2^7+2^3+2^0 ...

  2. Windows10 ubuntu子系统的启用即基础配置

    Windows 10 在一周年更新后,本身集成一个不带有图形界面的ubuntu 14.04系统了,大大方便了Linux开发,并且本身使用很方便,像我这种Windows死忠,只会在Linux下跑一下一定 ...

  3. ubantu和虚拟机tools 安装 小问题集结

    一.虚拟机 就安装虚拟机而言,个人觉得还是比较简易的,毕竟VMware workstation pro 是一个开源的软件,只要在网上搜索即可,这里我提供一个虚拟机的资源: 链接:http://pan. ...

  4. HBuilder 打包流程

    1.运行HBuilder---百度搜索HBuilder,官网下载安装包,解压,运行HBuilder.exe.注册账号,并登陆 2.新建app---在左边右键,选择新建APP,或者,点击中间的新建app ...

  5. es6属性基础教学,30分钟包会

    ES6基础智商划重点在实际开发中,ES6已经非常普及了.掌握ES6的知识变成了一种必须.尽管我们在使用时仍然需要经过babel编译.ES6彻底改变了前端的编码风格,可以说对于前端的影响非常巨大.值得高 ...

  6. iframe跨域动态设置主窗口宽高

    Q:在A项目的a页面嵌入一个iframe,src是B项目的b页面,怎样让a页面的高度跟b页面的高度一样? A:解决跨域方案:增加一个A项目的c页面. 操作步骤: 一,a页面的iframe设置: 获取到 ...

  7. 在VirtualBox中安装BlackArch Linux

    作者:荒原之梦 安装前的准备 下载系统映像:BlackArch Linux官网下载页面 在本文中我使用的是BlackArch Linux的Live ISO,这样可以减少安装时下载系统的时间.Black ...

  8. 解决WordPress无法上传媒体文件以及无法下载和安装主题与插件的问题

    前言: 我的个人博客网站荒原之梦在安装成功WordPress之后本来是可以上传媒体文件,安装主题和插件的,但是后来不知道怎么回事就出了问题:不能上传媒体文件也不能安装主题和插件了.出现这个问题后我尝试 ...

  9. jQuery.on() 函数详解 【转载】

    注意事项 1:on()为指定元素的一个或多个事件绑定事件处理函数.(可传递参数) 2:从jQuery 1.7开始,on()函数提供了绑定事件处理程序所需的所有功能,用于统一取代以前的bind(). d ...

  10. JAVA API操作hbase1.4.2

    package com.quyf; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; imp ...