Ładowanie danych z plików i innych źródeł
Dowiedz się, jak ładować dane do ML.NET na potrzeby przetwarzania i trenowania przy użyciu interfejsu API. Dane są pierwotnie przechowywane w plikach lub innych źródłach danych, takich jak bazy danych, dane JSON, XML lub kolekcje w pamięci.
Jeśli używasz narzędzia Model Builder, zobacz Ładowanie danych szkoleniowych do narzędzia Model Builder.
Tworzenie modelu danych
ML.NET umożliwia definiowanie modeli danych za pomocą klas. Na przykład biorąc pod uwagę następujące dane wejściowe:
Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
700, 100000, 3000000, 250000, 500000
1000, 600000, 400000, 650000, 700000
Utwórz model danych reprezentujący następujący fragment kodu:
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; }
}
Dodawanie adnotacji do modelu danych przy użyciu atrybutów kolumny
Atrybuty zapewniają ML.NET więcej informacji o modelu danych i źródle danych.
Atrybut LoadColumn
określa indeksy kolumn właściwości.
Ważne
LoadColumn
program jest wymagany tylko podczas ładowania danych z pliku.
Załaduj kolumny jako:
- Poszczególne kolumny, takie jak
Size
iCurrentPrices
wHousingData
klasie. - Wiele kolumn jednocześnie w postaci wektora, na przykład
HistoricalPrices
wHousingData
klasie.
Jeśli masz właściwość wektora, zastosuj VectorType
atrybut do właściwości w modelu danych. Wszystkie elementy w wektorze muszą być tego samego typu. Utrzymywanie rozdzielonych kolumn pozwala na łatwość i elastyczność inżynierii cech, ale w przypadku dużej liczby kolumn działanie na poszczególnych kolumnach powoduje wpływ na szybkość trenowania.
ML.NET działa za pomocą nazw kolumn. Jeśli chcesz zmienić nazwę kolumny na inną niż nazwa właściwości, użyj atrybutu ColumnName
. Podczas tworzenia obiektów w pamięci nadal tworzone są obiekty przy użyciu nazwy właściwości. Jednak w przypadku przetwarzania danych i tworzenia modeli uczenia maszynowego ML.NET przesłania i odwołuje się do właściwości z wartością podaną w atrybucie ColumnName
.
Ładowanie danych z pojedynczego pliku
Aby załadować dane z pliku, użyj LoadFromTextFile
metody z modelem danych do załadowania. Ponieważ separatorChar
parametr jest domyślnie rozdzielany tabulatorami, zmień go dla pliku danych zgodnie z potrzebami. Jeśli plik ma nagłówek, ustaw hasHeader
parametr , aby true
zignorować pierwszy wiersz w pliku i rozpocząć ładowanie danych z drugiego wiersza.
//Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("my-data-file.csv", separatorChar: ',', hasHeader: true);
Ładowanie danych z wielu plików
W przypadku, gdy dane są przechowywane w wielu plikach, o ile schemat danych jest taki sam, ML.NET umożliwia ładowanie danych z wielu plików, które znajdują się w tym samym katalogu lub wielu katalogach.
Ładowanie z plików w jednym katalogu
Gdy wszystkie pliki danych znajdują się w tym samym katalogu, użyj symboli wieloznacznych w metodzie LoadFromTextFile
.
//Create MLContext
MLContext mlContext = new MLContext();
//Load Data File
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("Data/*", separatorChar: ',', hasHeader: true);
Ładowanie z plików w wielu katalogach
Aby załadować dane z wielu katalogów, użyj CreateTextLoader
metody , aby utworzyć element TextLoader
. Następnie użyj TextLoader.Load
metody i określ poszczególne ścieżki plików (nie można używać symboli wieloznacznych).
//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");
Ładowanie danych z relacyjnej bazy danych
ML.NET obsługuje ładowanie danych z różnych relacyjnych baz danych obsługiwanych przez System.Data
, takich jak SQL Server, Azure SQL Database, Oracle, SQLite, PostgreSQL, Progress i IBM DB2.
Uwaga
Aby użyć polecenia DatabaseLoader
, odwołaj się do pakietu NuGet System.Data.SqlClient .
Nadaj bazie danych z tabelą o nazwie House
i następującym schematem:
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])
);
Dane można modelować według klasy, takiej jak HouseData
:
public class HouseData
{
public float Size { get; set; }
public float NumBed { get; set; }
public float Price { get; set; }
}
Następnie wewnątrz aplikacji utwórz element DatabaseLoader
.
MLContext mlContext = new MLContext();
DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<HouseData>();
Zdefiniuj parametry połączenia, a także polecenie SQL do wykonania w bazie danych i utwórz DatabaseSource
wystąpienie. W tym przykładzie użyto bazy danych Sql Server LocalDB ze ścieżką pliku. Jednak narzędzie DatabaseLoader obsługuje wszelkie inne prawidłowe parametry połączenia dla baz danych w środowisku lokalnym i w chmurze.
Ważne
Firma Microsoft zaleca korzystanie z najbezpieczniejszego dostępnego przepływu uwierzytelniania. Jeśli łączysz się z usługą Azure SQL, tożsamości zarządzane dla zasobów platformy Azure to zalecana metoda uwierzytelniania.
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);
Dane liczbowe, które nie są typu Real
, muszą być konwertowane na Real
. Typ Real
jest reprezentowany jako wartość zmiennoprzecinkowa o pojedynczej precyzji lub Single
typ wejściowy oczekiwany przez algorytmy ML.NET. W tym przykładzie kolumny Size
i NumBed
są liczbami całkowitymi w bazie danych. Za pomocą wbudowanej CAST
funkcji jest ona konwertowana na Real
. Ponieważ właściwość Price
jest już typu Real
, jest wczytywana jako as-is.
Load
Użyj metody , aby załadować dane do obiektu IDataView
.
IDataView data = loader.Load(dbSource);
Ładowanie obrazów
Aby załadować dane obrazu z katalogu, najpierw utwórz model zawierający ścieżkę obrazu i etykietę.
ImagePath
jest ścieżką bezwzględną obrazu w katalogu źródła danych.
Label
jest klasą lub kategorią rzeczywistego pliku obrazu.
public class ImageData
{
[LoadColumn(0)]
public string ImagePath;
[LoadColumn(1)]
public string Label;
}
public static IEnumerable<ImageData> LoadImagesFromDirectory(string folder,
bool useFolderNameAsLabel = true)
{
string[] files = Directory.GetFiles(folder, "*", searchOption: SearchOption.AllDirectories);
foreach (string file in files)
{
if (Path.GetExtension(file) != ".jpg")
continue;
string label = Path.GetFileName(file);
if (useFolderNameAsLabel)
label = Directory.GetParent(file).Name;
else
{
for (int index = 0; index < label.Length; index++)
{
if (!char.IsLetter(label[index]))
{
label = label.Substring(0, index);
break;
}
}
}
yield return new ImageData()
{
ImagePath = file,
Label = label
};
}
}
Następnie załaduj obraz:
IEnumerable<ImageData> images = LoadImagesFromDirectory(
folder: "your-image-directory-path",
useFolderNameAsLabel: true
);
Aby załadować nieprzetworzone obrazy w pamięci z katalogu, utwórz model do przechowywania tablicy bajtów i etykiet nieprzetworzonych obrazów:
public class InMemoryImageData
{
[LoadColumn(0)]
public byte[] Image;
[LoadColumn(1)]
public string Label;
}
static IEnumerable<InMemoryImageData> LoadInMemoryImagesFromDirectory(
string folder,
bool useFolderNameAsLabel = true
)
{
string[] files = Directory.GetFiles(folder, "*",
searchOption: SearchOption.AllDirectories);
foreach (string file in files)
{
if (Path.GetExtension(file) != ".jpg")
continue;
string label = Path.GetFileName(file);
if (useFolderNameAsLabel)
label = Directory.GetParent(file).Name;
else
{
for (int index = 0; index < label.Length; index++)
{
if (!char.IsLetter(label[index]))
{
label = label.Substring(0, index);
break;
}
}
}
yield return new InMemoryImageData()
{
Image = File.ReadAllBytes(file),
Label = label
};
}
}
Ładowanie danych z innych źródeł
Oprócz ładowania danych przechowywanych w plikach ML.NET obsługuje ładowanie danych ze źródeł, które obejmują:
- Kolekcje w pamięci
- JSON/XML
Podczas pracy ze źródłami przesyłania strumieniowego ML.NET oczekuje, że dane wejściowe będą w postaci kolekcji w pamięci. W związku z tym podczas pracy ze źródłami, takimi jak JSON/XML, pamiętaj, aby sformatować dane w kolekcji w pamięci.
Biorąc pod uwagę następującą kolekcję w pamięci:
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
}
};
Załaduj kolekcję w pamięci do elementu IDataView
za pomocą LoadFromEnumerable
metody :
Ważne
LoadFromEnumerable
zakłada, że IEnumerable
obciążenie z niego jest bezpieczne wątkowo.
// Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(inMemoryCollection);
Następne kroki
- Aby wyczyścić lub przetworzyć dane, zobacz Przygotowywanie danych do tworzenia modelu.
- Gdy wszystko będzie gotowe do utworzenia modelu, zobacz Trenowanie i ocenianie modelu.