ML.NET 示例:二元分类之垃圾短信检测
写在前面
准备近期将微软的machinelearning-samples翻译成中文,水平有限,如有错漏,请大家多多指正。
如果有朋友对此感兴趣,可以加入我:https://github.com/feiyun0112/machinelearning-samples.zh-cn
垃圾短信检测
| ML.NET 版本 | API 类型 | 状态 | 应用程序类型 | 数据类型 | 场景 | 机器学习任务 | 算法 |
|---|---|---|---|---|---|---|---|
| v0.7 | 动态API | 可能需要更新项目结构以匹配模板 | 控制台应用程序 | .tsv 文件 | 垃圾信息检测 | 二元分类 | SDCA(线性学习器),还展示了CustomMapping评估器,它可以将自定义代码添加到ML.NET管道 |
在这个示例中,您将看到如何使用ML.NET来预测短信是否是垃圾信息。在机器学习领域中,这种类型的预测被称为二元分类。
问题
我们的目标是预测一个短信是否是垃圾信息(一个不相关的/不想要的消息)。我们将使用UCI的SMS Spam Collection Data Set,其中包含近6000条被分类为“垃圾信息”或“ham”(不是垃圾信息)的消息。我们将使用这个数据集来训练一个模型,该模型可以接收新消息并预测它们是否是垃圾信息。
这是一个二元分类的示例,因为我们将短信分类为两个类别。
解决方案
要解决这个问题,首先我们将建立一个评估器来定义我们想要使用的机器学习管道。 然后,我们将在现有数据上训练这个评估器,评估其有多好,最后我们将使用该模型来预测一些示例消息是否是垃圾信息。

