CreateML 使用以及机器学习基础概念

news2024/11/17 7:25:18

1. 前言

在学习 CreateML 之前,我们先了解一下什么是机器学习?目前还不存在被广泛认可的定义来准确定义机器学习是什么。第一个机器学习的定义来自于Arthur Samuel。他定义机器学习为,在进行特定编程的情况下,给予计算机学习能力的领域。Samuel的定义可以回溯到50年代,他编写了一个西洋棋程序。这程序神奇之处在于编程者自己下棋很菜,但是他通过编程,让西洋棋程序自己跟自己下了上万盘棋,久而久之,这西洋棋程序明白了什么是好布局,什么是坏布局。通过学习后的程序,玩西洋棋的水平远超过了Samuel。上述是有点不正式的定义,也比较古老。

另一个年代近一点的定义,由Tom Mitchell提出,来自卡内基梅隆大学,Tom定义的机器学习是,程序能从经验E中学习,解决任务T,达到性能度量值P,当且仅当有了经验E后,经过P评判,程序在处理T时的性能有所提升。 上面的例子中,经验 E 就是程序上万次的自我练习的经验而任务 T 就是下棋。性能度量值 P 呢,就是它在与一些新的对手比赛时,赢得比赛的概率。

机器学习可以分为监督学习(Supervised Learning)和非监督学习(Unsupervised Learning),监督学习的基本思想是,我们数据集中的每个样本都有相应的输出,再根据这些样本作出预测。非监督学习中,是将一系列无标签的训练数据,输入到一个算法中,然后我们告诉这个算法,快去为我们找找这个数据的内在结构给定数据。

2. CreateML 是什么

Create ML 是苹果于2018年 WWDC 推出的生成机器学习模型的工具,它是通过机器学习算法,训练出模型,来解决实际问题。CreateML 所涉及的训练都是监督学习,主要处理分类问题、回归问题以及推荐,对应的是 MLClassifier、MLRegressor 以及 MLRecommender。下面主要介绍对应的机器学习的背景知识,来帮助大家更好的理解。

大概介绍一下 CreateML 是怎么训练模型的,它可以利用系统(iOS 12 或 macOS Mojave )内置的机器学习基础设施进行迁移学习(Transfer Learning),这种训练需要少量数据就足够了,训练出来的模型是将苹果内置模型最后几层由我们的数据训练。这样训练时间大大减少,甚至几秒钟就能训练完成。模型大小也可以减少到 kb 级别,更容易接入到我们的 App 中。虽然要求少量数据也不能无中生有,想找数据的同学可以从这里找找看
Transfer Learning

3. 什么是分类问题

让我们来看一组数据:这个糖尿病预测的数据集中,前8列为特征,最后一列为 label,1和0表示是否为糖尿病。
训练数据
那么机器学习的问题就在于,你能否估算出其他人是否患有糖尿病。用术语来讲,这是一个分类问题。

分类指的是,我们试着推测出离散的输出值:0或1是否患病,而事实上在分类问题中,输出可能不止两个值。比如说可能有两种糖尿病,所以你希望预测离散输出0、1、2。0 代表未患糖尿病,1 表示第1类糖尿病,2表示第2类糖尿病,但这也是分类问题。

所以在使用 CreateML 时,也就需要传入训练数据,以及标签的列(labelColumn)以及特征的列(featureColumn),根据实际情况是可以支持多个或者一个多 Column 的。

当然看图识物也是分类问题,它的输入是图片或者视频的一帧的所有像素点,为了提高计算效率以及准确度还会通过池化层、卷积层等来对原始特征进行处理。

Create ML 中不同的分类器(Classifier),会设定对应的 DataSource 来描述特征以及标签。这是音频相关的注释信息。

/// - featureColumn: The name of the column that contains the audio
// features.
///
/// - labelColumn: The name of the column that contains the audio
/// labels.

4. 什么是回归问题

