텍스트 분류 프로젝트를 빌드하는 방법 이해
사용자 지정 텍스트 분류 프로젝트는 분류 모델을 빌드, 학습, 개선 및 배포하는 작업 영역입니다. Language Studio와 REST API를 통해 두 가지 방법으로 프로젝트 작업을 할 수 있습니다. Language Studio는 랩에서 사용되는 GUI이지만 REST API의 기능은 동일합니다. 원하는 메서드에 관계없이 모델 개발 단계는 동일합니다.
Azure AI 언어 프로젝트 수명 주기
- 레이블 정의: 분류하려는 데이터를 이해하고 분류하려는 가능한 레이블을 식별합니다. 비디오 게임 예제에서 레이블은 “액션”, “어드벤처”, “전략” 등입니다.
- 데이터 태그 지정: 각 파일이 속하는 레이블을 지정하여 기존 데이터에 태그 또는 레이블을 지정합니다. 모델에서 향후 파일을 분류하는 방법을 배우기 때문에 데이터에 레이블을 지정하는 것이 중요합니다. 모범 사례는 레이블 간에 명확한 차이점을 두어 모호성을 방지하고 모델에서 학습할 수 있도록 각 레이블의 좋은 예제를 제공하는 것입니다. 예를 들어 “Quest for the Mine Brush” 게임은 “어드벤처”로, “Flight Trainer”는 “액션”으로 레이블을 지정합니다.
- 모델 학습: 레이블이 지정된 데이터를 사용하여 모델을 학습합니다. 학습은 비디오 게임 요약의 유형에 따라 레이블을 지정해야 할 장르를 모델에 학습시킵니다.
- 모델 보기: 모델을 학습시킨 후 모델의 결과를 봅니다. 모델은 테스트된 데이터의 정밀도 및 재현율에 따라 0에서 1 사이의 점수가 매겨집니다. 어떤 장르가 잘 수행되지 않았는지 기록해 두세요.
- 모델 개선: 올바른 레이블에 따라 평가하지 못한 분류를 확인하고, 레이블 분포를 확인하고, 성능을 향상하기 위해 추가할 데이터를 확인하여 모델을 개선합니다. 예를 들어 모델이 “어드벤처”와 “전략” 게임을 혼합한 것을 확인할 수 있습니다. 모델을 다시 학습시키기 위해 데이터 세트에 추가할 각 레이블의 더 많은 예제를 찾아보세요.
- 모델 배포: 모델이 원하는 대로 수행되면 모델을 배포하여 API를 통해 사용할 수 있도록 합니다. 모델 이름은 “GameGenres”일 수 있으며 배포되면 게임 요약을 분류하는 데 이를 사용할 수 있습니다.
- 텍스트 분류: 모델을 사용하여 텍스트를 분류합니다. 이 랩에서는 API를 사용하는 방법을 설명하며 API 참조를 볼 수 있습니다.
학습을 위해 데이터 세트를 분할하는 방법
데이터에 레이블을 지정할 때 각 파일이 속할 데이터 세트를 지정할 수 있습니다.
- 학습 - 학습 데이터 세트는 실제로 모델을 학습하는 데 사용됩니다. 제공된 데이터 및 레이블은 기계 학습 알고리즘에 공급되어 어떤 모델을 어떤 레이블로 분류해야 하는지를 학습합니다. 학습 데이터 세트는 두 데이터 세트 중 더 크며, 레이블이 지정된 데이터의 약 80% 정도가 되는 것이 좋습니다.
- 테스트 - 테스트 데이터 세트는 모델이 학습된 후 이를 확인하는 데 사용되는 레이블이 지정된 데이터입니다. Azure는 테스트 데이터 세트의 데이터를 가져와서 모델에 제출하고, 데이터에 레이블을 지정한 방법에 대해 출력을 비교하여 모델이 얼마나 잘 수행되었는지 확인합니다. 이 비교의 결과는 모델에 점수를 매기는 방법이며 예측 성능을 개선하는 방법을 파악하는 데 도움이 됩니다.
모델 학습 단계에서는 모델을 학습하는 방법에 대한 두 가지 옵션이 있습니다.
- 자동 분할 - Azure는 모든 데이터를 가져와 지정된 백분율로 임의로 분할하고 모델을 학습할 때 적용합니다. 이 옵션은 데이터 세트가 크거나, 데이터가 자연스럽게 더 일관되거나, 데이터 분포가 클래스를 광범위하게 포괄하는 경우에 가장 적합합니다.
- 수동 분할 - 각 데이터 세트에 있어야 하는 파일을 수동으로 지정합니다. 학습 작업을 제출하면 Azure AI 언어 서비스가 데이터 세트 분할과 배포를 알려 줍니다. 이 분할은 데이터 세트가 작아서 올바른 클래스의 분포 및 데이터의 편차가 존재하여 모델을 올바르게 학습해야 할 때 사용하면 제일 좋습니다.
자동 분할을 사용하려면 데이터에 레이블을 지정할 때 모든 파일을 학습 데이터 세트에 넣습니다(이 옵션은 기본값임). 수동 분할을 사용하려면 데이터에 레이블을 지정하는 동안 어떤 파일이 테스트 또는 학습에 있어야 하는지를 지정합니다.
배포 옵션
Azure AI 언어 서비스를 사용하면 각 프로젝트에서 각각 고유한 이름을 가진 여러 모델과 여러 배포를 모두 만들 수 있습니다. 이점에는 다음을 수행할 수 있는 기능이 포함됩니다.
- 두 모델을 나란히 테스트
- 데이터 세트 분할이 성능에 미치는 영향 비교
- 여러 버전의 모델 배포
참고
각 프로젝트에 10개의 배포 이름 제한을 둠
배포하는 동안 배포된 모델의 이름을 선택할 수 있고 분류 작업을 제출할 때 선택할 수 있습니다.
<...>
"tasks": [
{
"kind": "CustomSingleLabelClassification",
"taskName": "MyTaskName",
"parameters": {
"projectName": "MyProject",
"deploymentName": "MyDeployment"
}
}
]
<...>
REST API 사용
Azure AI 언어 서비스에서 사용 가능한 REST API는 Language Studio에서 프로젝트 빌드를 위한 사용자 인터페이스를 제공하는 것과 동일한 방식으로 Azure AI 언어 프로젝트의 CLI를 개발할 수 있게 해 줍니다. Language Studio는 이 모듈의 랩에서 자세히 설명합니다.
API 사용 패턴
Azure AI 언어 서비스용 API는 대부분의 호출에 대해 비동기적으로 작동합니다. 각 단계에서 먼저 서비스에 요청을 제출한 다음 후속 호출을 통해 서비스에 다시 확인하여 상태 또는 결과를 가져옵니다.
각 요청에서 요청을 인증하려면 헤더가 필요합니다.
키 | 값 |
---|---|
Ocp-Apim-Subscription-Key |
Azure AI 언어 리소스의 핵심 |
초기 요청 제출
요청을 제출할 URL은 현재 진행 중인 단계에 따라 다르지만 모두 Azure AI 언어 리소스에서 제공하는 엔드포인트가 접두사로 지정됩니다.
예를 들어 모델을 학습시키려면 다음과 같은 URL에 대한 POST를 만듭니다.
<YOUR-ENDPOINT>/language/analyze-text/projects/<PROJECT-NAME>/:train?api-version=<API-VERSION>
자리 표시자 | 값 | 예제 |
---|---|---|
<YOUR-ENDPOINT> |
API 요청에 대한 엔드포인트 | https://<your-custom-resource>.cognitiveservices.azure.com |
<PROJECT-NAME> |
프로젝트의 이름(값은 대/소문자 구분) | myProject |
다음 본문이 요청에 연결됩니다.
{
"modelLabel": "<MODEL-NAME>",
"trainingConfigVersion": "<CONFIG-VERSION>",
"evaluationOptions": {
"kind": "percentage",
"trainingSplitPercentage": 80,
"testingSplitPercentage": 20
}
}
키 | 값 |
---|---|
<YOUR-MODEL> |
모델 이름. |
trainingConfigVersion |
모델을 학습시키는 데 사용할 모델 버전입니다. |
runValidation |
테스트 세트에서 유효성 검사를 실행할 부울 값입니다. |
evaluationOptions |
평가 옵션을 지정합니다. |
kind |
데이터 분할 형식을 지정합니다. 자동 분할을 사용할 경우 percentage 또는 데이터 세트를 수동으로 분할하는 경우 set 일 수 있습니다. |
testingSplitPercentage |
type 이 percentage인 경우에만 필수 정수 필드입니다. 테스트 분할을 지정합니다. |
trainingSplitPercentage |
type 이 percentage인 경우에만 필수 정수 필드입니다. 학습 분할을 지정합니다. |
위의 요청에 대한 응답은 요청이 202
인 경우 요청이 성공임을 의미합니다. 응답 헤더에서 다음 URL과 비슷한 location
값을 가져옵니다.
<ENDPOINT>/language/analyze-text/projects/<PROJECT-NAME>/train/jobs/<JOB-ID>?api-version=<API-VERSION>
Key | 값 |
---|---|
<JOB-ID> |
요청에 대한 식별자 |
다음 단계에서 이 URL을 사용하여 교육 상태를 가져옵니다.
학습 상태 가져오기
학습 상태를 가져오려면 요청 응답 헤더의 URL을 사용하여 GET 요청을 제출하고, 인증을 위해 Azure AI 언어 서비스 키를 제공하는 동일한 헤더를 사용합니다. 응답 본문은 다음 JSON과 비슷합니다.
{
"result": {
"modelLabel": "<MODEL-NAME>",
"trainingConfigVersion": "<CONFIG-VERSION>",
"estimatedEndDateTime": "2023-05-18T15:47:58.8190649Z",
"trainingStatus": {
"percentComplete": 3,
"startDateTime": "2023-05-18T15:45:06.8190649Z",
"status": "running"
},
"evaluationStatus": {
"percentComplete": 0,
"status": "notStarted"
}
},
"jobId": "<JOB-ID>",
"createdDateTime": "2023-05-18T15:44:44Z",
"lastUpdatedDateTime": "2023-05-18T15:45:48Z",
"expirationDateTime": "2023-05-25T15:44:44Z",
"status": "running"
}
모델 학습에는 다소 시간이 걸릴 수 있으므로 응답 status
가 succeeded
를 반환할 때까지 주기적으로 이 상태 URL에서 다시 확인합니다. 학습이 성공하면 모델을 보고, 확인하고, 배포할 수 있습니다.
배포된 모델 사용
모델을 사용한 텍스트 분류는 위에서 설명한 것과 동일한 패턴을 따르며 POST 요청으로 작업을 제출하고 GET 요청으로 결과를 검색합니다.
분류를 위한 텍스트 제출
모델을 사용하려면 다음 URL에서 분석 엔드포인트에 POST를 제출합니다.
<ENDPOINT>/language/analyze-text/jobs?api-version=<API-VERSION>
자리 표시자 | 값 | 예제 |
---|---|---|
<YOUR-ENDPOINT> |
API 요청에 대한 엔드포인트 | https://<your-custom-resource>.cognitiveservices.azure.com |
중요
헤더에 Ocp-Apim-Subscription-Key
에 대한 리소스 키를 포함시키는 것을 기억하세요.
다음 JSON 구조체가 요청에 연결됩니다.
{
"displayName": "Classifying documents",
"analysisInput": {
"documents": [
{
"id": "1",
"language": "<LANGUAGE-CODE>",
"text": "Text1"
},
{
"id": "2",
"language": "<LANGUAGE-CODE>",
"text": "Text2"
}
]
},
"tasks": [
{
"kind": "<TASK-REQUIRED>",
"taskName": "<TASK-NAME>",
"parameters": {
"projectName": "<PROJECT-NAME>",
"deploymentName": "<DEPLOYMENT-NAME>"
}
}
]
}
키 | 값 |
---|---|
<TASK-REQUIRED> |
요청 중인 작업입니다. 이 작업은 다중 레이블 프로젝트의 경우 CustomMultiLabelClassification 또는 단일 레이블 프로젝트의 경우 CustomSingleLabelClassification 입니다. |
<LANGUAGE-CODE> |
en-us 과(와) 같은 언어 코드입니다. |
<TASK-NAME> |
작업 이름입니다. |
<PROJECT-NAME> |
프로젝트 이름입니다. |
<DEPLOYMENT-NAME> |
배포 이름. |
위의 요청에 대한 응답은 요청이 202
인 경우 요청이 성공임을 의미합니다. 응답 헤더에서 다음 URL과 비슷한 operation-location
값을 찾습니다.
<ENDPOINT>/language/analyze-text/jobs/<JOB-ID>?api-version=<API-VERSION>
Key | 값 |
---|---|
<YOUR-ENDPOINT> |
API 요청에 대한 엔드포인트 |
<JOB-ID> |
요청에 대한 식별자 |
이 URL은 작업 결과를 가져오는 데 사용됩니다.
분류 결과 가져오기
인증용과 동일한 헤더를 사용하여 이전 요청의 엔드포인트에 GET 요청을 제출합니다. 응답 본문은 다음 JSON과 비슷합니다.
{
"createdDateTime": "2023-05-19T14:32:25.578Z",
"displayName": "MyJobName",
"expirationDateTime": "2023-05-19T14:32:25.578Z",
"jobId": "xxxx-xxxxxx-xxxxx-xxxx",
"lastUpdateDateTime": "2023-05-19T14:32:25.578Z",
"status": "succeeded",
"tasks": {
"completed": 1,
"failed": 0,
"inProgress": 0,
"total": 1,
"items": [
{
"kind": "customSingleClassificationTasks",
"taskName": "Classify documents",
"lastUpdateDateTime": "2022-10-01T15:01:03Z",
"status": "succeeded",
"results": {
"documents": [
{
"id": "<DOC-ID>",
"class": [
{
"category": "Class_1",
"confidenceScore": 0.0551877357
}
],
"warnings": []
}
],
"errors": [],
"modelVersion": "2022-04-01"
}
}
]
}
}
제출된 각 문서에 대한 분류 결과는 항목 배열 results
개체 내에 있습니다.