机器学习与Swift开发:从回归预测到高级工具应用
立即解锁
发布时间: 2025-08-30 00:33:53 阅读量: 5 订阅数: 14 AIGC 

### 机器学习与Swift开发:从回归预测到高级工具应用
在实际应用中构建推荐系统时,冷启动问题是常见的挑战之一。当新用户进入系统并需要推荐时,如果该用户没有对任何事物进行评分(假设系统基于评分进行推荐),就难以根据相似用户来推断其喜好,这就是冷启动问题。虽然没有一种通用的解决方案,但有一些论文从不同角度探讨了这个问题:
- https://dl.acm.org/citation.cfm?id=2043943
- https://dl.acm.org/citation.cfm?id=3108148
- https://ieeexplore.ieee.org/document/7355341
- https://kojinoshiba.com/recsys-cold-start/www.cs.toronto.edu/~mvolkovs/nips2017_deepcf.pdf
- https://arxiv.org/abs/1511.06939
#### 回归预测任务
机器学习的一个强大应用是处理表格数据。与图像或声音相比,表格数据涵盖的数据范围更广。分类器是常用的机器学习技术,而回归器则是其有用的补充。分类器将输入分类到其训练过的类别中,而回归器可以预测训练过程中未见过的值。
##### 问题与方法
我们要训练一个回归模型,该模型以以下三个值作为输入:
- 住宅的房间数量
- 郊区低地位人口的百分比
- 城镇的师生比例
并预测一个输出值:自有住房的中位价值(以千美元为单位)。
##### AI工具包和数据集
我们使用Python来准备数据,并使用CreateML框架训练回归器。这里使用的数据集是“波士顿住房数据集”,它被称为回归数据集的“Hello World”,包含了20世纪70年代和80年代波士顿房价的信息。数据集中包含我们需要的输入信息:
- 住宅的房间数量(数据集中名为RM)
- 郊区低地位人口的百分比(数据集中名为LSTAT)
- 城镇的师生比例(数据集中名为PTRATIO)
以及输出信息:自有住房的中位价值(以千美元为单位,数据集中名为MEDV)。
##### 数据准备
波士顿住房数据可以从UCI机器学习库下载。数据最初是以制表符和空格分隔的形式提供的,我们需要将其转换为包含四个列(RM、LSTAT、PTRATIO和MEDV)的CSV文件。具体步骤如下:
1. **设置并激活Python环境**:
```bash
conda create -n Regressor
conda activate Regressor
```
2. **安装必要的库**:
```bash
conda install scikit-learn numpy
```
我们使用scikit-learn获取波士顿住房数据,使用NumPy以良好的形式处理数据。
3. **创建新的Python脚本**:
```python
import csv
import numpy as np
from sklearn.datasets import load_boston
```
4. **加载波士顿住房数据**:
```python
dataset = load_boston()
```
5. **定义必要的变量**:
```python
attributes = np.array(dataset.data)
outcome = np.array(dataset.target)
output_filename = 'housing.csv'
headings = ['RM', 'LSTAT', 'PTRATIO', 'MEDV']
```
6. **将数据转换为CSV文件并保存**:
```python
with open(output_filename, 'w+') as output_file:
writer = csv.writer(output_file)
writer.writerow(headings)
for index, row in enumerate(attributes):
values = [row[5], row[12], row[10], outcome[index]]
writer.writerow(values)
```
运行脚本`python regressor_preparation.py`,即可得到新创建的`housing.csv`文件。
##### 创建模型
数据准备好后,我们将使用苹果的CreateML框架训练回归器。具体步骤如下:
1. **在Xcode中创建新的macOS风格的Swift Playground**。
2. **导入Foundation和CreateML**:
```swift
import Foundation
import CreateML
```
3. **加载准备好的数据集**:
```swift
let houseDatasetPath = "/Users/parisba/ORM Projects/Practical AI with Swift 1st Edition/PAISw1StEdCode/Regressor/housing.csv"
let houseDataset = try MLDataTable(contentsOf: URL(fileURLWithPath: houseDatasetPath))
```
确保指向之前加载的CSV文件。
4. **创建MLRegressor**:
```swift
let priceRegressor = try MLRegressor(trainingData: houseDataset, targetColumn: "MEDV")
```
我们需要指定使用`houseDataset`作为数据,并将“MEDV”作为要预测的列。
5. **定义模型元数据**:
```swift
let regressorMetadata = MLModelMetadata(author: "Paris B-A", shortDescription: "A regressor for house prices.", version: "1.0")
```
6. **保存CoreML .mlmodel文件**:
```swift
let modelPath = "/Users/parisba/ORM Projects/Practical AI with Swift 1st Edition/PAISw1StEdCode/Regressor/Housing.mlmodel"
try priceRegressor.write(to: URL(fileURLWithPath: modelPath), metadata: regressorMetadata)
```
运行Playground,即可在指定位置看到新的CoreML .mlmodel文件。
CreateML提供的MLRegressor的一个很棒的特性是,它会根据数据选择合适的回归器类型,支持以下几种类型:
- MLLinearRegressor:将目标估计为特征的线性函数
- MLDecisionTreeRegressor:通过学习规则来分割数据以估计目标
- MLRandomForestRegressor:通过在数据子集上创建一组决策树(森林)来估计目标
- MLBoostedTreeRegressor:使用决策树和梯度提升来估计目标
在我们的训练中,MLRegressor选择了MLBoostedTreeRegressor。
此外,苹果的Turi Create Python框架也支持创建回归器,步骤如下:
```python
import turicreate as tc
data = tc.SFrame('/Users/parisba/ORM Projects/Practical AI with Swift 1st Edition/PAISw1StEdCode/Regressor/housing.csv')
model = tc.regression.create(data, target='MEDV', features=['RM', 'LSTAT', 'PTRATIO'])
model.save('TuriHouseRegressor')
```
你可以在另一个Python脚本中加载该模型并进行预测和评估:
```python
import turicreate as tc
data = tc.SFrame('/Users/parisba/ORM Projects/Practical AI with Swift 1st Edition/PAISw1StEdCode/Regressor/housing.csv')
model = tc.load_model('TuriHouseRegressor')
predictions = model.predict(data)
results = model.eva
```
0
0
复制全文
相关推荐