举一个例子,估计火星房价,我们可以应用学习算法,在这组数据中画一条直线,或叫做拟合一条直线,根据这条线我们可以推测出,太阳能电池板数为 3 时的价格,当然这不是唯一的算法。可能还有更好的,比如我们不用直线拟合这些数据,还可以根据实际情况采用二次方程或者更高阶的方程去拟合。

假设房价只精确到整数,所以房价实际上是一系列离散值,但是我们通常又把房价看成实数,即一个连续的数值。

回归这个词的意思是,我们在试着推测出这一系列连续值属性。这就是回归问题,即通过回归来推出一个连续的输出。在这里插入图片描述
回归问题在 CreateML 训练模型的时,需要传入的数据也基本一致,也就需要传入训练数据,以及标签列(这里命名叫做 targetColumn, 本质还是一样的)以及特征的列(featureColumn)

///   - targetColumn: A String specifying the target column name in the trainingData
///   - featureColumns: An optional list of Strings specifying feature columns to be
///                     used to predict the target, if not provided, default to use all the
///                     other columns in the trainingData, except the one specified by targetColumn

5. 推荐系统

推荐系统可能大家比较陌生一些,下面举个例子来定义推荐系统的问题。

假设我们是电影供应商,我们有 5 部电影和 4 个用户,我们要求用户为电影打分。
在这里插入图片描述
前三部电影是爱情片,后两部是动作片,我们可以看出Alice和Bob似乎更倾向与爱情片, 而 Carol 和 Dave 似乎更倾向与动作片。并且没有一个用户给所有的电影都打过分。我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并以此作为推荐的依据。

在这个例子是属于推荐问题的一种形式,我们假设每部电影都有两个特征,如 x1 代表电影的浪漫指数,x2 代表电影的动作指数。[x1, x2] 就是电影的特征,我们可以通过特征数据对每个人进行线性回归,来补充其他电影的打分,这种是基于内容的推荐系统(Content Based Recommendations),想详细了解的可以从这里看

上面这个例子我们有用户参数,也有电影的特征,其实还有一种推荐问题的形式,就是这两种我们都没有,这个该如何解决呢。目前是有协同过滤算法(Collaborative Filtering)是可以同时学习这两者的,相当于自我学习特征,学习的这些数据不是都能读懂的,但是可以用这些数据作为给用户推荐电影的依据。想了解详细内容的可以从这里看

从上面的介绍我们可以看到,训练数据包括三部分,被推荐的元素,用户以及评分,在 CreateML 中我们我们训练数据也需要包含这三列数据

///  - itemColumn: Name of the Int or String typed column in the training data containing item identifiers.
///
///  - userColumn: Name of the Int or String typed column in the training data containing user identifiers.
///
///  - ratingColumn: Name of an Int or Double typed column optionally in the training data containing scores or ratings.
///                        The default is nil, which corresponds to no rating column.

6 如何训练推荐模型

6.1 使用 CreateML App

CreatML App 来训练,简单易用的可视化操作,直接拖动数据即可,这里有篇文章介绍了各个模型类型,还有举例如何使用,可以从这里看
CreateML App
再补充一个如何训练图片分类的链接

6.1 使用 Swift 代码训练

代码也是比较方便的,下面举一个 MLTextClassifier 的例子,其他类型除了数据格式不同一起,使用基本是一致的。推逻辑回归代码示例可以查看参考文章[5],数据准备会有所不同,使用起来是基本一致的

这个模型训练目的是,分析一句话,判断这句话的态度是积极的还是消极的。

第一步,准备数据,数据文件的格式是 csv,数据一共分为两列,其中 class 是标签列,text 是特征列,标签列和特征列的名称可以根据需要来自己定义,先后顺序可以任意
在这里插入图片描述
第二步,训练和评估模型,模型训练模型完成之后,还需要评估模型是否准确率。所以我们的训练数据可以分为两部分,分一大部分用于训练,一小部分用于评估验证,这个例子是训练和验证的数据比例是 9:1,可以根据数据量来灵活调整。
其中 metrics.classificationError 来表示在验证集数据的错误率,如果错误率比较高,可以调整数据集,或者更新算法等来调整。

