swift - 为什么 MLLinearRegressor 每次都返回相同的预测?
问题描述
我正在从事一个涉及 CreateML 和 MLLinearRegressor 的项目。出于某种原因,每当我尝试预测训练数据中不存在的值时,每次都会得到相同的预测。这在 Swift Playgrounds 和在 Xcode 项目中使用模型时都会发生。为什么会发生这种情况?我在下面发布了我的 Swift Playgrounds 代码。
import CreateML
import CoreML
import Foundation
do {
let data: [String: MLDataValueConvertible] = [
"Processor Name": ["A6", "A7", "A8", "A8X", "A9", "A9X", "A10X", "A10X", "A11"],
"Geekbench Singlecore": [754, 1325, 1660, 1796, 2522, 3052, 3463, 3909, 4219]
]
let CPURegressor = try MLLinearRegressor(trainingData: MLDataTable(dictionary: data), targetColumn: "Geekbench Singlecore", featureColumns: ["Processor Name"])
let testData: [String: MLDataValueConvertible] = [
"Processor Name": ["A6", "A7", "A8", "A8X", "A9", "A9X", "A10X", "A10X", "A11", "A12"],
"Geekbench Singlecore": [754, 1325, 1660, 1796, 2522, 3052, 3463, 3909, 4219,0]
]
print(try CPURegressor.predictions(from: MLDataTable(dictionary: testData))) // Notice how last (A12) and first (A6) values are the same
} catch {
print(error)
}
Processor Name
更新:这是调整类别后我的代码的样子
import CreateML
import CoreML
import Foundation
do {
let data: [String: MLDataValueConvertible] = [
"Processor Name": [6.0, 7.0, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0],
"Geekbench Singlecore": [754, 1325, 1660, 1796, 2522, 3052, 3463, 3909, 4219]
]
print(try MLDataTable(dictionary: data))
let CPURegressor = try MLRegressor(trainingData: MLDataTable(dictionary: data), targetColumn: "Geekbench Singlecore", featureColumns: ["Processor Name"])/*, parameters: MLBoostedTreeRegressor.ModelParameters(validationData: nil, maxDepth: 1000,
maxIterations: 1000,
minLossReduction: 1))*/
/*CPURegressor.modelParameters = MLImageClassifier.ModelParameters(featureExtractor: .scenePrint(revision: 1),
validationData: nil,
maxIterations: 30,
augmentationOptions: [])*/
/* let testData: [String: MLDataValueConvertible] = [
"Processor Name": [0, 1, 2, 3, 4, 5, 6, 7, 8, 14],
"Geekbench Singlecore": [1325, 1660, 1796, 2522, 3052, 3463, 3909, 4219,0, 1325]
]
print(try CPURegressor.predictions(from: MLDataTable(dictionary: testData))) // Notice how last (A12) and first (A6) values are the same*/
} catch {
print(error)
}
解决方案
线性回归计算给定输入值的输出值,两者都必须是数字。但是您的输入值不是数字,它们是字符串。那么线性回归是如何知道"A12"
与所有其他输入值进行比较的呢?
对于人类来说,A12 在 A11 之后是有道理的,但由于这些不是数字,线性回归需要以某种方式将它们转换为数字,但没有办法告诉它如何做到这一点。所以不可能说 A12 在“数字线”上的位置(或任何其他处理器在该线上的位置)。
换句话说,您使用分类值作为线性回归的输入,而线性回归只能处理实值输入。
尝试替换"Processor Name"
为[0, 1, 2, 3, 4, 5, 6, 7, 8]
。然后询问 的预测9
,这将是 A12 处理器。(并不是说这样做一定有任何意义,因为这假设每一代处理器之间的差异是 1,但这意味着什么?)
此外,您A10X
的数据中有两次。
推荐阅读
- tensorflow - 无法使用 BatchNorm 层导入冻结图
- c# - 我无法并排更新两个 Excel 文件
- docker - 在 docker 中启动 clickhouse-server 失败并出现 Poco 错误
- python - 如何让 pylint 报告未使用的返回值
- performance - Locust 负载测试术语与 Apache Bench
- python-3.x - 如何在 Anaconda 上下载 lmfit?
- spring-boot - 如何使用 Spring Boot Redis 获取对象空闲时间
- r - R:如何制作跨多列的条形图
- delphi - TDateTimePicker 中的另一个错误?
- javascript - jQuery - 需要添加 setTimeout 函数将每 5 秒运行一次以检查是否定义了 jQuery,最多 1 分钟