Megosztás a következőn keresztül:


Adatok betöltése fájlokból és más forrásokból

Megtudhatja, hogyan tölthet be adatokat ML.NET feldolgozáshoz és betanításhoz az API használatával. Az adatok eredetileg fájlokban vagy más adatforrásokban, például adatbázisokban, JSON-ban, XML-ben vagy memóriabeli gyűjteményekben vannak tárolva.

Ha a Model Buildert használja, olvassa el a Betanítási adatok betöltése a Model Builderbe című témakört.

Az adatmodell létrehozása

ML.NET lehetővé teszi az adatmodellek osztályokon keresztüli meghatározását. Például a következő bemeneti adatok alapján:

Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
700, 100000, 3000000, 250000, 500000
1000, 600000, 400000, 650000, 700000

Hozzon létre egy adatmodellt, amely a következő kódrészletet jelöli:

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; }
}

Az adatmodell jegyzetelése oszlopattribútumokkal

Az attribútumok további információkat nyújtanak ML.NET az adatmodellről és az adatforrásról.

Az LoadColumn attribútum megadja a tulajdonságok oszlopindexeit.

Fontos

LoadColumn csak akkor szükséges, ha adatokat tölt be egy fájlból.

Oszlopok betöltése a következő módon:

  • Az egyes oszlopok, például Size az osztályban és CurrentPrices az HousingData osztályban.
  • Egyszerre több oszlop vektor formájában, például HistoricalPrices az HousingData osztályban.

Ha vektortulajdonságsal rendelkezik, alkalmazza az VectorType attribútumot az adatmodell tulajdonságára. A vektor minden elemének azonos típusúnak kell lennie. Az oszlopok elkülönítése lehetővé teszi a funkciófejlesztés egyszerűségét és rugalmasságát, de sok oszlop esetében az egyes oszlopokon végzett munka hatással van a betanítási sebességre.

ML.NET oszlopneveken keresztül működik. Ha egy oszlop nevét a tulajdonságnéven kívül másra szeretné módosítani, használja az ColumnName attribútumot. Memóriabeli objektumok létrehozásakor továbbra is a tulajdonságnév használatával hozhat létre objektumokat. Az adatfeldolgozáshoz és a gépi tanulási modellek létrehozásához azonban ML.NET felülbírálja és hivatkozik a tulajdonságra az ColumnName attribútumban megadott értékkel.

Adatok betöltése egyetlen fájlból

Ha adatokat szeretne betölteni egy fájlból, használja a LoadFromTextFile metódust a betöltendő adatok adatmodelljével. Mivel separatorChar a paraméter alapértelmezés szerint tabulátorral tagolt, szükség szerint módosítsa az adatfájlhoz. Ha a fájl fejléccel rendelkezik, állítsa a hasHeader paramétert úgy, hogy true figyelmen kívül hagyja a fájl első sorát, és kezdje el betölteni az adatokat a második sorból.

//Create MLContext
MLContext mlContext = new MLContext();

//Load Data
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("my-data-file.csv", separatorChar: ',', hasHeader: true);

Adatok betöltése több fájlból

Abban az esetben, ha az adatok több fájlban vannak tárolva, mindaddig, amíg az adatséma megegyezik, ML.NET lehetővé teszi az adatok betöltését több fájlból, amelyek ugyanabban a könyvtárban vagy több könyvtárban találhatók.

Betöltés egyetlen könyvtárban lévő fájlokból

Ha az összes adatfájl ugyanabban a könyvtárban található, használjon helyettesítő karaktereket a LoadFromTextFile metódusban.

//Create MLContext
MLContext mlContext = new MLContext();

//Load Data File
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("Data/*", separatorChar: ',', hasHeader: true);

Betöltés több könyvtárban lévő fájlokból

Ha több könyvtárból szeretne adatokat betölteni, a CreateTextLoader metódussal hozzon létre egy TextLoader. Ezután használja a metódust TextLoader.Load , és adja meg az egyes fájlelérési utakat (helyettesítő karakterek nem használhatók).

//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");

Adatok betöltése relációs adatbázisból

ML.NET támogatja az adatok betöltését az SQL Server, az Azure SQL Database, az Oracle, az SQLite, a PostgreSQL, a Progress, az IBM DB2 és sok más által System.Data támogatott relációs adatbázisból.

Feljegyzés

A használatához DatabaseLoaderhivatkozzon a System.Data.SqlClient NuGet-csomagra.

Adott egy adatbázis nevesített táblával House és a következő sémával:

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])
);

Az adatokat egy osztály modellezheti, például HouseData:

public class HouseData
{
    public float Size { get; set; }
    public float NumBed { get; set; }
    public float Price { get; set; }
}

Ezután az alkalmazáson belül hozzon létre egy DatabaseLoader.

MLContext mlContext = new MLContext();

DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<HouseData>();

Adja meg a kapcsolati sztring, valamint az adatbázison végrehajtandó SQL-parancsot, és hozzon létre egy példánytDatabaseSource. Ez a minta egy LocalDB SQL Server-adatbázist használ egy fájl elérési útjával. A DatabaseLoader azonban minden más érvényes kapcsolati sztring támogat a helyszíni és a felhőbeli adatbázisokhoz.

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);

A nem típusú Real numerikus adatokat konvertálni Realkell . A Real típus egy pontosságú lebegőpontos értékként vagy SingleML.NET algoritmusok által várt bemeneti típusként jelenik meg. Ebben a mintában az Size oszlopok egész NumBed számok az adatbázisban. A beépített függvény használatával a CAST rendszer átalakítja Real. Mivel a Price tulajdonság már típusos Real, a rendszer betölti, ahogy van.

Load A metódus használatával töltse be az adatokat egy IDataView.

IDataView data = loader.Load(dbSource);

Képek betöltése

A képadatok könyvtárból való betöltéséhez először hozzon létre egy modellt, amely tartalmazza a kép elérési útját és egy címkét. ImagePath az adatforrás könyvtárában lévő kép abszolút elérési útja. Label a tényleges képfájl osztálya vagy kategóriája.

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
        };
    }
}

Ezután töltse be a képet:

IEnumerable<ImageData> images = LoadImagesFromDirectory(
                folder: "your-image-directory-path",
                useFolderNameAsLabel: true
                );

A memóriában lévő nyers lemezképek könyvtárból való betöltéséhez hozzon létre egy modellt a nyers kép bájttömbjének és címkéjének tárolásához:

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
        };

    }
}

Adatok betöltése más forrásokból

A fájlokban tárolt adatok betöltése mellett ML.NET támogatja az adatok betöltését olyan forrásokból, amelyek a következőket tartalmazzák:

  • Memóriabeli gyűjtemények
  • JSON/XML

A streamelési források használatakor a ML.NET a bemeneti adatok memórián belüli gyűjtemény formájában fognak működni. Ezért amikor olyan forrásokkal dolgozik, mint a JSON/XML, ügyeljen arra, hogy az adatokat memórián belüli gyűjteménybe formázza.

A következő memóriabeli gyűjteményre tekintettel:

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
    }
};

Töltse be a memóriabeli gyűjteményt egy IDataView metódusba LoadFromEnumerable :

Fontos

LoadFromEnumerable feltételezi, hogy a IEnumerable terhelés szálbiztos.

// Create MLContext
MLContext mlContext = new MLContext();

//Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(inMemoryCollection);

Következő lépések