目前训练 API 有更新,下面这个例子是使用 MLDataTable 数据格式,在macOS 13.0 以及 iOS 16.0 版本已经弃用了,具体接口可以根据设备的系统版本来选择就好,新版本的 MLTextClassifier.DataSource 也可以支持多个标签,可以随机分配多组来进行交叉验证,降低过拟合、欠拟合等问题。

guard let url = mlFileURL,
      let allData = try? MLDataTable(contentsOf: url) else {
    return
}

let data: TrainingData = allData.randomSplit(by: 0.9)
guard let classfier = try? MLTextClassifier(trainingData: data.trainingData, textColumn: "text", labelColumn: "class", parameters: MLTextClassifier.ModelParameters()) else {
    return
}
let metrics = classfier.evaluation(on: data.testData, textColumn: "text", labelColumn: "class")
print("classificationError: \(String(describing: metrics.classificationError))")

第三步,如果模型好用可以保存下来

// 保存模型
func saveModel(toFile: String) {
    try? classfier?.write(toFile: toFile)
}

第四步,使用模型预测数据

这个像调用函数一样,非常简单了,输入一段文本,查看预测结果就可以了。

func prediction(_ text: String) {

    guard let ret = try? classfier?.prediction(from: text) else {
        print("prediction error")
        return
    }
    print("prediction result: \(String(describing: ret))")
}

6.参考文章:

  1. WWDC 2018:初探 Create ML
  2. CreateML: Start Your Adventure in Machine Learning with Swift
  3. MLDataTable: The Panda For iOS Developers
  4. CreateML 使用以及在 iOS 中应用介绍
  5. Build a Core ML Movie Recommender SwiftUI App Using CreateML

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

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

相关文章

C语言-类型转换

数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题. 转换的方法有两种: 自动转换: 遵循一定的规则,由编译系统自动完成. 强制类型转换: 把表达式的运算结果强制转换成所需的数据类型 1 自动转换 自动转换原则 …

阿里人手一本的Java性能调优手册,几乎涵盖了性能优化的所有操作

说起性能调优,想必大家都知道,但是就是没怎么用过,所以在Java性能优化上面临着很多的困扰,比如: 能力修炼中,由于常年接触 CRUD,缺乏高并发这一实践环境,对“性能优化”只能通过理论…

剑指 Offer 59 - I: 滑动窗口的最大值

第一眼看这个感觉思路没啥大问题,就是一个大循环不断后移,然后小循环维护一个k长度的队列。注意peekFirst和peekLast的使用,双端队列可以打破先进先出或者先进后出的局限性,因此peek没有默认值,得加上First或者Last来进…

干货 | 腾讯云李滨:云时代数据安全治理方法与实践

作者:李滨‍‍‍‍本文约2600字,建议阅读8分钟 本文与你分享腾旭在数据安全和人工智能的安全治理方法,以及实践上的一些经验。 今天很荣幸与大家分享在过去几年以内,腾讯在数据安全和人工智能的安全治理方法,以及实践上…

使用服务器的妙妙工具

为什么使用服务器? 一台电脑的性能终究是有限的,所以当计算量太大时,我们可以借助服务器,它的运算速度快,存储空间大。 和个人电脑不同,服务器通常由一个管理员进行管理,而有多用户同时使用。…

一行代码实现网页直接跳转抖音,2023年6月新方法

之前 发的文章 方法已经失效,以下为新版本方案! 背景 大家可能都发现在一些APP中无法直接打开抖音的链接,就连抖音官方的分享链接在浏览器打开都无法直接唤醒APP。需要我们手动点击,如果我们在自己网站等推广希望直接拉起抖音可…

工厂方法模式(五)

