在上文中,我简单地介绍了机器学习以及ML.NET的相关知识,从本讲开始,我会基于一个简单的案例:学生成绩预测,来介绍使用ML.NET进行机器学习以及API部署的基本过程。

本案例的数据来源为加州大学尔湾分校的机器学习公开样本数据集,数据介绍页面和下载地址为:https://archive.ics.uci.edu/ml/datasets/Student+Performance。该数据集包含了来自两所学校的学生的问卷调查结果,以及每位学生的综合成绩。数据集为CSV格式,每个字段的含义在官网上都有详细介绍,因此,在这里就不再赘述了。

确定问题类型

我们的任务很简单,就是基于这套已有的学生问卷调查结果以及综合成绩,进行机器学习模型训练,然后,再根据一套给定的学生情况信息,来预测该名学生的综合成绩。不难发现,我们需要使用监督学习中的回归算法来进行模型训练,因为我们需要得到一个连续的预测值,而不是离散的二元或者多元值。在确定了我们的任务之后,就可以对得到的数据集进行一些预处理,以便机器学习的过程能够顺利进行。

数据预处理与数据分析

在得到训练数据集之后,通常不能直接拿来进行机器学习,需要对数据进行一些处理。数据预处理任务大致有:

  • 数据格式规整化:对每一列的数据进行类型和单位统一,比如,“浓度”字段有些行使用的是ug/mL,有些行使用的是g/L,需要对单位进行统一,并将“浓度”字段的值转换为数值类型,以便进行统计

  • 特殊值处理:有些样本数据的取值比较异常,超出正常范围很多,对于这样的数据,可以直接丢弃,也可以通过一些统计学算法对其进行修正

  • 空值、无效值处理:有些样本数据的取值为空(或者对于数值型的数据,取值为0,并且不合理),对于这样的数据,也需要进行修正或者舍弃

  • 数据一致性校验:对数据一致性进行校验

  • 识别特征属性与目标属性:分析训练数据中,哪些属性会对预测目标造成影响,哪些属性不会影响预测结果

例如,基于本案例中的学生问卷调查结果,我们可以看到,有些学生的综合成绩为0,在本案例中,我们可以选择舍弃这些数据:

再比如,通过下面的热图我们可以了解到,平时学习时间相对较长,外出时间较短,并且有意向继续深造的学生,综合成绩也会相对越好。因此,学习时间、外出时间以及是否有意向继续深造,都有可能是影响综合成绩的因素。在进行模型训练时,就有可能需要将这些因素考虑进去。

在实际应用中,数据对于机器学习而言尤为重要,数据清洗的任务相当繁重。据我所知,某国际知名制药公司正在将人工智能应用在新药研发中,但由于数据清洗任务巨大,根本没有足够的标准化、规整化数据来支持各种机器学习任务,因此,在新药研发领域,人工智能的应用进展缓慢。

回到我们的案例,在完成了数据清洗任务和特征属性、目标属性的识别之后,就可以使用ML.NET进行编程,实现学生学习成绩的预测。

注:本案例代码已开源。地址是:https://github.com/daxnet/mlnet-trainer。

通过上面的分析不难得出,我们的应用场景属于监督学习中的回归(Regression)预测,因此,我们可以选择使用ML.NET中所提供的回归算法,使用样本数据逐一完成模型训练,然后,使用测试数据对每个模型的预测结果进行评估,以选择合适的预测算法。为了对所有ML.NET默认支持的回归算法进行预测评估,在程序中使用如下数据结构来保存这些算法的实例,以便之后进行模型训练的时候,可以逐一对这些算法进行训练和评估:

var trainers = new List<ITrainerEstimator<ISingleFeaturePredictionTransformer<ModelParametersBase<float>>, ModelParametersBase<float>>>()

{

    mlContext.Regression.Trainers.FastTree(),

    mlContext.Regression.Trainers.FastForest(),

    mlContext.Regression.Trainers.FastTreeTweedie(),

    mlContext.Regression.Trainers.GeneralizedAdditiveModels(),

    mlContext.Regression.Trainers.OnlineGradientDescent(),

    mlContext.Regression.Trainers.PoissonRegression(),

    mlContext.Regression.Trainers.StochasticDualCoordinateAscent()

};

