파일 및 기타 소스에서 데이터 로드
API를 사용하여 처리 및 학습을 위해 ML.NET에 데이터를 로드하는 방법을 알아봅니다. 데이터는 원래 파일이나 데이터베이스, 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
특성은 속성의 열 인덱스를 지정합니다.
Important
LoadColumn
은 파일에서 데이터를 로드할 때만 필요합니다.
다음과 같이 열을 로드합니다.
HousingData
클래스에서Size
및CurrentPrices
같은 개별 열.HousingData
클래스에서HistoricalPrices
같이 벡터 형식으로 한 번에 여러 열.
벡터 속성이 있는 경우 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은 SQL Server, Azure Database, Oracle, SQLite, PostgreSQL, Progress, IBM DB2 등 System.Data
가 지원하는 다양한 관계형 데이터베이스에서의 데이터 로드를 지원합니다.
참고 항목
DatabaseLoader
를 사용하려면 System.Data.SqlClient NuGet 패키지를 참조합니다.
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는 온-프레미스 및 클라우드의 데이터베이스에 대한 다른 유효한 연결 문자열은 지원합니다.
Important
사용 가능한 가장 안전한 인증 흐름을 사용하는 것이 권장됩니다. Azure SQL에 연결하려는 경우, 권장되는 인증 방법은 Azure 리소스에 대한 관리 ID입니다.
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
형식은 ML.NET 알고리즘에서 예상하는 입력 형식인 단정밀도 부동 소수점 값 또는 Single
로 표현됩니다. 이 샘플에서 Size
및 NumBed
열은 데이터베이스의 정수입니다. CAST
기본 제공 함수를 사용하여 Real
로 변환됩니다. Price
속성은 이미 Real
형식이므로 있는 그대로 로드됩니다.
Load
메서드를 사용하여 데이터를 IDataView
에 로드합니다.
IDataView data = loader.Load(dbSource);
이미지 로드
디렉터리에서 이미지 데이터를 로드하려면 먼저 이미지 경로와 레이블이 포함된 모델을 만듭니다. ImagePath
는 데이터 소스 디렉터리에 있는 이미지의 절대 경로입니다. Label
은 실제 이미지 파일의 클래스 또는 범주입니다.
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
};
}
}
그런 다음 이미지를 로드합니다.
IEnumerable<ImageData> images = LoadImagesFromDirectory(
folder: "your-image-directory-path",
useFolderNameAsLabel: true
);
디렉터리에서 메모리 내 원시 이미지를 로드하려면 원시 이미지 바이트 배열 및 레이블을 보관할 모델을 만듭니다.
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
};
}
}
다른 소스에서 데이터 로드
파일에 저장된 데이터를 로드하는 것 외에도 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
}
};
LoadFromEnumerable
메서드로 메모리 내 컬렉션을 IDataView
에 로드합니다.
Important
LoadFromEnumerable
에서는 로드하는 IEnumerable
이 스레드로부터 안전하다고 가정합니다.
// Create MLContext
MLContext mlContext = new MLContext();
//Load Data
IDataView data = mlContext.Data.LoadFromEnumerable<HousingData>(inMemoryCollection);
다음 단계
- 데이터를 정리하거나 처리하려면 모델 빌드를 위해 데이터 준비를 참조하세요.
- 모델을 빌드할 준비가 된 경우, 모델 학습 및 평가를 참조하세요.
.NET