(pythorch를 써도 TFDV 쓸 수 있음)
TFDV는 데이터의 통계, 시각화에 용이한 라이브러리다.
tfdv.generate_statistics_from_csv()
https://www.tensorflow.org/tfx/data_validation/api_docs/python/tfdv/generate_statistics_from_csv
tfdv.generate_statistics_from_csv | TFX | TensorFlow
Compute data statistics from CSV files.
www.tensorflow.org
TFDV는 Apache Beam의 데이터 병렬처리 프레임워크를 사용해 대규모 데이터 세트에 대한 통계 계산을 확장한다.
아래같이 입력하면 학습데이터를 읽고, Apache Beam으로 병렬처리를 하고, 통계정보를 추출한다.
train_stats = tfdv.generate_statistics_from_csv(data_location = TRAIN_DATA)
그 다음 아래같이 입력하면 학습데이터에 대한 통계 정보를 시각화하게 된다.
tfdv.visualize_statistics(train_stats)
=> 어떤 feature 가 있고, 해당 feature 들의 데이터 수 가 몇개인지, null 인 값은 몇개인지, 평균이나 표준편차, 최대최소값 등등 다양한 정보를 볼 수 있음.
=> feature 가 잘못된게 있는지 한 눈에 확인하기 쉽게 되어있음.
스키마 추론
학습데이터에 대한 스키마를 뽑을 수 있음. 어떤 feature들이 어떤 자료형인지 정리해줌.
스키마는 ML 관련 데이터에 대한 제약 조건을 정의한다. 제약 조건들은 각 feature의 데이터 유형, 존재 빈도가 포함된다.
tfdv.infer_schema()
https://www.tensorflow.org/tfx/data_validation/api_docs/python/tfdv/infer_schema
tfdv.infer_schema | TFX | TensorFlow
Infers schema from the input statistics.
www.tensorflow.org
해당 입력을 통해 학습데이터의 통계치를 통해 스키마 추론, 각각의 feature의 데이터 형도 확인가능.
schema = tfdv.infer_schema(statistics = train_stats)
tfdv.display_schema(schema=schema)
평가데이터의 오류를 확인하기 위한 입력
학습, 평가데이터를 같이 비교해서 볼 수 있음.
#평가데이터
eval_stats = tfdv.generate_statistics_from_csv(data_location = EVAL_DATA)
#테스트, 평가데이터 비교
tfdv.visualize_statistics(lhs_statistics=eval_stats, rhs_statistics=train_stats,
lhs_name='EVAL_DATASET', rhs_name='TRAIN_DATASET')
평가데이터의 이상 데이터를 확인하기 위한 입력이다.
anomalies = tfdv.validate_staistics(statistics=eval_stats, schema = schema)
tfdv.display_anomalies(anomalies)
스키마 환경
기본적으로 파이프라인의 모든 데이터세트는 동일한 스키마를 사용해야 하지만 예외가 있는 경우도 많음.
이럴때 약간의 스키마 변형이 필요하다.
스키마 환경을 사용해 요구사항을 표현 할 수 있다.
스키마의 feature는 default_environment, in_environment, not_in_environment 를 사용해 환경 세트와 연관 시킬 수 있다.
예를 들어 display_anomalies 를 통해 학습, 평가 데이터에는 있는 feature가 서빙 데이터에는 없다고 가정하면,
비정상으로 표시가 되므로 이를 무시하도록 지시할 수 있다.
schema.default_environment.append('TRAINING')
schema.default_environment.append('SERVING')
#'test'라는 feature는 서빙 환경에서 사용하지 않는다
tfdv.get_feature(schema, 'test').not_in_environment.append('SERVING')
serving_anomalies_with_env = tfdv.validate_statistics(
serving_stats, schema, environmetn='SERVING'
)
tfdv.display_anomalies(serving_anomalies_with_env)
#No anomalies found 로 이상치가 없다고 나옴
데이터 드리프트 : 모델을 배포하고 난 뒤에 성능이 하락하면, 이를 인지하기 위해 들어온 인풋 값들의 변화를 확인한다. 이 때 기존 학습해오던 데이터의 분포와 다른 인풋이 늘어나면 이를 데이터 드리프트라고 명명. (ex. 4-50대 고객이 주류이다가 갑자기 20대 유입이 많아지는 경우)
TFDV는 스키마에 지정된 드리프트/스큐(편향) 비교를 기반으로 여러 데이터 세트의 통계를 비교하여 데이터 드리프트 및 스큐를 감지할 수 있다.
드리프트 감지는 범주형 특성, 데이터의 연속 범위에 대해 지원된다.
범위를 올바르게 설정하는 것은 일반적으로 도메인 지식과 실험이 필요한 반복적인 프로세스ㅠㅠ
TFDV는 데이터에서 스키마 편향, 특성 편향, 분포 편향 세 가지 다른 종류의 편향을 감지 할 수 있다.
① 스키마 편향 : 학습 , 서빙 데이터가 동일한 스키마를 따르지 않을 때 발생, 학습 데이터와 서빙 데이터는 모두 동일한 스키마를 준수해야함. 둘 사이의 예상 편차는 앞서 해본 것 처럼 스키마의 환경 필드를 통해 지정해주어야 함.
② 특성 편향 : 모델이 학습하는 특성 값이 서빙 시 표시되는 특성 값과 다를 때 발생.
- 일부 특성 값이 학습 및 서빙 중간에 수정이 된 경우
- 학습과 서빙 시에 특성을 전처리 하는 로직이 다른 경우
- 학습, 서빙 중 하나에만 일부 전처리를 적용하는 경우
③ 분포 편향 : 학습데이터 세트의 분포가 제공 데이터 세트의 분포와 크게 다를때 발생. 주요 원인 중 하나는 다른 코드 또는 다른 데이터 소스를 사용해 학습 데이터를 생성하는 것. 혹은 학습할 제공 데이터의 대표적이지 않은 하위 샘플을 선택해 잘못된 샘플링을 진행하는 경우이다.(앞에 데이터 드리프트때 말한 4-50대 고객이 주류이다가 갑자기 20대 유입이 많아지는 경우 분표 편향을 야기)
#'payment_type' feature에 skew 비교실행(학습, 서빙데이터)
payment_type = tfdv.get_feature(schema, 'payment_type')
payment_type.skew_comparator.infinity_norm.threshold = 0.01
#'company' feature 드리프트 비교 실행(학습, 서빙데이터)
company = tfdv.get_feature(schema, 'company')
company.drift_comparator.infinity_norm.threshold = 0.001
skew_anomalies = tfdv.validate_statistics(train_stats, schema,
previous_statistics = eval_stats,
serving_statistics = serving_stats)
tfdv.display_anomalies(skew_anomalies)
이후에 스키마가 다 검토되고 나면 동결 상태를 위해 파일로 저장
from tensorflow.python.lib.io import file_io
from google.protobuf import text_format
file_io.recursive_create_dir(OUTPUT_DIR)
schema_file = os.path.join(OUTPUT_DIR, 'schema.pbtxt')
tfdv.write_schema_text(schema, schema_file)
!cat {schema_file}
'스터디 > AI' 카테고리의 다른 글
[실무] 쿠베플로우 ML 파이프라인 개념,예제 (0) | 2023.03.01 |
---|---|
[실무] WIT 모델 분석 (2) | 2023.02.26 |
[실무] 코드관리 (0) | 2023.02.23 |
[실무] ML Hyperparameter Optimization (1) | 2023.02.23 |
[실무] 프로젝트 모델 실험관리 (0) | 2023.02.23 |