Path: blob/master/site/ko/tfx/tutorials/transform/census.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
TensorFlow Transform으로 데이터 전처리하기
TensorFlow Extended(TFX)의 특성 엔지니어링 구성 요소
이 예제 colab 노트북은 TensorFlow Transform(tf.Transform
)을 사용하여 모델을 훈련하고 프로덕션에서 추론을 제공하는 데 정확히 동일한 코드를 사용하여 데이터를 사전 처리하는 방법에 대한 좀 더 고급스러운 예를 제공합니다.
TensorFlow Transform은 훈련 데이터세트에 대한 전체 전달이 필요한 특성 생성을 포함하여 TensorFlow에 대한 입력 데이터를 전처리하기 위한 라이브러리입니다. 예를 들어 TensorFlow Transform을 사용하여 다음을 수행할 수 있습니다.
평균과 표준 편차를 이용하여 입력값 정규화
모든 입력값에 대해 어휘를 생성하여 문자열을 정수로 변환
관찰된 데이터 분포를 기반으로 부동 소수점을 버킷에 할당하여 정수로 변환
TensorFlow는 단일 예제 또는 예제 배치에 대한 조작을 기본적으로 지원합니다. tf.Transform
은 이러한 기능을 확장하여 전체 훈련 데이터세트에 대한 전체 전달을 지원합니다.
tf.Transform
의 출력은 훈련과 제공 모두에 사용할 수 있는 TensorFlow 그래프로 내보내집니다. 훈련과 제공 모두에 동일한 그래프를 사용하면 두 단계에 동일한 변환이 적용되므로 왜곡을 방지할 수 있습니다.
핵심 포인트: tf.Transform
및 이것이 Apache Beam과 작동하는 방식을 이해하려면 Apache Beam 자체에 대해 약간 알아야 합니다. Beam 프로그래밍 가이드가 좋은 출발점을 제공합니다.
##이 예제에서 수행하는 작업
이 예에서 우리는 인구 조사 데이터를 포함하는 널리 사용되는 데이터 세트를 처리하고 분류를 수행하도록 모델을 훈련할 것입니다. 그 과정에서 tf.Transform
을 사용하여 데이터를 변환할 것입니다.
핵심 포인트: 모델러 및 개발자로서 이 데이터가 어떻게 사용되는지, 그리고 모델의 예측이 초래할 수 있는 잠재적인 이점과 피해에 대해 생각해보세요. 이와 같은 모델은 사회적 편견과 불균형을 강화시킬 수 있습니다. 기능이 해결하려는 문제와 관련이 있습니까? 아니면 편견을 유발합니까? 자세한 내용은 ML 공정성에 대해 읽어보세요.
참고: TensorFlow 모델 분석은 모델이 사회적 바이어스와 격차를 강화할 수 있는 방법을 이해하는 것을 포함하여 모델이 데이터의 다양한 세그먼트에 대해 예측을 얼마나 잘 수행하는지 이해하기 위한 강력한 도구입니다.
TensorFlow Transform 설치하기
가져오기 및 전역
먼저 필요한 항목을 가져옵니다.
다음으로 데이터 파일을 다운로드합니다.
열 이름 지정하기
데이터세트의 열을 참조하기 위한 몇 가지 편리한 목록을 만들 것입니다.
다음은 데이터에 대한 빠른 미리보기입니다.
테스트 데이터에는 건너뛰어야 있는 1개의 헤더 행과 각 행의 끝에 후행 "."가 있습니다.
###특성과 스키마 정의. 입력에 있는 열의 유형을 기반으로 스키마를 정의해 보겠습니다. 무엇보다도 이를 올바르게 가져오는 데 도움이 됩니다.
[선택 사항] tf.train.Example proto 인코딩 및 디코딩
이 튜토리얼에서는 몇몇 위치에서 데이터세트의 예제를 tf.train.Example
proto와 상호 변환해야 합니다.
아래의 숨겨진 encode_example
함수는 데이터세트의 특성 사전을 tf.train.Example
로 변환합니다.
이제 데이터세트 예제를 Example
protos로 변환할 수 있습니다.
직렬화된 예제 proto의 배치를 다시 텐서 사전으로 변환할 수도 있습니다.
어떤 경우에는 레이블이 전달되지 않으므로 레이블이 선택 사항이 되도록 인코딩 함수가 작성됩니다.
Example
proto를 만들 때 레이블 키가 포함되지 않습니다.
###하이퍼파라미터 설정 및 기본 하우스키핑
훈련에 사용되는 상수 및 하이퍼파라미터.
##tf.Transform
으로 전처리하기
###tf.Transform
전처리 함수 생성. 전처리 함수는 tf.Transform의 가장 중요한 개념입니다. 전처리 함수는 데이터세트의 변환이 실제로 일어나는 곳으로, 텐서 사전을 수락하고 반환합니다. 여기서 텐서는 Tensor
또는 SparseTensor
를 의미합니다. 일반적으로 전처리 함수의 핵심을 구성하는 두 가지 주요 API 호출 그룹이 있습니다.
TensorFlow Ops: 일반적으로 TensorFlow 연산을 의미하는 텐서를 수락하고 반환하는 모든 함수로, 원시 데이터를 변환된 데이터로 한 번에 하나의 특성 벡터씩 변환하는 TensorFlow 연산을 그래프에 추가합니다. 이는 훈련 및 제공 기간 동안 모든 예에 대해 실행됩니다.
Tensorflow 변환 분석기/맵퍼: tf.Transform에서 제공하는 모든 분석기/맵퍼입니다. 이들은 또한 텐서를 수락 및 반환하며 일반적으로 Tensorflow 연산과 Beam 계산을 조합적으로 포함하지만 TensorFlow 연산과 달리 전체 훈련 데이터세트에 대한 전체 패스가 필요한 분석 중에 Beam 파이프라인에서만 실행됩니다. Beam 계산은 훈련하기 전과 훈련하는 동안 한 번만 실행되며 일반적으로 전체 훈련 데이터세트에 대해 전체 패스를 만듭니다. 그래프에 추가되는
tf.constant
텐서가 생성됩니다. 예를 들어,tft.min
은 훈련 데이터세트에 대해 텐서의 최솟값을 계산합니다.
주의: 전처리 함수를 추론 제공에 적용할 때 훈련 중에 분석기가 생성한 상수는 변경되지 않습니다. 데이터에 추세 또는 계절성 요소가 있는 경우 그에 따라 계획하세요.
다음은 이 데이터세트에 대한 preprocessing_fn
로, 여러 가지 작업을 수행합니다.
tft.scale_to_0_1
을 사용하여 숫자 특성을[0,1]
범위로 확장합니다.tft.compute_and_apply_vocabulary
를 사용하여 각 범주 특성에 대한 어휘를 계산하고 각 입력에 대한 정수 ID를tf.int64
로 반환합니다. 이는 문자열 및 정수 범주형 입력에 모두 적용됩니다.표준 TensorFlow 작업을 사용하여 데이터에 일부 수동 변환을 적용합니다. 여기에서 이러한 작업은 레이블에 적용되지만 특성도 변환할 수 있습니다. TensorFlow 작업은 다음과 같은 몇 가지 작업을 수행합니다.
레이블에 대한 조회 테이블을 만듭니다(
tf.init_scope
는 함수가 처음 호출될 때만 테이블이 생성되도록 함).레이블의 텍스트를 정규화합니다.
레이블을 one-hot으로 변환합니다.
구문
이제 모든 것을 한곳으로 모으고 Apache Beam을 사용하여 실행할 준비가 완료되었습니다.
Apache Beam은 변환을 정의하고 호출하기 위해 특수 구문을 사용합니다. 예를 들어 다음 줄을 보겠습니다.
to_this_call
메서드는 pass_this
라는 개체를 호출 및 전달하고 이 연산을 스택 추적에서 name this step
이라고 합니다. to_this_call
에 대한 호출의 결과는 result
에서 반환됩니다. 다음과 같이 함께 연결된 파이프라인의 단계를 종종 볼 수 있습니다.
그리고 새 파이프라인으로 시작했기 때문에 다음과 같이 계속할 수 있습니다.
데이터 변환하기
이제 Apache Beam 파이프라인에서 데이터 변환을 시작할 준비가 되었습니다.
tfxio.CsvTFXIO
CSV 판독기를 사용하여 데이터를 읽습니다(파이프라인에서 텍스트 행을 처리하려면 대신tfxio.BeamRecordCsvTFXIO
사용).위에서 정의한
preprocessing_fn
을 사용하여 데이터를 분석하고 변환합니다.결과를
Example
protos의TFRecord
로 결과를 작성합니다. 나중에 모델 훈련에 이를 사용합니다.
파이프라인을 실행합니다.
출력 디렉터리를 tft.TFTransformOutput
으로 래핑합니다.
디렉터리를 보면 세 가지가 포함되어 있음을 알 수 있습니다.
train_transformed
및test_transformed
데이터 파일transform_fn
디렉터리(tf.saved_model
)The
transformed_metadata
다음 섹션에서는 이러한 아티팩트를 사용하여 모델을 훈련하는 방법을 보여줍니다.
##전처리된 데이터를 사용하여 tf.keras로 모델 훈련하기
훈련과 적용 모두에 동일한 코드를 사용하여 왜곡을 방지하는 데 tf.Transform
이 어떻게 이용되는지 보여주기 위해 모델을 훈련할 것입니다. 모델을 훈련하고 훈련된 모델을 운영에 적합하게 준비하려면 입력 함수를 생성해야 합니다. 훈련 입력 함수와 적용 입력 함수의 주된 차이점은 훈련 데이터에는 레이블이 포함되고 운영 데이터에는 포함되지 않는다는 것입니다. 인수와 반환도 약간 다릅니다.
###훈련을 위한 입력 함수 생성
이전 섹션의 파이프라인을 실행하면 변환된 데이터가 포함된 TFRecord
파일이 생성됩니다.
다음 코드는 tf.data.experimental.make_batched_features_dataset
및 tft.TFTransformOutput.transformed_feature_spec
을 사용하여 이러한 데이터 파일을 tf.data.Dataset
으로 읽습니다.
아래에서 변환된 데이터 샘플을 볼 수 있습니다. education-num
및 hourd-per-week
와 같은 숫자 열이 [0,1] 범위의 부동 소수점으로 변환되고 문자열 열이 ID로 변환되는 방식에 주목하세요.
모델 훈련 및 평가하기
모델 구성하기
데이터세트를 빌드합니다.
모델을 훈련하고 평가합니다.
새 데이터 변환하기
이전 섹션에서 훈련 프로세스는 transform_dataset
함수에서 tft_beam.AnalyzeAndTransformDataset
에 의해 생성된 변환된 데이터의 하드 카피를 사용했습니다.
새 데이터에서 작업하려면 tft_beam.WriteTransformFn
에 의해 저장된 preprocessing_fn
의 최종 버전을 로드해야 합니다.
TFTransformOutput.transform_features_layer
메서드는 출력 디렉터리에서 preprocessing_fn
SavedModel을 로드합니다.
소스 파일에서 처리되지 않은 새 배치를 로드하는 함수는 다음과 같습니다.
tft.TransformFeaturesLayer
를 로드하여 preprocessing_fn
으로 이 데이터를 변환합니다.
tft_layer
는 특성의 일부만 전달되는 경우에도 변환을 실행할 만큼 충분히 똑똑합니다. 예를 들어, 두 개의 특성만 전달하면 해당 특성의 변환된 버전만 다시 얻을 수 있습니다.
다음은 특성 사양에 없는 특성을 삭제하고 레이블이 제공된 특성에 있는 경우 (features, label)
쌍을 반환하는 보다 강력한 버전입니다.
이제 Dataset.map
을 사용하여 즉시 새 데이터에 해당 변환을 적용할 수 있습니다.
모델 내보내기
따라서 훈련된 모델과 preporcessing_fn
을 새 데이터에 적용하는 메서드가 준비되었습니다. 직렬화된 tf.train.Example
proto를 입력으로 받아들이는 새 모델로 이를 결합합니다.
모델을 빌드하고 직렬화된 예제 배치에서 테스트 실행합니다.
모델을 SavedModel로 내보냅니다.
모델을 다시 로드하고 동일한 예제 배치에서 테스트합니다.
##우리가 수행한 작업. 이 예제에서는 tf.Transform
을 사용하여 인구 조사 데이터의 데이터세트를 전처리하고 정리 및 변환된 데이터로 모델을 훈련했습니다. 또한 추론을 수행하기 위해 운영 환경에 훈련된 모델을 배포할 때 사용할 수 있는 입력 함수를 만들었습니다. 훈련과 추론 모두에 동일한 코드를 사용함으로써 데이터 기울이기 문제를 피할 수 있습니다. 그 과정에서 데이터 정리에 필요한 변환을 수행하기 위해 Apache Beam 변환을 생성하는 방법을 배웠습니다. 또한 이 변환 데이터를 이용해 tf.keras
로 모델을 훈련하는 방법도 보았습니다. 이것은 TensorFlow Transform으로 수행할 수 있는 작업의 일부일 뿐입니다! tf.Transform
을 더욱 자세히 살펴보고 이것으로 무엇을 할 수 있는지 알아보기 바랍니다.
[선택 사항] 전처리된 데이터를 사용하여 tf.estimator로 모델 훈련하기
경고: Estimator는 새 코드에 권장되지 않습니다. Estimator는
v1.Session
스타일 코드를 실행하며, 이 코드는 올바르게 작성하기가 좀 더 어렵고 특히 TF 2 코드와 결합할 경우 예기치 않게 작동할 수 있습니다. Estimator는 호환성 보장이 적용되지만 보안 취약점 외에는 수정 사항이 제공되지 않습니다. 자세한 내용은 마이그레이션 가이드를 참조하세요.
###훈련을 위한 입력 함수 생성
###제공을 위한 입력 함수 생성
프로덕션에서 사용할 수 있는 입력 함수를 만들고 훈련된 모델을 제공하기에 적합하게 준비하겠습니다.
###FeatureColumns에 입력 데이터 래핑. 예제 모델은 TensorFlow FeatureColumns에 데이터를 예상합니다.
###모델 학습, 평가 및 내보내기
###모두 결합하기. 인구 조사 데이터를 사전 처리하고, 모델을 훈련하고, 제공에 적합하게 준비하는 데 필요한 모든 요소들을 만들었습니다. 지금까지는 준비 작업만 했고, 이제 실행해볼 차례입니다!
참고: 전체 프로세스를 보려면 이 셀의 출력을 스크롤하세요. 결과는 맨 아래에 있습니다.