Я пытаюсь создать приложение, которое предсказывает время приема лекарства в зависимости от образа жизни пользователя и ограничений лекарства.
Я имею в виду:
От пациента я получаю такую информацию, как:
• Сколько раз и когда он / она ест свою пищу
• Когда он / она просыпается иуснуть
• Сколько таблеток он / она должен принять
Из-за ограничений лекарства:
• Нужно ли принимать лекарства натощак
• Нужно ли принимать лекарства? быть съеденным с / без еды
• Нужно ли пациенту сделать перерыв между приемом пищи и приемом лекарств (пока это не показано на экране ниже)
• и т. д.
Пример набора данных:
https://ibb.co/Gvry945
Какой тип модели / механики / алгоритма мне следует использовать, чтобы предсказать время приема лекарства? Правильна ли регрессия? Мне нужно прогнозировать 1,2,3,4, иногда 5 столбцов.
Я написал простой код, основанный на:
https://docs.microsoft.com/pl-pl/dotnet/machine-learning/tutorials/predict-prices
Как прогнозировать несколько меток с помощьюML.NET с помощью задачи регрессии?
Работает нормально, и я могу предсказать более 1 столбца. Но все же моя проблема - пустые клетки. Когда я пытаюсь что-то предсказать из этих данных, оно всегда показывает неправильное значение и работает нормально только тогда, когда все ячейки заполнены.
Итак, должен ли я распределить свой набор данных на несколько меньших наборов данных (где всеклетки в комплекте)? Пример:
https://ibb.co/m8HVPvb
Когда я только предсказываю TimeToTakeMedicine1
https://ibb.co/qNk9xQL
Когда я предсказываю TimeToTakeMedicine1 и TimeToTakeMedicine2
https://ibb.co/GnRc1c0
Когда я прогнозирую TimeToTakeMedicine1, TimeToTakeMedicine2, TimeToTakeMedicine3 и т. Д.
Есть ли более простой и лучший способ решить эту проблему?
Рабочий код дляпредсказать TimeToTakeMedicine1, TimeToTakeMedicine2, TimeToTakeMedicine3 (для упрощения я избавился от OnEmptyStomach, WithMeal и IsPossible)
using System;
using System.IO;
using Microsoft.ML;
using Microsoft.ML.Trainers;
namespace NextTry
{
class Program
{
static readonly string _trainDataPath = Path.Combine(Environment.CurrentDirectory, "DataFolder", "DataForPredictT1T2T3.csv");
static void Main(string[] args)
{
MLContext mlContext = new MLContext(seed: 0);
var model = Train(mlContext, _trainDataPath);
TestSinglePrediction(mlContext, model);
}
public static ITransformer Train(MLContext mlContext, string dataPath)
{
IDataView dataView = mlContext.Data.LoadFromTextFile<Medicine>(dataPath, hasHeader: true, separatorChar: ',');
var pipelineForMeal1 = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "TimeToTakeMedicine1")
.Append(mlContext.Transforms.Concatenate("Features", "MealTime1", "MealTime2", "MealTime3", "MealCount", "ActivityHoursWakeUp", "ActivityHoursSleep", "PillsCount"))
.Append(mlContext.Regression.Trainers.FastTree())
.Append(mlContext.Transforms.CopyColumns(outputColumnName: "timeToTakeMedicine1", inputColumnName: "Score"));
var pipelineForMeal2 = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "TimeToTakeMedicine2")
.Append(mlContext.Transforms.Concatenate("Features", "MealTime1", "MealTime2", "MealTime3", "MealCount", "ActivityHoursWakeUp", "ActivityHoursSleep", "PillsCount"))
.Append(mlContext.Regression.Trainers.FastTree())
.Append(mlContext.Transforms.CopyColumns(outputColumnName: "timeToTakeMedicine2", inputColumnName: "Score"));
var pipelineForMeal3 = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "TimeToTakeMedicine3")
.Append(mlContext.Transforms.Concatenate("Features", "MealTime1", "MealTime2", "MealTime3", "MealCount", "ActivityHoursWakeUp", "ActivityHoursSleep", "PillsCount"))
.Append(mlContext.Regression.Trainers.FastTree())
.Append(mlContext.Transforms.CopyColumns(outputColumnName: "timeToTakeMedicine3", inputColumnName: "Score"));
var model = pipelineForMeal1
.Append(pipelineForMeal2)
.Append(pipelineForMeal3)
.Fit(dataView);
return model;
}
private static void TestSinglePrediction(MLContext mlContext, ITransformer model)
{
var predictionFunction = mlContext.Model.CreatePredictionEngine<Medicine, MedicineTimeTakeMedicinePrediction>(model);
var medicineSample = new Medicine()
{
MealTime1 = 6,
MealTime2 = 12,
MealTime3 = 22,
MealCount = 3,
PillsCount = 3
};
var prediction = predictionFunction.Predict(medicineSample);
Console.WriteLine($"Predicted TimeToTakePill: {prediction.TimeToTakeMedicine1:0.####} ");
Console.WriteLine($"Predicted TimeToTakePill: {prediction.TimeToTakeMedicine2:0.####}");
Console.WriteLine($"Predicted TimeToTakePill: {prediction.TimeToTakeMedicine3:0.####}");
Console.ReadKey();
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.ML.Data;
namespace NextTry
{
public class Medicine
{
[LoadColumn(0)]
public float MealTime1 { get; set; }
[LoadColumn(1)]
public float MealTime2 { get; set; }
[LoadColumn(2)]
public float MealTime3 { get; set; }
[LoadColumn(3)]
public float MealCount { get; set; }
[LoadColumn(4)]
public float ActivityHoursWakeUp { get; set; }
[LoadColumn(5)]
public float ActivityHoursSleep { get; set; }
[LoadColumn(6)]
public float PillsCount { get; set; }
[LoadColumn(7)]
public float TimeToTakeMedicine1 { get; set; }
[LoadColumn(8)]
public float TimeToTakeMedicine2 { get; set; }
[LoadColumn(9)]
public float TimeToTakeMedicine3 { get; set; }
}
public class MedicineTimeTakeMedicinePrediction
{
[ColumnName("timeToTakeMedicine1")]
public float TimeToTakeMedicine1 { get; set; }
[ColumnName("timeToTakeMedicine2")]
public float TimeToTakeMedicine2 { get; set; }
[ColumnName("timeToTakeMedicine3")]
public float TimeToTakeMedicine3 { get; set; }
}
}