首先,我们将原始样本数据分成两份,一份用来训练,另一份用来测试,将两份数据读入ML.NET的DataView,使用训练数据集进行模型训练,并使用测试数据集对模型进行评估,代码如下:

public IEnumerable<KeyValuePair<string, RegressionMetrics>> TrainAndEvaluate(IDataView trainingDataView, IDataView testDataView)

{

    var metrics = new Dictionary<string, RegressionMetrics>();

    foreach(var trainer in this.trainers)

    {

        var pipeline = mlContext.Transforms.CopyColumns(inputColumnName: "G3", outputColumnName: "Label")

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("School"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Sex"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Age"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Famsize"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Guardian"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Traveltime"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Studytime"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Failures"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Paid"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Higher"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Famrel"))

            .Append(mlContext.Transforms.Categorical.OneHotEncoding("Absences"))

            .Append(mlContext.Transforms.Concatenate("Features",

                "School",

                "Sex",

                "Age",

                "Famsize",

                "Guardian",

                "Traveltime",

                "Studytime",

                "Failures",

                "Paid",

                "Higher",

                "Famrel",

                "Absences"))

            .AppendCacheCheckpoint(mlContext)

            .Append(trainer);

        var trainedModel = pipeline.Fit(trainingDataView);

        trainedModels.Add(trainer.GetType().Name, trainedModel);

        var predictionModel = trainedModel.Transform(testDataView);

        var regMetrics = mlContext.Regression.Evaluate(predictionModel);

        metrics.Add(trainer.GetType().Name, regMetrics);

    }

    return metrics;

}

上面代码中所出现的列名(比如School、Sex、Age等)均来自于学生问卷调查原始数据,此处并没有包含原始数据中的所有字段,因为仅有上述这些字段会对综合成绩产生影响,所以并不需要将所有字段列出。接下来,就是针对各个算法的评估结果,找出合适的算法,然后将模型保存下来以便后续使用:

var regressionMetrics = session.TrainAndEvaluate(trainingDataView, testingDataView);

foreach (var item in regressionMetrics)

{

    LearningSession.OutputRegressionMetrics(item.Key, item.Value);

}

var winnerAlgorithmName = regressionMetrics.OrderBy(x => x.Value.Rms).First().Key;

Console.WriteLine($"最优算法为:{winnerAlgorithmName}");

Console.WriteLine();

var winnerModel = session.GetTrainedModel(winnerAlgorithmName);

using (var fileStream = new FileStream(ModelFileName, FileMode.Create, FileAccess.Write))

{

    mlContext.Model.Save(winnerModel, fileStream);

}

此处,使用Root Mean Squared Error的评估值作为参考,得出Rms取值最小的回归算法作为最优算法。保存的模型为一个ZIP文件,在后续的API构建部分,会使用这个ZIP文件保存的训练模型,来构建RESTful API。上述代码就不详细分析了,Github上有完整的源代码。

本文简要介绍了基于学生成绩预测的机器学习案例,并介绍了数据分析与清洗工作的一些思路,之后,大致介绍了一下基于ML.NET进行模型训练、算法评估和模型保存的过程。在下文中,我会介绍如何基于产生的模型,构建RESTful API。

原文地址:https://sunnycoding.cn/2019/05/05/mlnet-containerize-and-azure-devops-practices-part2/

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

