Memuat data dari file dan sumber lainnya
Pelajari cara memuat data ke ML.NET untuk pemrosesan dan pelatihan, menggunakan API. Data awalnya disimpan dalam file atau sumber data lain seperti database, JSON, XML, atau koleksi dalam memori.
Jika Anda menggunakan Model Builder, lihat Memuat data pelatihan ke dalam Model Builder.
Membuat model data
ML.NET memungkinkan Anda menentukan model data melalui kelas. Misalnya, mengingat data input berikut:
Size (Sq. ft.), HistoricalPrice1 ($), HistoricalPrice2 ($), HistoricalPrice3 ($), Current Price ($)
700, 100000, 3000000, 250000, 500000
1000, 600000, 400000, 650000, 700000
Buat model data yang mewakili cuplikan berikut:
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; }
}
Membuat anotasi model data dengan atribut kolom
Atribut memberikan ML.NET informasi lebih lanjut tentang model data dan sumber data.
Atribut LoadColumn
menentukan indeks kolom properti Anda.
Penting
LoadColumn
hanya diperlukan saat memuat data dari file.
Muat kolom sebagai:
- Kolom individual, seperti
Size
danCurrentPrices
diHousingData
kelas . - Beberapa kolom pada satu waktu dalam bentuk vektor, seperti
HistoricalPrices
diHousingData
kelas .
Jika Anda memiliki properti vektor, terapkan VectorType
atribut ke properti dalam model data Anda. Semua elemen dalam vektor harus berjenis yang sama. Menjaga kolom tetap dipisahkan memungkinkan kemudahan dan fleksibilitas rekayasa fitur, tetapi untuk sejumlah besar kolom, beroperasi pada kolom individual menyebabkan dampak pada kecepatan pelatihan.
ML.NET beroperasi melalui nama kolom. Jika Anda ingin mengubah nama kolom menjadi sesuatu selain nama properti, gunakan ColumnName
atribut . Saat membuat objek dalam memori, Anda masih membuat objek menggunakan nama properti. Namun, untuk pemrosesan data dan membangun model pembelajaran mesin, ML.NET mengambil alih dan mereferensikan properti dengan nilai yang disediakan dalam ColumnName
atribut .
Memuat data dari satu file
Untuk memuat data dari file, gunakan LoadFromTextFile
metode dengan model data agar data dimuat. Karena separatorChar
parameter dibatasi tab secara default, ubah untuk file data Anda sesuai kebutuhan. Jika file Anda memiliki header, atur hasHeader
parameter ke untuk true
mengabaikan baris pertama dalam file dan mulai memuat data dari baris kedua.
//Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("my-data-file.csv", separatorChar: ',', hasHeader: true);
Memuat data dari beberapa file
Jika data Anda disimpan dalam beberapa file, selama skema data sama, ML.NET memungkinkan Anda memuat data dari beberapa file yang berada di direktori yang sama atau beberapa direktori.
Memuat dari file dalam satu direktori
Ketika semua file data Anda berada di direktori yang sama, gunakan kartubebas dalam metode .LoadFromTextFile
//Create MLContext
MLContext mlContext = new MLContext();
//Load Data File
IDataView data = mlContext.Data.LoadFromTextFile<HousingData>("Data/*", separatorChar: ',', hasHeader: true);
Memuat dari file dalam beberapa direktori
Untuk memuat data dari beberapa direktori, gunakan CreateTextLoader
metode untuk membuat TextLoader
. Kemudian, gunakan TextLoader.Load
metode dan tentukan jalur file individual (kartubebas tidak dapat digunakan).
//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");
Memuat data dari database relasional
ML.NET mendukung pemuatan data dari berbagai database relasional yang didukung oleh System.Data
yang mencakup SQL Server, Azure SQL Database, Oracle, SQLite, PostgreSQL, Progress, IBM DB2, dan banyak lagi.
Catatan
Untuk menggunakan DatabaseLoader
, referensikan paket System.Data.SqlClient NuGet.
Mengingat database dengan tabel bernama House
dan skema berikut:
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])
);
Data dapat dimodelkan oleh kelas seperti HouseData
:
public class HouseData
{
public float Size { get; set; }
public float NumBed { get; set; }
public float Price { get; set; }
}
Kemudian, di dalam aplikasi Anda, buat DatabaseLoader
.
MLContext mlContext = new MLContext();
DatabaseLoader loader = mlContext.Data.CreateDatabaseLoader<HouseData>();
Tentukan string koneksi Anda serta perintah SQL yang akan dijalankan pada database dan buat DatabaseSource
instans. Sampel ini menggunakan database LocalDB SQL Server dengan jalur file. Namun, DatabaseLoader mendukung string koneksi valid lainnya untuk database lokal dan di cloud.
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);
Data numerik yang bukan tipe Real
harus dikonversi ke Real
. Jenis Real
ini direpresentasikan sebagai nilai floating-point presisi tunggal atau Single
, jenis input yang diharapkan oleh algoritma ML.NET. Dalam sampel ini, Size
kolom dan NumBed
adalah bilangan bulat dalam database. Menggunakan fungsi bawaan CAST
, fungsi ini dikonversi ke Real
. Price
Karena properti sudah berjenis Real
, properti dimuat apa adanya.
Load
Gunakan metode untuk memuat data ke dalam IDataView
.
IDataView data = loader.Load(dbSource);
Memuat gambar
Untuk memuat data gambar dari direktori, pertama-tama buat model yang menyertakan jalur gambar dan label. ImagePath
adalah jalur absolut gambar di direktori sumber data. Label
adalah kelas atau kategori file gambar aktual.
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
};
}
}
Kemudian muat gambar:
IEnumerable<ImageData> images = LoadImagesFromDirectory(
folder: "your-image-directory-path",
useFolderNameAsLabel: true
);
Untuk memuat gambar mentah dalam memori dari direktori, buat model untuk menahan array dan label byte gambar mentah:
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
};
}
}
Memuat data dari sumber lain
Selain memuat data yang disimpan dalam file, ML.NET mendukung pemuatan data dari sumber yang mencakup:
- Koleksi dalam memori
- JSON/XML
Saat bekerja dengan sumber streaming, ML.NET mengharapkan input berada dalam bentuk koleksi dalam memori. Oleh karena itu, saat bekerja dengan sumber seperti JSON/XML, pastikan untuk memformat data ke dalam koleksi dalam memori.
Mengingat koleksi dalam memori berikut:
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
}
};
Muat koleksi dalam memori ke dalam IDataView
dengan LoadFromEnumerable
metode :
Penting
LoadFromEnumerable
mengasumsikan bahwa yang dimuatnya IEnumerable
adalah utas-aman.
// Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(inMemoryCollection);
Langkah berikutnya
- Untuk membersihkan atau memproses data, lihat Menyiapkan data untuk membangun model.
- Saat Anda siap untuk membuat model, lihat Melatih dan mengevaluasi model.