Gegevens laden uit bestanden en andere bronnen
Meer informatie over het laden van gegevens in ML.NET voor verwerking en training met behulp van de API. De gegevens worden oorspronkelijk opgeslagen in bestanden of andere gegevensbronnen, zoals databases, JSON, XML of in-memory verzamelingen.
Als u Model Builder gebruikt, raadpleegt u Trainingsgegevens laden in Model Builder.
Het gegevensmodel maken
ML.NET kunt u gegevensmodellen definiëren via klassen. Bijvoorbeeld op basis van de volgende invoergegevens:
Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
700, 100000, 3000000, 250000, 500000
1000, 600000, 400000, 650000, 700000
Maak een gegevensmodel dat het volgende codefragment vertegenwoordigt:
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; }
}
Aantekeningen toevoegen aan het gegevensmodel met kolomkenmerken
Kenmerken geven ML.NET meer informatie over het gegevensmodel en de gegevensbron.
Het LoadColumn
kenmerk geeft de kolomindexen van uw eigenschappen op.
Belangrijk
LoadColumn
is alleen vereist bij het laden van gegevens uit een bestand.
Kolommen laden als:
- Afzonderlijke kolommen, zoals
Size
enCurrentPrices
in deHousingData
klas. - Meerdere kolommen tegelijk in de vorm van een vector, zoals
HistoricalPrices
in deHousingData
klasse.
Als u een vectoreigenschap hebt, past u het VectorType
kenmerk toe op de eigenschap in uw gegevensmodel. Alle elementen in de vector moeten hetzelfde type zijn. Door de kolommen gescheiden te houden, kunnen functies gemakkelijker en flexibel worden gemaakt, maar voor een groot aantal kolommen zorgt het gebruik van de afzonderlijke kolommen voor een impact op de trainingssnelheid.
ML.NET werkt via kolomnamen. Als u de naam van een kolom wilt wijzigen in iets anders dan de eigenschapsnaam, gebruikt u het ColumnName
kenmerk. Wanneer u in-memory objecten maakt, maakt u nog steeds objecten met behulp van de naam van de eigenschap. Voor gegevensverwerking en het bouwen van machine learning-modellen ML.NET echter overschrijven en verwijst naar de eigenschap met de waarde die in het ColumnName
kenmerk is opgegeven.
Gegevens laden uit één bestand
Als u gegevens uit een bestand wilt laden, gebruikt u de LoadFromTextFile
methode met het gegevensmodel om de gegevens te laden. Aangezien separatorChar
de parameter standaard door tabs wordt gescheiden, wijzigt u deze indien nodig voor uw gegevensbestand. Als uw bestand een header heeft, stelt u de hasHeader
parameter in om true
de eerste regel in het bestand te negeren en begint u met het laden van gegevens vanaf de tweede regel.
//Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("my-data-file.csv", separatorChar: ',', hasHeader: true);
Gegevens uit meerdere bestanden laden
In het geval dat uw gegevens worden opgeslagen in meerdere bestanden, zolang het gegevensschema hetzelfde is, ML.NET kunt u gegevens laden uit meerdere bestanden die zich in dezelfde map of meerdere mappen bevinden.
Laden vanuit bestanden in één map
Wanneer al uw gegevensbestanden zich in dezelfde map bevinden, gebruikt u jokertekens in de LoadFromTextFile
methode.
//Create MLContext
MLContext mlContext = new MLContext();
//Load Data File
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("Data/*", separatorChar: ',', hasHeader: true);
Laden vanuit bestanden in meerdere mappen
Als u gegevens uit meerdere mappen wilt laden, gebruikt u de CreateTextLoader
methode om een TextLoader
. Gebruik vervolgens de TextLoader.Load
methode en geef de afzonderlijke bestandspaden op (jokertekens kunnen niet worden gebruikt).
//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");
Gegevens laden uit een relationele database
ML.NET ondersteunt het laden van gegevens uit verschillende relationele databases die worden ondersteund door System.Data
SQL Server, Azure SQL Database, Oracle, SQLite, PostgreSQL, Progress, IBM DB2 en nog veel meer.
Notitie
Raadpleeg het NuGet-pakket System.Data.SqlClient om te gebruikenDatabaseLoader
.
Gegeven een database met een tabel met de naam House
en het volgende schema:
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])
);
De gegevens kunnen worden gemodelleerd door een klasse zoals HouseData
:
public class HouseData
{
public float Size { get; set; }
public float NumBed { get; set; }
public float Price { get; set; }
}
Maak vervolgens in uw toepassing een DatabaseLoader
.
MLContext mlContext = new MLContext();
DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<HouseData>();
Definieer uw verbindingsreeks en de SQL-opdracht die moet worden uitgevoerd op de database en maak een DatabaseSource
exemplaar. In dit voorbeeld wordt een LocalDB SQL Server-database met een bestandspad gebruikt. DatabaseLoader ondersteunt echter alle andere geldige verbindingsreeks voor on-premises databases en in de cloud.
Belangrijk
Microsoft raadt u aan de veiligste verificatiestroom te gebruiken die beschikbaar is. Als u verbinding maakt met Azure SQL, is Managed Identities voor Azure-resources de aanbevolen verificatiemethode.
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);
Numerieke gegevens die niet van het type Real
zijn, moeten worden geconverteerd naar Real
. Het Real
type wordt weergegeven als een drijvendekommawaarde met één precisie of Single
, het invoertype dat wordt verwacht door ML.NET algoritmen. In dit voorbeeld zijn de Size
en NumBed
kolommen gehele getallen in de database. Met behulp van de CAST
ingebouwde functie wordt deze geconverteerd naar Real
. Omdat de Price
eigenschap al van het type Real
is, wordt deze net zo geladen.
Gebruik de Load
methode om de gegevens in een IDataView
.
IDataView data = loader.Load(dbSource);
Afbeeldingen laden
Als u afbeeldingsgegevens uit een map wilt laden, maakt u eerst een model dat het pad naar de installatiekopieën en een label bevat. ImagePath
is het absolute pad van de afbeelding in de gegevensbronmap. Label
is de klasse of categorie van het werkelijke afbeeldingsbestand.
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
};
}
}
Laad vervolgens de installatiekopieën:
IEnumerable<ImageData> images = LoadImagesFromDirectory(
folder: "your-image-directory-path",
useFolderNameAsLabel: true
);
Als u onbewerkte afbeeldingen uit de map in het geheugen wilt laden, maakt u een model voor het opslaan van de bytematrix en het label voor onbewerkte afbeeldingen:
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
};
}
}
Gegevens laden uit andere bronnen
Naast het laden van gegevens die zijn opgeslagen in bestanden, biedt ML.NET ondersteuning voor het laden van gegevens uit bronnen, waaronder:
- Verzamelingen in het geheugen
- JSON/XML
Wanneer u met streamingbronnen werkt, verwacht ML.NET dat invoer de vorm heeft van een in-memory verzameling. Zorg er daarom voor dat u bij het werken met bronnen zoals JSON/XML de gegevens opmaakt in een in-memory verzameling.
Gegeven de volgende in-memory verzameling:
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
}
};
Laad de in-memory verzameling in een IDataView
met de LoadFromEnumerable
methode:
Belangrijk
LoadFromEnumerable
wordt ervan uitgegaan dat de waaruit het IEnumerable
wordt geladen thread-safe is.
// Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(inMemoryCollection);
Volgende stappen
- Als u gegevens wilt opschonen of anderszins wilt verwerken, raadpleegt u Gegevens voorbereiden voor het bouwen van een model.
- Als u klaar bent om een model te bouwen, raadpleegt u Een model trainen en evalueren.