Abstract :
Xcode теперь предоставляет фреймворк под названием CreateML
, который предлагает функции обучения машинному обучению. Его можно использовать только в файле .playground
.
Проблема :
Мой рабочий процесс страдает, потому что мне нужно вручную переписать значения Dynami c в playground
, а затем снова в моем проекте Xcode
.
Цель:
Автоматическое создание файла игровой площадки и соответствующего кода обработки mlmodel в моем проекте, так что мне не нужно вручную вносить изменения в несколько проектов
ИЛИ
, чтобы включить файл игровой площадки в мою MacOS проекта и мои файлы .swift
общаются с моим файлом .playground
.
Текущая неудачная попытка:
- Когда я пытаюсь чтобы автоматически создать файл игровой площадки, я не могу его открыть. Я попробовал дважды щелкнуть по нему. Я попытался перетащить его в Xcode. Я попытался щелкнуть правой кнопкой мыши и
open with
, но Xcode не подходил. Я получаю сообщение об ошибке.
введите описание изображения здесь
OR
- Когда я пытаюсь добавить файл игровой площадки в свой проект. Я могу запустить только файл игровой площадки или только свой проект, я не могу понять, как заставить файл
.playground
взаимодействовать с .swift
.
код:
public struct LogEntry: Error {
var text: StaticString
var type: OSLogType
var argument: Any?
var osLog = customLog
init(text: StaticString, argument: Any? = nil, type: OSLogType = .error, osLog: OSLog = customLog) {
self.text = text
self.type = type
self.osLog = osLog
self.argument = argument
}
func log() {
os_log(text , log: osLog, type: type, String(describing: argument))
print(String(describing: argument))
}
}
postfix operator *
extension Result where Failure == LogEntry {
@discardableResult
static postfix func *(expression: Self) -> Success? {
switch expression {
case .success(let win):
return win
case .failure(let fail):
print(fail.localizedDescription)
print(fail.text)
print(fail.argument)
return nil
}
}
}
extension String {
static func mlplaygroundcode(
_ csvaddy: String,
target: String,
modelname: String
) -> String {
"""
import Cocoa
import CreateML
guard let stockCSV = URL(string: "\(csvaddy)") else { fatalError() }
let stockData = try MLDataTable(contentsOf: stockCSV)
let (trainingData, testData) = stockData.randomSplit(by: 0.8, seed: 0)
let model = try MLRegressor(trainingData: stockData, targetColumn: "\(target)")
let metrics = model.evaluation(on: testData)
let predictions = try model.predictions(from: testData)
try model.write(to: URL(fileURLWithPath: "/Users/\(NSUserName())/Desktop/iOS/TimeFountain/TimeFountain/\(modelname).mlmodel"), metadata: nil)
"""
}
/// Creates a csv for ml string. self is the csv address.
/// - Parameters:
/// - csvaddy: The address of the csv
/// - target: the target column header text
/// - modelname:
/// - Returns: Returns the playground address.
func generateMLPlayground(
target: String = .target,
finalmodelname: String,
playgroundName: String
) -> Result<String, LogEntry> {
String.mlplaygroundcode(
self,
target: target,
modelname: finalmodelname
).createFile(
desktopPath: "iOS/TimeFountain/TimeFountain/",
name: playgroundName, //"tesst",
fileEnding: "playground"
)
}
/// creates a file locally.
/// - Parameters:
/// - desktopPath: Starts without a slash, ends with a slash. Assumes the path starts after the desktop path is established. alt: "iOS/TimeFountain/TimeFountain/"
/// - name: Pass a name ie. ticker + .currentDate
/// - fileEnding: File ending such as csv or playground. The period is not required.
/// - Returns: returns a discardeable Resullt to account for multiple possible errors.
@discardableResult internal func createFile(
desktopPath: String = "iOS/DataFrame/",
name: String,
fileEnding: String
) -> Result<String, LogEntry> {
let fileManager = FileManager.default
var fileURL: URL?
do {
let path = try fileManager.url(
for: .desktopDirectory,
in: .allDomainsMask,
appropriateFor: nil,
create: false
)
fileURL = path.appendingPathComponent(desktopPath + name + "." + fileEnding)
guard let fileURL = fileURL else {
return Result(failure: LogEntry(text: "ERROR: did Not Assign File URL"))
}
try write(
to: fileURL,
atomically: true,
encoding: .utf8
)
} catch let error {
print("error creating file", error.localizedDescription)
return Result(failure: LogEntry(text: "ERROR: error creating file"))
}
guard let url = fileURL else {
return Result(failure: LogEntry(text: "ERROR: did Not Assign File URL"))
}
print(url.absoluteString)
return Result(success: url.absoluteString)
}
}
print(
trainData.csvAddress.generateMLPlayground(
finalmodelname: "TestMe",
playgroundName: "TestMea"
)*
)