Загрузка данных из файлов и других источников
Узнайте, как загружать данные для обработки и обучения в ML.NET с помощью интерфейса API. Изначально данные хранились в файлах или других источниках данных, таких как базы данных, JSON, XML или коллекции в памяти.
Если вы используете построитель моделей, см. руководство по загрузке обучающих данных в построитель моделей.
Создание модели данных
ML.NET позволяет определять модели данных с помощью классов. Допустим, у нас есть следующие входные данные:
Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
700, 100000, 3000000, 250000, 500000
1000, 600000, 400000, 650000, 700000
Создадим модель данных как в следующем фрагменте кода:
public class HousingData
{
[LoadColumn(0)]
public float Size { get; set; }
[LoadColumn(1, 3)]
[VectorType(3)]
public float[] HistoricalPrices { get; set; }
[LoadColumn(4)]
[ColumnName("Label")]
public float CurrentPrice { get; set; }
}
Заметите модель данных с атрибутами столбцов
Атрибуты предоставляют ML.NET дополнительные сведения о модели и источнике данных.
Атрибут LoadColumn
определяет индексы столбцов свойств.
Внимание
LoadColumn
требуется только при загрузке данных из файла.
Загрузите столбцы как:
- Отдельные столбцы, например
Size
иCurrentPrices
в классеHousingData
. - Несколько столбцов за раз в виде вектора, например
HistoricalPrices
в классеHousingData
.
Если у вас есть свойство вектора, примените атрибут VectorType
к этому свойству в модели данных. Следует отметить, что все элементы в векторе должны быть одного типа. Хранение разделенных столбцов позволяет упростить и облегчить проектирование признаков, но в случае большого количества столбцов работа с отдельными столбцами отрицательно влияет на скорость обучения.
ML.NET работает с именами столбцов. Если вы хотите изменить имя столбца, чтобы оно отличалось от имени свойства, используйте атрибут ColumnName
. При создании объектов в памяти тоже можно создавать объекты, используя имя свойства. Однако для обработки данных и создания моделей машинного обучения ML.NET переопределяет свойство со значением, указанным в атрибуте ColumnName
и ссылается на него.
Загрузка данных из отдельного файла
Для загрузки данных из файла используйте метод LoadFromTextFile
с моделью данных для загружаемых данных. Поскольку параметр separatorChar
по умолчанию разделяется знаками табуляции, измените его, если нужно для файла данных. Если в файле есть заголовок, присвойте параметру hasHeader
значение true
, чтобы игнорировать первую строку в файле и начать загрузку данных со второй строки.
//Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("my-data-file.csv", separatorChar: ',', hasHeader: true);
Загрузка данных из нескольких файлов
Если ваши данные хранятся в нескольких файлах с одинаковой схемой данных, в ML.NET можно загрузить данные из нескольких файлов, которые находятся в одном или нескольких каталогах.
Загрузка данных из файлов в одном каталоге
Если все файлы данных находятся в одном и том же каталоге, используйте в методе LoadFromTextFile
подстановочные знаки.
//Create MLContext
MLContext mlContext = new MLContext();
//Load Data File
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("Data/*", separatorChar: ',', hasHeader: true);
Загрузка из файлов в нескольких каталогах
Чтобы загрузить данные из нескольких каталогов, с помощью метода CreateTextLoader
создайте TextLoader
. Затем с помощью метода TextLoader.Load
укажите пути к отдельным файлам (подстановочные знаки использовать нельзя).
//Create MLContext
MLContext mlContext = new MLContext();
// Create TextLoader
TextLoader textLoader = mlContext.Data.CreateTextLoader<HousingData>(separatorChar: ',', hasHeader: true);
// Load Data
IDataView data = textLoader.Load("DataFolder/SubFolder1/1.txt", "DataFolder/SubFolder2/1.txt");
Загрузка данных из реляционной базы данных
ML.NET поддерживает загрузку данных из различных реляционных баз данных , поддерживаемых System.Data
, включая SQL Server, базу данных SQL Azure, Oracle, SQLite, PostgreSQL, Progress, IBM DB2 и многие другие.
Примечание.
Чтобы использовать DatabaseLoader
, необходимо сослаться на пакет NuGet System.Data.SqlClient.
Имеется база данных с таблицей House
и следующей схемой:
CREATE TABLE [House] (
[HouseId] INT NOT NULL IDENTITY,
[Size] INT NOT NULL,
[NumBed] INT NOT NULL,
[Price] REAL NOT NULL
CONSTRAINT [PK_House] PRIMARY KEY ([HouseId])
);
Можно моделировать данные с помощью класса, например HouseData
.
public class HouseData
{
public float Size { get; set; }
public float NumBed { get; set; }
public float Price { get; set; }
}
Затем в приложении создайте DatabaseLoader
.
MLContext mlContext = new MLContext();
DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<HouseData>();
Определите строку подключения, а также команду SQL для выполнения в базе данных и создайте экземпляр DatabaseSource
. В этом примере используется база данных LocalDB SQL Server с путем к файлу. Однако DatabaseLoader поддерживает любые другие допустимые строки подключения для баз данных в локальной среде и в облаке.
string connectionString = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=<YOUR-DB-FILEPATH>;Database=<YOUR-DB-NAME>;Integrated Security=True;Connect Timeout=30";
string sqlCommand = "SELECT CAST(Size as REAL) as Size, CAST(NumBed as REAL) as NumBed, Price FROM House";
DatabaseSource dbSource = new DatabaseSource(SqlClientFactory.Instance, connectionString, sqlCommand);
Числовые данные, не являющиеся типами Real
, необходимо преобразовать в Real
. Тип Real
представлен значением с плавающей запятой одиночной точности или Single
(тип входных данных, ожидаемый алгоритмами ML.NET). В этом примере столбцы Size
и NumBed
являются целыми числами в базе данных. С помощью встроенной функции CAST
выполняется преобразование в Real
. Так как свойство Price
уже имеет тип Real
, оно загружается как есть.
Используйте метод Load
для загрузки данных в IDataView
.
IDataView data = loader.Load(dbSource);
Загрузка данных из других источников
Помимо загрузки данных, хранящихся в файлах, ML.NET позволяет загружать данные из таких источников, как, помимо прочего:
- Коллекции оперативной памяти
- располагаться в коде JSON или XML;
Обратите внимание на то, что при работе с источниками потоковой передачи данных ML.NET ожидает получить данные в виде коллекции в памяти. Это значит, что при работе с такими источниками, как JSON/XML, данные должны быть переведены в формат коллекции в памяти.
Допустим, у нас есть следующая коллекция в памяти:
HousingData[] inMemoryCollection = new HousingData[]
{
new HousingData
{
Size =700f,
HistoricalPrices = new float[]
{
100000f, 3000000f, 250000f
},
CurrentPrice = 500000f
},
new HousingData
{
Size =1000f,
HistoricalPrices = new float[]
{
600000f, 400000f, 650000f
},
CurrentPrice=700000f
}
};
Загрузите эту коллекцию в памяти в IDataView
с помощью метода LoadFromEnumerable
:
Внимание
LoadFromEnumerable
предполагает, что IEnumerable
, откуда он загружается, является потокобезопасным.
// Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(inMemoryCollection);
Следующие шаги
- Сведения об очистке или иной обработке данных см. в статье Подготовка данных для построения модели.
- Когда вы будете готовы к созданию модели, обратитесь к статье Обучение и оценка модели.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по