ML.NET机器学习、API容器化与Azure DevOps实践(二):案例相关推荐

  1. ML.NET机器学习、API容器化与Azure DevOps实践(一):简介

    打算使用几篇文章介绍一下.NET下的机器学习框架ML.NET的具体应用,包括一些常用的业务场景.算法的选择.模型的训练以及RESTful API的创建.机器学习服务容器化,以及基于Azure DevO ...

  2. ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

    通过上文所介绍的内容,我们已经完成了RESTful API的开发,现在,就可以使用Azure DevOps来进行持续集成(CI)和k8s持续部署(CD)了.本文我会对使用Azure DevOps进行C ...

  3. ML.NET机器学习、API容器化与Azure DevOps实践(三):RESTful API

    通过上文所述案例,我们已经选择了最优回归算法来预测学生的综合成绩,并且完成了基于训练数据集的预测模型训练.从实现上,训练好的模型被保存成一个ZIP文件,以便在其它项目中直接调用以完成机器学习的实践场景 ...

  4. 腾讯云EMR基于YARN针对云原生容器化的优化与实践

    导语 | 传统HADOOP生态系统使用YARN管理/调度计算资源,该系统⼀般具有明显的资源使⽤周期.实时计算集群资源消耗主要在⽩天,而数据报表型业务则安排在离线计算集群中.离在线业务分开部署的首要问题 ...

  5. 专访智链ChainNova CTO谢文杰:区块链容器化与水平扩展实践

    [编者按]每个人的成长曲线不同,有的人在研究生之时就已有相当知名的产品和框架,从而在接下来的工作中一路顺风顺水,有的人缺需要经历一个又一个的坑才能成长,不管是前者的聪明高效,还是后者的稳扎稳打,他们都 ...

  6. CSDN专访智链ChainNova CTO谢文杰:区块链容器化与水平扩展实践

    [小编写在前面] 2017年9月23日,由全球最大中文IT社区CSDN举办的SDCC 2017之区块链技术实战线上峰会强势来袭,智链ChainNova CTO 谢文杰受邀将带来题为<区块链容器化 ...

  7. 直播 | 平安证券Kubernetes容器集群的DevOps实践

    分享时间:5月28日 20:30 分享主题:平安证券Kubernetes容器集群的DevOps实践 分享人介绍: 陈刚,平安证券运维研发工程师,负责经纪业务IT应用的持续交付平台的设计和开发. 分享摘 ...

  8. 微软机器翻译api_微软优化了ML.Net机器学习API

    微软机器翻译api 微软已经发布了针对.Net开发人员的ML.Net机器学习框架的0.6版本 . 此更新添加了一个新的且更有用的模型构建API集,可以使用更多现有模型来提供预测,并且总体上具有更好的性 ...

  9. Apache Hadoop 基础设施容器化在 Uber 的实践

    大数据厂长备注:以下的我们均代表 Uber 的 Hadoop 运维团队. 介绍 随着 Uber 业务的增长,Uber 公司在 5 年内将 Apache Hadoop(本文简称为"Hadoop ...

最新文章

  1. window 2008 32位系统安装oracle 10g数据库,Oracle 10g for Windows 32bit安装图解-数据库专栏,ORACLE...
  2. oracle 9i aix 迁移,Oracle 9i 在AIX上的安装 (转)
  3. tomcat安装与项目部署
  4. java获取xml参数
  5. 麦克马斯特大学计算机科学硕士,2020年麦克马斯特大学硕士要上多久才能毕业...
  6. mybatis中的#{}与${}在原理上的区别
  7. tftd32搭建DHCP服务器软件打开报错
  8. 英文网站建设应该如何做?如何建好一个英文网站?
  9. 如何利用 composer 替换第三方包里的某个类(color-thief-php为例)
  10. 美国诚实签经验——回答签证官的问题时,一定要问什么才答什么,不要犹豫改口、做很多解释或开玩笑,自信且镇静地与他对话,着装得体、举止自然、言谈自信...
  11. 链接库 -L -l -I -i的作用及区别
  12. Anomaly Detection in Quasi-Periodic TimeSeries Based on Automatic Data Segmentation and Attentional
  13. iPhone/iPad 屏幕旋屏
  14. AI人工智能—数据标注的主要类型和标注注意事项
  15. vue以post的方式发请求,传参在url中
  16. 使用requests爬取豆瓣电视
  17. 如何将iPhone核心数据与Web服务器同步,然后推送到其他设备? [关闭]
  18. 手机电路板文件_ORICO移动硬盘盒玩出新花样,变身手机备份宝
  19. ecw2c为我唱一首堆栈溢出的歌曲:音乐尾声优化
  20. sketch web组件_在Sketch中设计受VSCO启发的Web Journal

热门文章

  1. mac 不能连接wi-fi_如何阻止Mac自动连接到Wi-Fi网络
  2. 关联分析算法c语言实现,机器学习关联分析
  3. Git vs SVN
  4. JS时间戳和时间互转
  5. Mysql 查询统计练习
  6. Java Socke 探究
  7. uva705--slash maze
  8. 利用percona-toolkit工具检查MySQL数据库主从复制数据的一致性,以及修复。
  9. 基于开源流程引擎Activiti5的工作流开发平台BPMX3
  10. Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用