1. 建立评估器
为了建立评估器,我们将:
定义如何读取从 https://archive.ics.uci.edu/ml/datasets/SMS+Spam+Collection 下载的垃圾信息数据集。
应用多个数据转换:
- 将标签(“spam”或“ham”)转换为布尔值(“true”表示垃圾信息),这样我们就可以在二元分类器中使用它。
- 将短信转换为数字向量,以便机器学习训练器可以使用它
添加一个训练器(如
StochasticDualCoordinateAscent)。
初始代码类似以下内容:
// Set up the MLContext, which is a catalog of components in ML.NET.
var mlContext = new MLContext();
// Create the reader and define which columns from the file should be read.
var reader = new TextLoader(mlContext, new TextLoader.Arguments()
{
Separator = "tab",
HasHeader = true,
Column = new[]
{
new TextLoader.Column("Label", DataKind.Text, 0),
new TextLoader.Column("Message", DataKind.Text, 1)
}
});
var data = reader.Read(new MultiFileSource(TrainDataPath));
// Create the estimator which converts the text label to boolean, featurizes the text, and adds a linear trainer.
var estimator = mlContext.Transforms.CustomMapping<MyInput, MyOutput>(MyLambda.MyAction, "MyLambda")
.Append(mlContext.Transforms.Text.FeaturizeText("Message", "Features"))
.Append(mlContext.BinaryClassification.Trainers.StochasticDualCoordinateAscent());
2. 评估模型
对于这个数据集,我们将使用交叉验证来评估我们的模型。将数据集划分成5个不相交的子集,训练5个模型(每个模型使用其中4个子集),并在训练中没有使用的数据子集上测试模型。
var cvResults = mlContext.BinaryClassification.CrossValidate(data, estimator, numFolds: 5);
var aucs = cvResults.Select(r => r.metrics.Auc);
Console.WriteLine("The AUC is {0}", aucs.Average());
请注意,通常我们在训练后评估模型。 但是,交叉验证包括模型训练部分,因此我们不需要先执行Fit()。 但是,我们稍后将在完整数据集上训练模型以利用其他数据。
3. 训练模型
为了训练模型,我们将调用评估器的Fit()方法,同时提供完整的训练数据。
var model = estimator.Fit(data);
4. 使用模型
训练完模型后,您可以使用Predict()API来预测新文本是否垃圾信息。 在这种情况下,我们更改模型的阈值以获得更好的预测。 我们这样做是因为我们的数据有偏差,大多数消息都不是垃圾信息。
// The dataset we have is skewed, as there are many more non-spam messages than spam messages.
// While our model is relatively good at detecting the difference, this skewness leads it to always
// say the message is not spam. We deal with this by lowering the threshold of the predictor. In reality,
// it is useful to look at the precision-recall curve to identify the best possible threshold.
var inPipe = new TransformerChain<ITransformer>(model.Take(model.Count() - 1).ToArray());
var lastTransformer = new BinaryPredictionTransformer<IPredictorProducing<float>>(mlContext, model.LastTransformer.Model, inPipe.GetOutputSchema(data.Schema), model.LastTransformer.FeatureColumn, threshold: 0.15f, thresholdColumn: DefaultColumnNames.Probability);
ITransformer[] parts = model.ToArray();
parts[parts.Length - 1] = lastTransformer;
var newModel = new TransformerChain<ITransformer>(parts);
// Create a PredictionFunction from our model
var predictor = newModel.MakePredictionFunction<SpamInput, SpamPrediction>(mlContext);
var input = new SpamInput { Message = "free medicine winner! congratulations" };
Console.WriteLine("The message '{0}' is {1}", input.Message, predictor.Predict(input).isSpam ? "spam" : "not spam");
ML.NET 示例:二元分类之垃圾短信检测的更多相关文章
- python数据挖掘第三篇-垃圾短信文本分类
数据挖掘第三篇-文本分类 文本分类总体上包括8个步骤.数据探索分析->数据抽取->文本预处理->分词->去除停用词->文本向量化表示->分类器->模型评估.重 ...
- 新出台的治理iMessage垃圾短信的规则
工信部拟制定<通信短信息服务管理规定>,为治理垃圾短信提供执法根据.当中,对于苹果iMessage垃圾信息泛滥现象,工信部也将跟踪研究技术监測和防范手段.这意味着长期以来处于监管" ...
- 使用Python 2.7实现的垃圾短信识别器
最近参加比赛,写了一个垃圾短信识别器,在这里做一下记录. 官方提供的数据是csv文件,其中训练集有80万条数据,测试集有20万条数据,训练集的格式为:行号 标记(0为普通短信,1为垃圾短信) 短信内容 ...
- 单线程与多线程的简单示例(以Windows服务发短信为示例)
单线程示例: public delegate void SM(); SM sm = new SM(() => { while (true) ...
- XSS之偷梁换柱--盲打垃圾短信平台
https://www.t00ls.net/thread-49742-1-1.html
- R 基于朴素贝叶斯模型实现手机垃圾短信过滤
# 读取数数据, 查看数据结构 df_raw <- read.csv("sms_spam.csv", stringsAsFactors=F) str(df_raw) leng ...
- ML.NET 示例:目录
ML.NET 示例中文版:https://github.com/feiyun0112/machinelearning-samples.zh-cn 英文原版请访问:https://github.com/ ...
- 腾讯云短信 nodejs 接入, 通过验证码修改手机示例
腾讯云短信 nodejs 接入, 通过验证码修改手机示例 参考:腾讯云短信文档国内短信快速入门qcloudsms Node.js SDK文档中心>短信>错误码 nodejs sdk 使用示 ...
- atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc
atitit.短信 验证码 破解 v3 p34 识别 绕过 系统方案规划----业务相关方案 手机验证码 .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1 ...
随机推荐
- 【Java入门提高篇】Day32 Java容器类详解(十四)ArrayDeque详解
今天来介绍一个不太常见也不太常用的类——ArrayDeque,这是一个很不错的容器类,如果对它还不了解的话,那么就好好看看这篇文章吧. 看完本篇,你将会了解到: 1.ArrayDeque是什么? 2. ...
- HashTree【转】
http://blog.csdn.net/yang_yulei/article/details/46337405 在各种数据结构(线性表.树等)中,记录在结构中的相对位置是随机的.因此在机构中查找记录 ...
- scrapy爬取校花网男神图片保存到本地
爬虫四部曲,本人按自己的步骤来写,可能有很多漏洞,望各位大神指点指点 1.创建项目 scrapy startproject xiaohuawang scrapy.cfg: 项目的配置文件xiaohua ...
- 用Python实现数据结构之队列
队列 队列与栈的类型很相似,但它遵循的原则是先进先出(FIFO),也就是元素插入的时候只能在该数据结构的末端,而删除只能删除最前面的元素.队列同样应用广泛,例如打印机的队列或者是一个web服务器响应请 ...
- 32_使用BeanUtils工具包操作JavaBean
由于对属性设置值和得到值的需求很多,使用频率很高,所以有一些开源勇士 不满足于JavaBean API 中IntroSpector来操作bean, 写出来了通用的BeanUtils工具,来进一步简 ...
- 03LaTeX学习系列之---TeXworks的使用
目录 03TeXworks的使用 目录 前言 (一)Texworks的认识 1.TeXworks的安装 2.TeXworks的优点 3.TeXworks的界面 (二)Texworks的编译与查看 1. ...
- Windows端部署zabbix-agent
一.windows客户端的配置关闭windows防火墙或者开通10050和10051端口(1).关闭防火墙(不推荐直接关闭,测试可以这样做,尤其是最近勒索病毒猛烈)开始—控制面板—windows防火墙 ...
- Hbase-2.0.0_01_安装部署
该文章是基于 Hadoop2.7.6_01_部署 进行的 1. 主机规划 主机名称 IP信息 内网IP 操作系统 安装软件 备注:运行程序 mini01 10.0.0.11 172.16.1.11 C ...
- Window 由于未经处理的异常,进程终止。
今天遇到了一个程序停止的问题: 应用程序: BussinessService.exe Framework 版本: v4.0.30319 说明: 由于未经处理的异常,进程终止.异常信息: System. ...
- jQuery-jqprint.js打印插件使用高版本jQuery时问题
使用jqprint打印插件的网页demo代码: <!doctype html> <html> <head> <meta charset="utf-8 ...