过气的,终究是过气了 上一章简单介绍了工厂模式(四), 如果没有看过,请观看上一章 一.工厂方法模式 工厂方法模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。 将类的实例化(具体产品的创建&…

全网最火爆,性能测试基本原则方法总结,再不卷就被淘汰了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试关键点 …

2023 年牛客网最新版大厂 Java 八股文面试题总结(覆盖所有面试题考点)

序员真的是需要将终生学习贯彻到底的职业,一旦停止学习,离被淘汰,也就不远了。 金九银十跳槽季,这是一个千年不变的话题,每到这个时候,很多人都会临阵磨枪,相信不快也光。于是,大家…

什么是Vue的数据流(单向数据流)?如何进行数据流管理

什么是Vue的数据流(单向数据流)?如何进行数据流管理 在Vue中,数据流是指数据的传递和管理方式。Vue采用的是单向数据流,也就是说,数据是从父组件流向子组件,子组件不能直接修改父组件的数据。本…

夏季来临居民如何预防电气火灾隐患

安科瑞虞佳豪 居住场所预防电气火患 请注意以下几点 1.用具有生产许可证或CCC证书并与居住场所的环境相适应的电气线路以及插座、插线板、充电器、用电设备等电器产品; 2.不私自拉接电气线路;不随意更改电气线路保护装置; 3.不随意更换原…

泛娱乐社交(一)直播产品商业化解决方案

摘要 在过去几年的直播行业创业风口期中,直播的用户关注度疯狂增长,但用户质量却参差不齐。随着用户新鲜感一过,流失率变得相当严重,各大平台都在竭尽全力防御。然而,留住“凑热闹”的非直播受众用户并不是最关键的问…

SpringBoot(基础篇)

SpringBoot基础篇 入门案例 在创建SpringBoot项目时,会出现以下不需要的文件,如果每次都手动删除的话,就会很麻烦。 教你一招 在setting设置中找到Editor,选择File Types–>Ignored Files and Folders–>点击号&#xff…

pycharm使用之torch_geometric安装

正式安装之前要先查看一下torch的版本 一、查看torch版本 1、winR ,输入cmd 2、输入python 3、 输入import torch,然后输入torch.__version__,最后回车 可以看到我的torch版本是1.10.0 二、下载合适的版本 1、打开链接 https://pytorch-…

千万级入口服务[Gateway]框架设计(一)

本文将以技术调研模式编写,非技术同学可跳过。 文章目录 背景问题[不涉及具体业务]目标技术选型语言框架模式实现一:go 原生组件Demo 实现Benchwork 基准性能小结实现二:开源 go-plugin 附录入口服务演变 背景 在历史架构的迭代中&#xff…

Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR

警告:此功能处于技术预览阶段,可能会在未来的版本中更改或删除。 Elastic 将尽最大努力修复任何问题,但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。 Elastic Learned Sparse EncodeR - 或 ELSER - 是由 Elastic 训练的检索模型&#…

Python程序员必会技能:如何在Python中连接数据库获取数据

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 想要成为一名数据分析师,一个最基础的技能就是:提取数据。 数据是数据分析的基础。 因此,掌握各种获取数据的技能一定是一个合格的数据分析师的必备技能。 而我们的需要进行提取的…

总结排查服务器上传下载慢的几种手段与查看服务器带宽的具体方法

一、排查服务器上传下载 最近出现的一个情况,服务器上传和下载比较慢,因此我排查了种种手段,特此记录下几种常见的手段。 1、使用speedtest-cli 测试网速: 该方法是测试网速的速度怎么样,看看是否真的慢? …

python中os库用法详解(总结)

os库主要是对文件和文件夹进行操作,在Python中对⽂件和⽂件夹的操作要借助os模块⾥⾯的相关功能。 具体步骤如下: 1. 导⼊os模块 import os 2. 使⽤ os 模块相关功能 os.函数名() 1、⽂件重命名 os.rename(⽬标⽂件名, 新⽂件名) 示例代码&#…

使用Docker从0开始在Linuex部署springboot项目(图文并茂)

一、前言 在腾讯云新买的洁白如新的云服务器,想要使用docker去部署springboot项目,特此记录! 二、安装jdk 参考博客:https://blog.csdn.net/weixin_45853881/article/details/123402891 2.1 检查jdk 直接在腾讯云平台登陆云服…