百日学 Swift(Day 26) – Project 4, part one(项目 4 :第 1 部分)
1. BetterRest: Introduction(BetterRest项目简介)
使用 Core ML 技术,尝试实现回归分析,即机器学习的开始。Core ML 是所有 iPhone 都内置的技术。
项目要求:通过向咖啡饮用者提出以下三个问题来帮助他们改善睡眠质量:
(1)他们什么时候想醒来?
(2)他们想要多少个小时的睡眠?
(3)他们每天喝几杯咖啡?
有了这三个值后,我们会将它们输入Core ML,以得到一个告诉我们何时该睡觉的结果。如果您考虑一下,就会有数十亿个可能的答案:所有各种唤醒时间乘以所有睡眠小时数,再乘以全部咖啡量。无疑这个数字是庞大的,但是实际应用中没有必要也不可能获取到所有人的数据,我们只要保证采集样本足够大就好。样本数据可以到 GitHub 上下载。
先创建项目吧。
2. Entering numbers with Stepper(使用 Stepper 输入数值)
Stepper (步进器)是用来输入数字的一个组件,有两个按钮+
和-
。可以绑定 Int、Double 等多种数据类型,取值范围由类型决定。Stepper 常见的方法有 onIncrement
、 onDecrement
和 onEditingChanged
。具体用法如下:
@State private var sleepAmount = 8.0
var body: some View {
Stepper(value: $sleepAmount, in: 4...12, step: 0.25){
Text("\(sleepAmount, specifier: "%.2f") hours")
}
}
参数:
- value:一般是绑定的状态
- in:数字范围
- step:步长
3. Selecting dates and times with DatePicker(使用 DatePicker 选择日期和时间)
DatePicker 是专用的输入日期的组件,可以绑定到 Date 类型的属性上。
@State private var wakeUp = Date()
var body: some View {
VStack(spacing: 5) {
VStack{
Text("显示标签, 选择时分")
DatePicker("请选择时间:", selection: $wakeUp, displayedComponents: .hourAndMinute)
}.font(.headline)
Divider()
VStack{
Text("隐藏标签")
DatePicker("请选择日期:", selection: $wakeUp).labelsHidden()
}.font(.headline)
Divider()
VStack{
Text("放入表单 限制为始于现在")
Form {
DatePicker("请选择日期和时间:", selection: $wakeUp, in: Date()...)
}
}.font(.headline)
}
}
参数:
- 标签:即使设为空字符,如果没有 labelHidden 也会留出空间
- selection:绑定的属性
- displayedComponents:
- 默认:一天、一小时、一分钟
- .date:日、月、年
- .hourAndMinute:小时、分钟
- in:范围,这个和循环里面用的范围差不多,但是数据类型是Date,而不是 Int 或者 Double。因为时间的表达比较复杂,可以先将起止点设为变量,这样好控制。另外,可以只写一边,让 Swift 去推断另一边(循环是不行的,我的理解是,循环不能是无限的,但是时间是无限的,哈哈)
4. Working with dates(处理日期)
Swift 提供了 Date
结构体,其中封装了年、月、日、时、分、秒……等。Date 类型的计算总是要和秒这个单位打交道,特别不符合我们日常的习惯。
Swift 还提供了 DateComponents
结构体,可以保存和读取时间的某个特定部分,比如月、分。
Swift 使用 DAteFormatter
完成日期Date
和字符串String
之间的转换。
这部分内容看着有些晕乎乎的,因为没有深入介绍。文档还没细致看,回头补上吧。
5. Training a model with Create ML(使用 CreatML 训练模型)
Core ML能够处理各种训练任务,例如识别图像,声音甚至运动。本项目将研究在机器学习中很常见的表格回归,即可以在Create ML上通过类似于电子表格的大量数据找出各种值之间的关系。
机器学习分两个步骤进行:
- 训练模型:计算机查看所有数据以弄清其中各种值之间的关系的过程,对于大型数据,训练时间少则几个小时,甚至可能更长。
- 预测:是在设备上完成的。将训练后的模型提供给 app,App 将在运行的时候使用以前的结果对新数据进行估算。
(1)创建项目
首先创建一个项目,通过 Xcode 菜单并选择Open Developer Tool> Create ML
打开 Create ML 应用。有很多模板可供选择,向下滚动到底部,选择Tabular Regressor
,然后点 Next。项目名称输入BetterRest
,然后再点 Next,选择保存的文件夹,然后点 Create。
(2)向 Create ML 提供训练数据。
要查看的原始统计数据,包含四个值:起床时间,期待睡眠时间,每天喝多少咖啡以及实际需要睡眠时间。项目数据保存在BetterRest.csv
文件中。这是 Create ML 可以使用的逗号分隔值数据集,我们的第一项工作是导入该数据集。
因此,在 Create ML 中,在左侧的导航栏中选择Model Sources
中的 BetterRest
。然后在右侧的 Data Inputs
中的 Traning Date
中,单击Select File
下拉列表,将打开一个文件选择窗口,选择BetterRest.csv
。
(3)确定目标Target
和特征Features
Target 是希望计算机学习预测的值,Features 是希望计算机检查以预测目标的值。例如,如果选择某人认为需要多少睡眠和实际需要多少睡眠作为特征,可以训练计算机预测他喝了多少咖啡。
将 Target 选择为actualSleep
,表示希望计算机学习如何预测实际需要睡眠时间。然后点 Select Features...
,然后选择所有三个选项:wake
,estimatedSleep
和coffee
,表示计算机在生成预测时会将所有这三个因素都考虑在内。
(4)选择算法
Select Features...
按钮下面的下拉列表用来选择算法,有五个选项:“自动”Automatic
,“随机森林”Random Forest
,“增强树”Boosted Tree
,“决策树”Decision Tree
和“线性回归”Linear Regression
。每个人都采用不同的方法来分析数据,尽管这不是一本关于机器学习的书,但我还是想简要解释一下它们的工作。
线性回归是最容易理解的,因为它几乎完全是我们大脑的工作方式。线性回归试图通过将变量视为线性函数的一部分来估计变量之间的关系,例如applyAlgorithm(var1, var2, var3)
。线性回归的目标是能够在所有数据点上绘制一条直线,其中直线与每个数据点之间的平均距离应尽可能小。
决策树回归形成的树状结构,使我们可以将信息组织为一系列选择。例如:“您是人还是动物?如果你是一个人,你是活着还是死了?如果您还活着,您是年轻还是老?” 依此类推,每次树会根据每个问题的答案而分支,直到最终有了确定的答案。
增强型树回归使用一系列决策树来工作,其中每棵树旨在纠正前一棵树中的任何错误。例如,第一个决策树会尽最大的可能去寻找一个好的预测,但是下降了20%。然后,将其传递到第二个决策树以进行进一步细化,然后重复该过程——但这一次,误差降至10%。那进入了第三棵树,误差降低到8%,第四棵树,误差降低到7%。
随机森林与增强树相似,但略有不同:对于增强树,树中的每个决策都可以访问所有可用数据,而对于随机树,每个树只能访问数据的一个子集。
想象一下您正面临一个编码问题并试图提出一个解决方案。如果您向一位同事征求意见,他会根据他所了解的为您提供一些想法。如果您再向其他同事征求意见,他们会根据他们所了解的为您提供不同的想法。如果您向一百位同事征求意见,那会获得一系列解决方案。
每个同事的背景,教育程度和工作经历都与其他同事不同,因此您会得到一系列建议。但是,如果您将每个人的建议平均化(不管大多数人怎么说,也不管他们是怎么做出决定的),那么您就有最好的机会获得正确的解决方案。
这就是随机森林回归器的工作方式:每个决策树都有自己的数据视图,该视图与其他树不同,并且通过将所有预测结合在一起以形成平均值,您很有可能获得良好的结果。
Automatic
选项可以尝试自动选择最佳算法。虽然并不总是正确的,可是会帮我们减少对选项的纠结。这里我们就选这个啦。
(5)训练
一切准备就绪后,单击窗口标题栏中的“Train”按钮。几秒钟后(因为我们的数据量还是很小的)会看到一些结果指标。我们关心的值称为“均方根误差”,您应该获得大约180的值。这意味着该模型平均能够预测建议的准确睡眠时间,而误差仅为180秒或三分钟。
(6)输出
在右上角的Output
可以看到一个 MLModel 图标,文件大小约为438字节。我的是 555 bytes,大概机器和机器之间略有差异。现在模型已经训练完毕,将图标从 Create ML 拖到桌面上,等下回在代码中使用。
**提示:**如果想尝试使用其他算法训练,单击“Create ML”窗口右下角的“Make a Copy”。