Skip to content
Home » 머신 러닝 데이터 전처리 | [14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법 207 개의 베스트 답변

머신 러닝 데이터 전처리 | [14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법 207 개의 베스트 답변

당신은 주제를 찾고 있습니까 “머신 러닝 데이터 전처리 – [14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법“? 다음 카테고리의 웹사이트 kk.taphoamini.com 에서 귀하의 모든 질문에 답변해 드립니다: https://kk.taphoamini.com/wiki. 바로 아래에서 답을 찾을 수 있습니다. 작성자 친절한 AI 이(가) 작성한 기사에는 조회수 15,729회 및 좋아요 380개 개의 좋아요가 있습니다.

Table of Contents

머신 러닝 데이터 전처리 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법 – 머신 러닝 데이터 전처리 주제에 대한 세부정보를 참조하세요

안녕하세요, 친절한AI 미정입니다 🙂
이번시간은 머신러닝을 하기 위해 데이터를 어떻게 준비할 수 있는지 알아보겠습니다.
공개되어있는 데이터가 많이많이 올라와있는 좋은 사이트 주소가 아래 있으니 꼭 한번 들려보세요!
[국내]– AI 팩토리 : http://aifactory.space
– 공공데이터포털 : https://www.data.go.kr/datasetsearch
– AI허브 : http://www.aihub.or.kr
– 데이콘 : https://dacon.io
– 보건의료빅데이터개방시스템 : https://opendata.hira.or.kr
[국외]– 캐글 : https://www.kaggle.com/datasets
– 구글 : https://toolbox.google.com/datasetsearch
– 레딧 : https://www.reddit.com/r/datasets/
– UCI : https://archive.ics.uci.edu/ml/

머신 러닝 데이터 전처리 주제에 대한 자세한 내용은 여기를 참조하세요.

머신러닝 파이프라인에서 데이터 전처리 방법 – 조대협의 블로그

Raw data. 초기에 수집된 원본 데이터로 분석이나, 머신러닝 학습 용도로 전혀 전처리가 되지 않은 데이터를 의미한다.

+ 여기에 더 보기

Source: bcho.tistory.com

Date Published: 2/19/2022

View: 5538

[머신러닝 완벽가이드] 데이터 전처리 (Data Preprocessing)

[머신러닝 완벽가이드] 데이터 전처리 (Data Preprocessing) … sklearn의 ML 알고리즘은 문자열 데이터를 입력 값으로 받지 못합니다.

+ 여기에 보기

Source: kimdingko-world.tistory.com

Date Published: 5/29/2022

View: 5288

머신러닝 (3) – 데이터 전처리 – DAVINCI – AI

데이터 전처리는 기존의 데이터를 머신러닝 알고리즘에 알맞은 데이터로 바꾸는 과정입니다. 이 전처리 과정은 모델이 생선 된 이후에도 예측하고자 …

+ 자세한 내용은 여기를 클릭하십시오

Source: davinci-ai.tistory.com

Date Published: 9/1/2021

View: 4314

데이터 전처리(Data preprocessing) : 인공지능 머신러닝 위키백과

데이터 전처리(data preprocessing )가 필요한 이유는 무엇일까. 우수한 예측 분석 결과는 잘 정돈된 데이터에서 출발한다. 즉, 정교한 예측 분석 모델을 얻기 …

+ 여기에 자세히 보기

Source: davincilabs.ai

Date Published: 9/2/2021

View: 7247

머신러닝 데이터 전처리 과정 – 비전공자 데이터분석 노트

머신러닝 데이터 전처리 과정 · 01. 데이터 구조 확인 · 02. 판다스 사용 : import pandas · 04. columns(열)과 row(행)의 개수 확인 : shape( ) · 05.

+ 여기에 표시

Source: bigdaheta.tistory.com

Date Published: 12/24/2022

View: 2226

향상된 기계 학습을 위한 데이터 준비 – Azure – Microsoft Learn

기계 학습에 효과적으로 사용될 수 있도록 준비하기 위해 데이터를 전처리하고 정리합니다.

+ 자세한 내용은 여기를 클릭하십시오

Source: learn.microsoft.com

Date Published: 10/8/2022

View: 1873

[머신러닝] 데이터 전 처리하기 – 공빵탈출

[출처] 2021 NIPA AI 온라인 교육. 데이터 분석 및 전처리 단계 : 수집한 데이터를 분석하고 머신러닝에 사용할 형태로 변환시키는 단계.

+ 여기에 자세히 보기

Source: limvo.tistory.com

Date Published: 4/8/2021

View: 3210

머신 러닝 데이터 전처리 | [14] 머신러닝, 데이터 준비 방법

머신러닝 파이프라인에서 데이터 전처리 방법. Data Preprocessing in ML Pipeline. 본글은 구글 클라우드 블로그에 포스팅한 글을, 재 포스팅 허가를 …

+ 여기에 더 보기

Source: ppa.itrum.vn

Date Published: 8/18/2021

View: 472

머신러닝 2_5 데이터 전처리(Preprocessing) – rejoice

결손값 처리 (Null/ NaN 처리); 데이터 인코딩(레이블, 원-핫 인코딩). 머신러닝알고리즘은 문자열 데이터 속성을 입력값으로 받지않기 때문에 문자형 …

+ 여기에 보기

Source: rejoice-it.com

Date Published: 10/26/2021

View: 9875

머신러닝 – 데이터 전처리 – Write Code – 티스토리

오늘은 머신러닝을 공부하는데 어쩌면 기본중에 기본이라고 할 수 있는 데이터 전처리에 대해 알아보겠다. [사실 나도 이해하는데 조금 힘들었다.

+ 여기에 자세히 보기

Source: itlearning.tistory.com

Date Published: 1/2/2021

View: 6919

주제와 관련된 이미지 머신 러닝 데이터 전처리

주제와 관련된 더 많은 사진을 참조하십시오 [14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[14] 머신러닝, 데이터 준비 방법 - 데이터 제공 사이트, 전처리 방법
[14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법

주제에 대한 기사 평가 머신 러닝 데이터 전처리

  • Author: 친절한 AI
  • Views: 조회수 15,729회
  • Likes: 좋아요 380개
  • Date Published: 2020. 3. 24.
  • Video Url link: https://www.youtube.com/watch?v=5KSkNfX1wpU

머신러닝 파이프라인에서 데이터 전처리 방법

Data Preprocessing in ML Pipeline

본글은 구글 클라우드 블로그에 포스팅한 글을, 재 포스팅 허가를 받은 후 포스팅한 글입니다.

다른 좋은 글들도 많으니 아래 출처 링크를 참고해 주새요

출처 링크

머신러닝 파이프라인에서, 데이터는 모델 학습 및 서빙의 입력에 알맞게 가공되어야 한다. 이를 전처리라고 하는데, 이번 글에서는 전처리에 대한 개념과 이에 대한 구현 옵션등에 대해서 알아보도록 한다.

처리 단계별 데이터 분류

머신러닝에서 데이터 전처리는 모델 학습에 사용되는 데이터 형태로 데이터를 가공하는 과정을 이야기한다.

데이터 전처리는 여러 단계로 이루어지는데, 단계별로 처리된 데이터에 대해서 다음과 같이 명명한다.

Raw data

초기에 수집된 원본 데이터로 분석이나, 머신러닝 학습 용도로 전혀 전처리가 되지 않은 데이터를 의미한다.

하둡과 같은 데이터 레이크에 저장된 데이터나, 기본적인 처리를 통해서 테이블 구조로 데이터 레이크에 저장된 데이터가 Raw 데이터에 해당한다.

Prepared data

Prepared data는 Data engineering 전처리에 의해서, 학습을 위한 데이터만 추출한 서브셋 데이터를 의미한다. 예를 들어 서울 20대 사용자의 구매 패턴을 머신러닝 모델로 만들고자 할때, 서울 20대 사용자 데이터만 추출한 경우 이 데이터를 Prepared data라고 한다. 단순하게 서브셋만을 추출하는 것이 아니라, 깨끗한 상태의 데이터로 정재된 데이터인데, 정재의 의미는 비어 있는 행이나 열을 삭제한 데이터를 의미한다.

Engineered feature

이렇게 정제된 데이터는 머신러닝 학습과 서빙에 적절한 형태로 재가공 되어야 하는데 이를 Feature Engineering 이라고 한다. 예를 들어 숫자와 같은 값을 0~1 사이로 맵핑 시키거나 , 카테고리 밸류 예를 들어 남자/여자를 0,1과 같은 값으로 맵핑 시키고, 전체 데이터를 학습,평가용으로 7:3 분할하여 저장하는 것이 이에 해당 한다.

<그림. 데이터 전처리 단계 및 단계별 생성된 데이터 >

데이터 전처리 기법

그러면, 이 데이터 전처리 과정에서 구체적으로 어떤 기법으로 데이터를 처리할까? 몇가지 대표적인 기법을 정리해보면 다음과 같다.

Data cleansing : 데이터에서 값이 잘못되거나 타입이 맞지 않는 행이나 열을 제거하는 작업을 한다.

Instance selection & partitioning : 데이터를 학습,평가,테스트용 데이터로 나누는 작업을 한다. 단순히 나누는 작업 뿐만 아니라, 데이터를 샘플링 할때, 그 분포를 맞추는 작업을 병행한다. 예를 들어 서울/대구/부산의 선거 투표 데이타가 있을때, 인구 비율이 9:2:3이라고 할때, 전체 인구를 랜덤하게 샘플링해서 데이타를 추출하는 것이 아니라, 서울/대구/부산의 인구 비율에 따라서 서울에서 9, 대구에서 2, 부산에서 3의 비율로 샘플링을 할 수 있다. 이를 stratified partitioning 이라고 한다. 또는 데이터 분포상에서 특정 카테고리의 데이터 비율이 적을때, 이 카테고리에 대해서 샘플의 비율을 높이는 minority classed oversampling 등의 기법을 이 과정에서 사용한다.

Feature tuning : 머신러닝 피처의 품질을 높이기 위해서 0~1값으로 값을 normalization 시키거나, missing value를 제거 하거나, 아웃라이어등을 제거하는 등의 과정을 수행한다.

Representation transformation : 피처를 숫자로 맵핑 시키는 작업을 한다. 카레고리컬 피처를 one hot encoding 등을 통해서 숫자로 맵핑하거나, 텍스트를 embedding 을 통해서 숫자로 변환하는 작업등을 수행한다.

Feature extraction : PCA와 같은 차원 감소 기법을 이용하여, 전체 피처의 수를 줄이는 작업을 수행하거나, 피처를 해시값으로 변환하여, 더 효율적인 피쳐를 사용하는 작업을 한다. .

Feature selection : 여러개의 피처(컬럼)중에 머신러닝에 사용할 피처만을 선별한다.

Feature construction : 기존의 피처를 기반으로 polynomial expansion 이나, feature crossing 등의 기법을 이용하여 새로운 피처를 만들어낸다.

데이터 전처리 단위

Instance level transformation & Full pass transformation

데이터 전처리를 할때 어떤 단위로 데이터를 전처리 할지에 대한 정의이다. 예를 들어 숫자 데이터의 값을 0~1 사이로 맵핑하고자 하면, 그 데이터의 최소/최대 값을 알아야 0~1사이로 맵핑할 수가 있는데, 최소/최대값을 추출하려면, 전체 데이터에 대한 스캔이 필요하다. 반대로 NULL 값을 0으로 변환하는 작업은 전체 데이터에 대한 스캔이 필요없고 개별 데이터만 변환하면 된다. 앞에 설명한 전체 데이터에 대한 스캔이 필요한 방식을 full pass transformation 이라고 하고, 전체 데이터를 볼 필요 없이 개별 데이터에 대해 변환하는 작업을 instance level transformation이라고 한다.

Window aggregation

전체 데이터의 볼륨이 클 경우 이를 윈도우 단위로 잘라서 처리할 수 있는 방법이 있는데, 예를 들어 10분 단위로 데이터를 처리해서, 10분 단위로 최소/최대 값을 구하거나 또는 10분 단위로 어떤 값의 평균값을 대표값으로 사용하는 것들이 이에 해당한다.

일반적으로 입력값은 (entity, timestamp, value) 형태가 되며, 전처리된 출력 값은 다음과 같이. (entity, time_index, aggregated_value_over_time_window) 엔터티(피쳐)에 대해서 윈도우별로 처리된 값을 저장하는 형태가 된다. 보통 이런 window aggregation 방식은 리얼 타임 스트리밍 데이터에서 시간 윈도우 단위로 데이터를 처리하는 경우에 많이 사용이 되며, Apache Beam과 같은 스트리밍 프레임워크를 이용하여 구현한다.

구글 클라우드에서 데이터 전처리 방식

이러한 데이터 전처리는 다양한 컴포넌트를 이용해서 처리할 수 있는데, 어떤 방식이 있는지 살펴보기 전에 먼저 구글 클라우드 기반의 머신러닝 학습 파이프라인 아키텍처를 살펴보자. 아래는 일반적인 구글 클라우드 기반의 머신러닝 파이프라인 아키텍처이다.

<그림. 구글 클라우드 플랫폼 기반의 일반적인 머신러닝 학습 파이프라인 아키텍처 >

원본 데이터는 빅쿼리에 저장된다. (테이블 형태의 데이터가 아닌 이미지나 텍스트등은 클라우드 스토리지(GCS)에 저장된다.) 저장된 원본 데이터는 Dataflow를 이용해서 머신러닝 학습에 알맞은 형태로 전처리 된다. 학습/평가/테스트 셋으로 나누는 것을 포함해서, 가능하면 텐서플로우 파일형태인 *.tfrecord 형태로 인코딩 된후에, GCS 에 저장된다. 텐서플로우등으로 모델을 개발한 후에, trainer-package로 패키징을 하고, AI Platform 트레이닝에 이 모델을 업로드 한다. 업로드된 모델을 앞서 전처리된 데이터를 이용해서 학습이되고, 학습이 된 모델은 GCS에 저장된다. (텐서플로우에서 SavedModel로 저장한다.) GCS 에 저장된 모델은 AI Plaform 서빙 엔진에 배포되고 REST API를 이용하여 서빙된다. 클라이언트에서는 이 REST API를 이용하여 학습된 모델에 대한 서빙을 이용한다. 전체 워크플로우에 대한 파이프라인 관리는 Apache Airflow 매니지드 서비스인 Composer 를 이용한다. 또는 머신러닝에 특화된 파이프라인이기 때문에, AI Platform pipeline을 사용하는 것이 좋다.

Option A: 빅쿼리에서 데이터 전처리

일반적으로 빅쿼리를 이용한 전처리는 다음과 같은 시나리오에 유용하다.

Sampling : 데이터에서 랜덤하게 일부 데이터셋만 가지고 오는 용도

Filtering : 학습에 필요한 데이터만 WHERE 문을 이용해서 가지고 오는 용도

Partitioning : 데이터를 학습/평가/테스트 용도로 나누는 용도

주로 빅쿼리는 Dataflow로 데이터를 인입하기 전체 최초 전처리 용도로 사용이 되는데, 주의할점은 빅쿼리에 전처리 로직이 많을 경우 향후 서빙에서 재 구현이 필요할 수 있다. 무슨 이야기인가 하면, 서빙시에도 입력 데이터에 대한 동일한 전처리가 필요한데, 빅쿼리에서 SQL로 작성한 전처리 로직은 서빙시에는 사용할 수 없기 때문에, 자바나 파이썬으로 전처리 로직을 다시 구현해야 하는 이중작업이 될 수 있다. 물론 서빙이 빅쿼리에 있는 데이터를 사용하는 배치 서빙일 경우 문제가 없지만, 리얼타임으로 단건의 데이터에 대해서 서빙을 하는 경우에는 빅쿼리에서 서빙용 데이터를 전처리할 수 없다.

그럼에도 불구하고 배치 서빙용인 경우 전처리를 빅쿼리를 이용할 경우 편리하고 특히 Dataflow 에 데이터를 입력하기전에 Full pass transformation 이 필요한 전체 통계 데이터 (예를 들어 평균,분산,최소/최대값)은 SQL을 통해서 쉽게 뽑아낼 수 있는 장점이 있다.

Option B: Dataflow 에서 데이터 전처리

복잡한 데이터 변환 로직이 있는 경우등에 효율적으로 사용할 수 있는 방식인데, Instance level transformation 뿐만 아니라, full pass transformation, 그리고 window aggregation 타입 모두를 지원할 수 있다.

Dataflow는 Apache Beam 오픈소스 기반의 런타임이지만, 다양한 구현 방식을 지원하고 있다.

Apache Beam을 사용하는 방법 : 가장 일반적인 방식으로 Apache Beam Java/Python SDK 을 이용하여 데이터 변환 로직을 구현할 수 있다.

Tensorflow Transformation 을 사용하는 방법 : 텐서플로우의 경우 Tensorflow Transformation (이하 TFT) 이라는 이름으로 데이터 변환 프레임워크를 제공한다. TFT는 Apache Beam 기반으로 동작하는데, 텐서플로우 코드를 기반으로 하기 때문에, 머신러닝 개발자 입장에서는 접근이 상대적으로 쉬운 장점이 있다.

Dataflow SQL을 사용하는 방법 : 앞의 두 방식의 경우에는 Java나 Python 기반의 코딩이 필요한데, 이런 코딩 없이 Window aggregation이나, 기타 복잡한 로직을 구현하고자 할때 사용할 수 있는 방식이 Dataflow SQL이다.SQL을 사용하여 구현하지만, Dataflow의 함수등을 사용할 수 있는 장점이 있다.

Dataflow Template + UDF를 사용 하는 방법 : 복잡한 변환이 아니라 단순한 맵핑이나 문자열 변환들을 어렵지 않게 구현하는 방식으로 Dataflow는 Pre-built in 된 Template을 제공한다. 이 템플릿 중에는 비즈니스 로직을 자바스크립트로 넣을 수 있는 UDF 라는 방식을 지원하는데, Apache Beam 형태로 구현할 필요 없이 단순한 변환 로직을 자바스크립트로 구현하여 GCS에 파일을 저장하고, 설정 정보에서 자바 스크립트 파일만 지정하면되기 때문에, 쉽게 사용할 수 있다.

서빙시에도 다양한 아키텍처 구현이 가능한데, Pub/Sub 큐를 통해서 데이터를 실시간으로 인입한 데이터를 머신러닝 모델로 서빙한후에, Pub/Sub으로 내보내는 near realtime 서빙이 가능하고 또는 bigtable에 서빙 결과를 저장하여 마치 serving 결과에 대한 캐쉬식으로 사용하는 구조도 가능하다.

<그림. 스트림 데이터를 이용하여 서빙을 제공하는 아키텍처>

Option C: Tensorflow 모델 내에서 데이터 전처리

아니면 데이터 전처리를 Tensorflow 모델 코드내에서 하는 방식이 있다.

feature_column 를 이용하여 피처를 임베딩하거나, 버킷화 하는 방식이 있고

아니면 데이터를 피딩하는 input functions(train_input_fn, eval_input_fn, and serving_input_fn) 안에 데이터 전처리 로직을 구현하는 방법이 있다.

Custom estimator를 사용하는 경우에는 model_fn 자체에 데이터 전처리 로직을 넣을 수 있다.

이렇게 텐서 플로우 코드단에 전처리 기능을 넣는 경우는 Instance level transformation은 가능하지만 다른 방식에 대해서는 불가능하다. 그렇지만 이미지 데이터를 학습전에 rotation하거나 flip 하는 argumentation 등은 텐서플로우 코드에서 하게 되면 동적으로 데이터를 학습 단계에 argumentation할 수 있기 때문에 효율이 좋은 장점이 있다.

Option D: DataPrep을 이용한 데이터 전처리

구글 클라우드 플랫폼에서는 데이터의 특성을 분석하고 간단한 변환을 지원하기 위한 wrangling 도구로 DataPrep을 제공한다. Engineered feature 단계까지 데이터를 가공하는 것은 어려울 수 있겠지만, Raw data를 Prepared data 형태로 cleansing 하는 용도로는 충분히 사용할 수 있으며, 특히 시각화를 통한 데이터 분포나 아웃라이어 분석이나 단순 변환등에는 효과적으로 사용할 수 있다.

<그림 DataPrep 을 이용한 Wrangling 과정 예시>

Option E: DataProc을 이용한 데이터 전처리

DataProc은 Hadoop/Spark 에 대한 구글 매니지드 서비스이다. Apache Beam을 사용하는 Dataflow와 같이 코딩을 기반으로 한다는 점은 같지만, 기존에 Hadoop/Spark 에코 시스템에 익숙한 사용자들의 경우에는 기존의 에코 시스템과 개발 코드를 재활용할 수 있다는 장점을 가지고 있다.

데이터 전처리시 고려할점

그러면 이러한 기술을 이용해서 데이터를 전처리할때, 고려해야하는 점은 무엇이 있을까?

학습/서빙 데이터에 대한 스큐(skew)

모델을 학습하여, 서비스에 배포한후에, 향후 들어오는 데이터로 서빙을 하게 되는데, 이때 학습에서 사용한 데이터와 서빙시 사용한 데이터의 특성이 다를때 이를 training-serving skew 라고 한다.

예를 들어 피처 A가 학습시에 범위가 1~255 였는데, 서빙시에 1~500 사이로 들어오게 되면 이 모델의 서빙 결과는 정확하지 못하게 된다.

(참고 : 이런 문제를 해결하기 위해서 데이터의 분포나, 수학적 통계값을 저장해 놓은 후에, 서빙전에 검증하는 방식을 사용할 수 있으며 이는 Tensorflow data validation으로 구현이 가능하다. )

Full pass transformation

Option C의 텐서플로우 모델내의 데이터 변환 로직은 Full pass transformation을 지원하지 않기 때문에, feature scaling이나, normalization 적용이 불가능하다. 이러한 전처리 기법은 최소/최대값등의 통계 데이터가 필요한데, 이러한 데이터는 모델 학습전에 계산되어야 하고, 계산된 데이터는 어디에든 저장되어 있어야 하며, 학습과/서빙 단계에 모두 일관되게 사용될 수 있어야 한다.

성능 향상을 위한 Up front data loading

Option C 텐서플로우 모델내에 데이터 변환 로직을 구현할때, 고려해야 하는 사항이다.

모델 코드 상에 데이터 전처리 로직이 있을 경우, 아래 그림과 같이 데이터 변환 작업이 끝나면, 그 데이터로 모델을 학습 시키는 구조가 된다.

<그림. 데이터 전처리가 모델 학습전에 발생하여, 대기하는 현상>

이 경우에 데이터가 전처리되고 있는 동안에는 학습이 이루어지지 않기 때문에 자원이 낭비되는 문제가 발생하고, 모델의 학습 시간에 전처리 시간까지 포함되기 때문에 전체 학습시간이 상대적으로 오래걸린다.

Option B의 데이터 플로우를 사용하는 것처럼 미리 여러 학습에 사용될 데이터를 전처리를 해놓거나 아니면 아래 그림과 같이 병렬적으로 데이터 플로우에서 데이터를 전처리하면서 모델은 학습에만 전념하도록 하면, 모델의 전체학습 시간을 줄일 수 있다.

<그림. 병렬로 데이타 전처리를 해서 모델 학습을 최적화 하는 방식>

이를 up front data loading 이라고 하는데, 텐서플로우에서는 Prefetching, Interleave, Parallel mapping 등을 tf.data.DataSet에서 다양한 방식으로 이를 지원하고 있다.

Tensorflow Transform

텐서플로우 프레임웍은 이러한 데이터 변환을 위해서 Tensorflow Transform (이하 TFT) 라는 프레임웍을 데이터 전처리 기능을 제공한다. 이 TFT를 구글 클라우드에서 실행하게 되면, Dataflow를 기반으로 실행할 수 있다. (Option B)

tf.Transform 이라는 패키지로 제공된다. TFT는 instant level transformation 뿐만 아니라, full pass transformation, window aggregation 을 지원하는데, 특히 full pass transformation을 지원하기 위해서 데이터를 변환하기 전에 Analyze 라는 단계를 거치게 된다.

아래 그림이 TFT가 작동하는 전반적인 구조를 기술한것인데,

Analyze 단계에서는 데이터의 통계적인 특성 (최소,최대,평균 값등)을 추출하고, Transform 단계에서는 이 값을 이용하여, 데이터 변환을 수행한다. 각 단계는 tft_beam.AnalyzeDataset , tft_beam.TransformDataset 로 실행될 수 있으며, 이 두 단계를 tft_beam.AnalyzeAndTransformDataset 로 합쳐서 한번에 실행하는 것도 가능하다.

Analyze 단계 : Analyze 단계에서는 통계적인 값을 Full pass operation 을 통해서 계산해내는 것이외에도, transform_fn을 생성해내는 작업을 한다. transform_fn은 텐서플로우 그래프로, 데이터 변환에 대한 instance level operation 을 계산해낸 통계값을 사용해서 수행한다.

Transform 단계 : 데이터 변환 단계에서는 transform fn을 인입 데이터에 적용하여, instance level로 데이터를 변환하는 작업을 수행한다.

모델 학습시 데이터에 대한 전처리는 학습 데이터뿐만 아니라, 평가 (Eval) 데이터에도 동일하게 적용이 되어야 하는데, Analyze는 학습데이터에만 적용되서 데이터의 특성을 추출하고, 평가 데이터에는 별도로 Analyze를 수행하지 않고, 학습 데이터에서 추출된 데이터 특성을 그대로 사용한다

TFT pipeline export

transform_fn으로 구성된 데이터 변환 파이프라인은 내부적으로 텐서 플로우 그래프로 변환이 되는데, 학습된 텐서플로우 모델을 export 하여 SavedModel로 저장할때, 이 transform_fn 그래프가 서빙용 데이터 입력함수인 serving_input_fn에 붙어서 같이 export 된다. 이 말은, 학습에서 사용한 데이터 전처리 로직인 transform_fn이 그대로 서빙단에도 같이 적용된다는 이야기이다. 물론 full-pass transformation에서 계산한 통계값도 상수형태로 저장하게 된다. 그래서 입력값에 대해서 학습과 서빙시 같은 변환 로직을 사용할 수 있게 된다.

데이터 전처리 옵션 정리

앞서 설명한 데이터 변환 전처리 옵션을 Instance level transformation, full pass level transformation, window aggregation 에 따라 정리해보면 다음과 같다.

Disclaimer

본 글의 작성자는 Google 직원입니다. 그러나 본 글의 내용은 개인의 입장에서 작성된 글이며, Google의 입장을 대변하지 않으며, Google이 본 컨텐츠를 보장하지 않습니다.

References

Instance-level transformation (stateless transformation) Full pass during training instance -level during serving (stateful transformation) Real-time (window) aggregations during training and serving (streaming transformation) 배치 서빙 온라인 서빙 배치 서빙 온라인 서빙 배치 서빙 온라인 서빙 BigQuery (SQL) OK 같은 데이터 변환 로직을 학습과 서빙 단계에 적용 가능 가능은 하지만 권장하지 않음

서빙시에는 BigQuery가 아니라 다른 방식으로 데이터 변환 로직을 구현해야 하기 때문에 결과적으로 학습/서빙 Skew를 유발할 수 있음 가능

BigQuery에서 수학적 통계값(최소/최대)를 계산하여, 이 값을 이용하면 가능하다. 그러나 계산된 값을 별도로 저장해서 학습/서빙시에 사용해야 하기 때문에 구현이 번거롭다. N/A 가능은 하지만 권장하지 않음

BigQuery의 윈도우 함수등을 이용하여 구현은 가능하지만, 서빙시에는 BigQuery가 아닌 다른 툴로 구현을 해야 하기 때문에 학습/서빙 Skew가 발생할 수 있음 Dataflow (Apache Beam) OK 서빙시 데이터가 Pub/sub을 통해서 데이터 블로우로 들어오면 가능하지만, 그렇지 않은 경우 학습/서빙 데이터간 Skew가 발생할 수 있음 가능

Dataflow에서 수학적 통계값(최소/최대)를 계산하여, 이 값을 이용하면 가능하다. 그러나 계산된 값을 별도로 저장해서 학습/서빙시에 사용해야 하기 때문에 구현이 번거롭다. OK

동일한 Apache Beam 기반의 데이터 변환 로직이 학습을 서빙시 적용이 가능함 Dataflow (Apache Beam + TFT) 권장함

학습과 서빙의 Skew를 방지할 수 있고, 학습/서빙전 데이터를 미리 준비할 수 있음 권장함

데이터 변환 로직과, 모델 학습시에 계산된 통계 결과 텐서플로우 그래프 형태로 저장되서, 서빙 모델을 export할시에 같이 저장됨 Tensorflow

(input_fn & serving_input_fn) 가능은 하지만 권장하지 않음

학습과 서빙 효율성을 생각하면, 학습전에 데이터를 변환하는게 좋음 가능은 하지만 권장하지 않음

학습과 서빙 효율성을 생각하면, 학습전에 데이터를 변환하는게 좋음 불가능 불가능

[머신러닝 완벽가이드] 데이터 전처리 (Data Preprocessing)

첫번째 데이터 전처리 대상은 결측치(결손값), 즉 Null값에 대한 이슈를 해결하는 것입니다.

데이터 전처리를 통해 Null값을 다른 고정된 값으로 변환해야 합니다. 하지만 데이터의 특징에 따라 Null값을 어떻게 처리해야 할지 달라집니다.

1. 피처 값 중 Null값의 비율이 매우 작을 경우

위 경우에는 단순히 평균값, 최빈값 등으로 대체하는 방법이 있습니다.

2. 피처 값 대부분이 Null값인 경우

위 경우에는 과감히 해당 피처를 드롭하는 것이 ML 알고리즘 성능 개선이 더 효과적일 수 있습니다.

3. 중요한 피쳐의 Null값의 분포가 일정 수준 이상일 경우

위 경우가 Null값 처리의 핵심이 되겠습니다. 일정 수준의 기준은 데이터에 따라 달라질 수 있습니다. 또한 중요한 피처인 경우 1번, 2번 방식으로 결측치를 처리하게 되면 예측 왜곡이 심하게 나타날 수 있어 업무 로직, 필드 지식 등을 상세히 검토하여 더 정밀한 값으로 대체해야합니다.

머신러닝 (3)

Writer: Harim Kang

머신러닝 – 3. End-to-End Machine Learning Project (2)

해당 포스팅은 머신러닝의 교과서라고 불리는 Hands-On Machine Learning with Scikit-Learn & Tensor flow 책을 학습하며 정리하고, 제 생각 또한 함께 포스팅한 내용입니다. 아래의 포스팅에 이어진 내용입니다.

https://learning.oreilly.com/library/view/hands-on-machine-learning/9781491962282/ch02.html의 내용과 제 조사 및 생각을 함께 정리한 포스팅입니다.

2020/01/21 – [IT/Machine Learning] – 머신러닝 (2) – ML프로젝트를 위한 데이터 선택 및 준비 (using Scikit-Learn)

오늘의 포스팅은 위의 포스팅에 이어지는 데이터 전처리 과정에 대한 포스팅입니다. 해당 포스팅은 Data Cleaning, text or categorical feature encoding, Data Transformation, Data Scaling, Pipeline에 대한 내용을 포함하고 있으며, Scikit-learn 라이브러리 메서드를 사용한 전처리에 대해 포스팅하였습니다.

데이터 전처리

데이터 전처리는 기존의 데이터를 머신러닝 알고리즘에 알맞은 데이터로 바꾸는 과정입니다. 이 전처리 과정은 모델이 생선 된 이후에도 예측하고자 하는 새로운 데이터에도 적용하는 과정입니다. 또한, 전처리 과정을 통해서 더욱더 모델 학습의 성능을 높일 수 있습니다.

데이터 전처리 과정

Data Cleaning Handling Text and Categorical Attributes Custom Transformers Feature Scaling Transformation Pipelines

Data Cleaning

대부분의 머신러닝 알고리즘은 Missing feature, 즉 누락된 데이터가 있을 때, 제대로 역할을 하지 못합니다. 그래서 첫번째 방법으로 먼저 Missing feature에 대해 처리해주어야 합니다.

불 필요 데이터 제거(처리) dropna() : pandas에서 제공하는 누락 데이터를 제거하는 함수입니다. Na/NaN과 같은 누락 데이터를 제거하는 함수입니다. axis: 파라미터 값으로 0을 주면 행 제거, 1을 주면 열 제거입니다. default값은 0입니다. subset: array, 특정 feature를 지정하여 해당 Feature의 누락 데이터 제거가 가능합니다.

전체 속성 제거 : 연관성 없는 feature의 경우, 학습에 방해가 될 수 있기 때문에 제거합니다. drop() : pandas에서 제공하는 특정 데이터 열(또는 행)을 제거하는 함수입니다. 특정 행 또는 열의 라벨(데이터)들을 제거합니다. labels: 제거할 데이터를 지정하는 파라미터입니다. axis: 파라미터 값으로 0을 주면 행 제거, 1을 주면 열 제거입니다. default값은 0입니다.

누락 데이터에 특정 값을 지정 : zero(0으로 채우기), the mean(평균값으로 채우기), the median(중간값으로 채우기) 등등의 값을 누락 데이터에 채우는 방식입니다. fillna() : pandas에서 제공하는 누락 데이터에 특정 값을 채우는 함수입니다. 특정 메서드를 지정하여 Na/NaN값을 채웁니다. value: scalar, dict, series or dataframe, value 등 구멍을 메우기 위한 값

scikit-learn에서 제공하는 클래스 Imputer() class missing_values: int or ‘NaN’ strategy: ‘median'(중앙값), ‘mean'(평균값), ‘most_frequent'(최빈값) axis: 0(columns), 1(rows) 사용법 Imputer Class를 선언합니다. 채우고자 하는 값을 함께 정의합니다. from sklearn.preprocessing import Imputer imputer = Imputer(strategy=’median’) fit() 함수를 사용하여 기존 데이터의 누락 데이터에 채워야 할 값을 imputer 객체에 훈련시킵니다. imputer.fit(dataset) transform() 함수를 사용하여 기존 데이터의 누락 데이터를 변환합니다. X = imputer.transform(dataset)

문자와 카테고리형 데이터 다루기

대부분의 ML알고리즘들은 숫자 데이터로 학습하는 것을 선호합니다. 기존 데이터 세트에 텍스트가 있는 경우 이것을 숫자형 데이터로 인코딩해주어야 합니다. 방법은 아래와 같습니다.

Encoding Encoding text to number method : factorize(), OrdinalEncoder() One-Hot Encoding method : OneHotEncoder()

예제로 사용할 데이터 >>> housing_cat = housing[[“ocean_proximity”]] >>> housing_cat.head(10) ocean_proximity 17606 <1H OCEAN 18632 <1H OCEAN 14650 NEAR OCEAN 3230 INLAND 3555 <1H OCEAN 19480 INLAND 8879 <1H OCEAN 13685 INLAND 4937 <1H OCEAN 4861 <1H OCEAN >>> housing_categories Index([‘<1H OCEAN', 'INLAND', 'ISLAND', 'NEAR BAY', 'NEAR OCEAN'], dtype='object') factorize() Pandas에서 제공하는 메서드로서, 숫자형 또는 카테고리형으로 인코딩을 해주는 함수입니다. 여러 개의 카테고리형 input feature들을 인코딩할 수 있습니다. 파라미터 values: a 1-D array, factorization전의 배열 sort: bool, default False, 관계를 유지하면서 unipue 한 카테고리 label을 준비합니다. Returns labels: ndarray, 인코딩 된 결과를 배열로 리턴합니다. uniques: ndarray, 카테고리를 배열로 리턴합니다. housing_cat_encoded, housing_categories = housing_cat.factorize() [0 0 1 2 0 2 0 2 0 0 2 2 0 2 2 0 3 2 2 2 0] OrdinalEncoder() Scikit-learn에서 제공하는 factorize 역할의 클래스라고 생각하면 될 거 같습니다. OrdinalEncoder객체를 생성해서, inputer와 비슷한 방식으로 사용합니다. 대신, fit_transform() 메서드를 사용하여, fit과 transform을 한 번에 제공합니다. from sklearn.preprocessing import OrdinalEncoder ordinal_encoder = OrdinalEncoder() housing_cat_encoded = ordinal_encoder.fit_transform(housing_cat)** > housing_cat_encoded[:10] > array([[0.], > > > [0.], > [4.], > [1.], > [0.], > [1.], > [0.], > [1.], > [0.], > [0.]]) >

위의 factorize()와 OrdinalEncoder()와 같은 카테고리형 텍스트를 단순히 순서에 맞게 숫자형으로 바꾸어주는 방법은 문제점이 있습니다. 예를 들어 위의 함수들을 사용해서 변환시키면 <1H OCEAN변수는 0이고, NEAR OCEAN변수는 4입니다. 각각 변수들은 0~4까지 있는데, 1 같은 경우 0과 비슷하다고 ML알고리즘은 판단할 수 있습니다. 실제로는 비슷하지 않지만, 알고리즘은 숫자에 의미를 두어 거리를 판단하게 되는 경우가 생깁니다. 이를 방지하기 위해서 나온 것인 One-Hot Encoder입니다. OneHotEncoding() Scikit-learn에서 제공하는 클래스로, 카테고리형 특징들을 one-hot 숫자형 배열로 인코딩해주는 클래스입니다. 오직 하나로 해당되는 부분만 1(Hot)로, 나머지는 0(Cold)으로 바꾸는 방법입니다. from sklearn.preprocessing import OneHotEncoder cat_encoder = OneHotEncoder() > housing_cat_1hot = cat_encoder.fit_transform(housing_cat) > housing_cat_1hot > <16512x5 sparse matrix of type '‘ > with 16512 stored elements in Compressed Sparse Row format> 위와 같은 코드로 사용합니다. OrdinalEncoder와 비슷한 방식으로 사용됩니다. 아래에는 numpy배열로 변환한 코드입니다. >>> housing_cat_1hot.toarray() array([[1., 0., 0., 0., 0.], [1., 0., 0., 0., 0.], [0., 0., 0., 0., 1.], …, [0., 1., 0., 0., 0.], [1., 0., 0., 0., 0.], [0., 0., 0., 1., 0.]])

Custom Transformers

Scikit-learn에서는 다양한 데이터 변환기(Transformer)들을 제공합니다. 이를 이용하여, 커스텀 변환기를 만들 수 있습니다. 이를 위해서는 세 가지 메서드를 알아야 합니다.

fit() x: input data x라는 데이터에 특정 알고리즘 또는 전처리를 적용하는 메서드입니다. 이를 통해 변환기에 알맞는 파라미터를 생성합니다.

transform() x: input data fit()을 통해 생성된 파라미터를 통해서 모델을 적용시켜 데이터 세트를 알맞게 변환시키는 메소드입니다.

fit_transform() 같은 데이터 세트를 사용하여 fit과 transform을 한 번에 하는 메서드입니다. from sklearn.base import BaseEstimator, TransformerMixin rooms_ix, bedrooms_ix, population_ix, households_ix = 3, 4, 5, 6 class CombinedAttributesAdder(BaseEstimator, TransformerMixin): def __init__(self, add_bedrooms_per_room = True): # no *args or **kargs self.add_bedrooms_per_room = add_bedrooms_per_room def fit(self, X, y=None): return self # nothing else to do def transform(self, X, y=None): rooms_per_household = X[:, rooms_ix] / X[:, households_ix] population_per_household = X[:, population_ix] / X[:, households_ix] if self.add_bedrooms_per_room: bedrooms_per_room = X[:, bedrooms_ix] / X[:, rooms_ix] return np.c_[X, rooms_per_household, population_per_household, bedrooms_per_room] else: return np.c_[X, rooms_per_household, population_per_household] attr_adder = CombinedAttributesAdder(add_bedrooms_per_room=False) housing_extra_attribs = attr_adder.transform(housing.values)

위의 코드는 rooms_per_household, population_per_household 두 변수의 데이터를 생성하는 코드입니다.

위의 코드를 통해 이해한 내용으로는, fit함수 작성을 통해 데이터 세트를 받아서 객체를 return 하고, transform을 통해 데이터 세트를 실질적으로 변환(생성)시킨다는 것을 알 수 있습니다.

Feature Scaling

숫자형으로 다 바꾼 데이터를 바로 학습시킨다면 좋은 성능을 가진 모델이 될까요? 일반적인 ML 알고리즘들은 아주 다양한 범위의 숫자형 데이터를 학습시킨다면 제대로 성능을 보여주지 못합니다.

예를 들어, 특정 데이터의 범위가 -500~39,320이라면 아주 다양한 데이터가 존재합니다. 이러한 상태에서는 제대로 된 학습을 잘하지 못합니다. 이를 방지하기 위해서 숫자형 데이터의 범위를 줄여주는 방법을 사용합니다.

Min-Max Scaling (Normalization) 최솟값과 최댓값을 확인하여 이 값들을 모두 지정한 범위(대체로 0과 1 사이)의 상대적인 값으로 변환시키는 방법입니다. 특정 범위를 지정하면 해당 범위 안으로 바인딩시키는 방법입니다. Scikit-learn에서는 MinMaxScaler(feature_range, copy) class를 제공합니다. feature_range: tuple(min, max), default=(0, 1), 변환하고자 하는 데이터의 변환 지정 범위입니다. copy: Boolean, 변환 이전의 값들을 복사해 둘 것인지에 대한 여부입니다. from sklearn.preprocessing import MinMaxScaler a = [[10, 2, 1], [9, 2, 1], [8, 2, 1], [6, 2, 5], [2, 8, 10]] scaler = MinMaxScaler(feature_range=(0,1)) a = scaler.fit_transform(a) >>> print(a) [ [1. 0. 0.] [0.875 0. 0.] [0.75 0. 0.] [0.5 0. 0.44444444] [0. 1. 1.]]

Standardization 특정 범위에 값을 바인딩하지 않습니다. 특정 알고리즘(ex. Neural Network)에서는 사용되지 않는 방식입니다. 특이점(이상점)의 영향이 적습니다. Scikit-learn에서는 StandardScaler() 클래스를 제공합니다. from sklearn.preprocessing import StandardScaler a = [[10, 2, 1], [9, 2, 1], [8, 2, 1], [6, 2, 5], [2, 8, 10]] scaler = StandardScaler() a = scaler.fit_transform(a) >>> print(a) [ [1.06066017 -0.5 -0.73130714] [0.70710678 -0.5 -0.73130714] [0.35355339 -0.5 -0.73130714] [0.35355339 -0.5 0.39378077] [-1.76776695 2. 1.80014064]]

ML Pipeline

위의 데이터 전처리 방식들은 아주 다양한 컴포넌트들로 이루어져 있습니다. 매번 데이터 정제마다 같은 순서를 반복하기 싫다면, Pipeline이라는 방식을 사용하면 됩니다.

Pipeline은 Data Processing Component들의 순서를 정의해놓은 것입니다.

데이터 변환을 조작하고 적용하는 방법입니다.

각각의 컴포넌트들과 교류하며 사용합니다.

ML 워크플로우의 자동화를 돕는 방법입니다.

Scikit-Learn에서는 Pipeline Class를 제공합니다. 이것은 데이터 변환 단계의 순서를 정리하고 만들기 쉽게 합니다.

Parameter steps: list, list of tuple

마지막에 사용되는 estimator는 반드시 데이터 변환 단계를 필요로 합니다. (fit_transform이 포함되어야 합니다.) from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler num_pipeline = Pipeline([ (‘imputer’, SimpleImputer(strategy=”median”)), (‘attribs_adder’, CombinedAttributesAdder()), (‘std_scaler’, StandardScaler()), ]) housing_num_tr = num_pipeline.fit_transform(housing_num)

위의 코드에서, Pipleline클래스에 imputer, 특성 추가, StandardScaler()를 모두 선언하여 데이터가 해당 순서에 맞춰 진행되도록 하는 코드입니다.

다음 포스팅에서는 이어서 ML 알고리즘, 모델 선정, 학습, 평가 등에 관한 내용을 작성할 예정입니다.

머신러닝 입문 관련 데이터 세트 프로젝트는 아래의 github 레포지토리에 있습니다.

https://github.com/harimkang/Scikit-Learn-Example

Reference

머신러닝 데이터 전처리 과정

반응형

데이터 분석을 하기 위해 데이터를 가져왔을 때 가장 먼저 확인해야 하는 것들을 정리해보고자 한다.

01. 데이터 구조 확인

가장 먼저 내가 분석할 데이터가 어떤 구조, 형태로 이루어진 데이터인가?를 확인해야 한다. 데이터 구조는 간단히 보자면 크게 2가지로 나눌 수 있다.(더 세부적으로 나눌 수도 있지만 우선은 크게 보자면!)

-정형 데이터 : ‘표’형태의 데이터

-비정형 데이터 : 이미지, 소리, 영상, 신호 등

02. 판다스 사용 : import pandas

우선 표 형태의 정형 데이터를 가져왔을 때 확인해야 할 기본적인 사항들에 대해 정리해보자.

파이썬에서는 정형 데이터를 처리할 때 pandas라는 라이브러리를 사용한다. 따라서 이 라이브러리를 사용하기 위해서는 import pandas 로 판다스를 임포트 해주고, 그 pandas를 앞으로 pd로 줄여 사용하기 위해 as pd를 적어준다.

03. 데이터 불러오기 : read_csv(‘파일명’)

이때, 내가 불러올 csv파일과 스크립트가 같은 폴더에 위치해야 쉽게 불러올 수 있다.

04. columns(열)과 row(행)의 개수 확인 : shape( )

05. DataFrame 상위 5개 추출 : head( )

columns, row, values 확인

06. DataFrame을 조금 더 자세히 확인 : info( )

1) row 개수

2) columns개수

3) 데이터 타입 (int:정수형 , object:문자형, float :실수형)

4) Missing value (비어있는 값)

5) 데이터 타입별 칼럼 수

6) 데이터 타입의 용량

07. 데이터 타입 확인

: 데이터 타입에 따라 분석방법과 결과가 달라지기 때문에 데이터 타입을 정확하게 알고 전처리하는 것이 중요하다.

1) 숫자(연속형) 데이터

describe()

describe() 함수를 쓰면 숫자형 데이터 값들에 대한 정보를 볼 수 있다.(object타입의 칼럼은 제외됨)

1) count : Not Nill인 데이터의 개수

2) mean : 전체 데이터의 평균

3) std : 표준편차

4) min : 최솟값

5) max : 최댓값

6) 사분위 범위(IQR) : 전체 데이터의 50%가 존재하는 구간

2) 문자(범주형) 데이터

unique()

unique( )를 사용하여 [‘Pclass’]라는 columns에 들어있는 항목들 확인(중복 제거된 상태로)

value_counts() :범주형 데이터에서 각 항목의 개수 확인

각 항목별로 몇 개의 데이터가 있는가?를 확인할 때 value_counts( ) 함수를 사용한다. 즉, unique()함수를 써서 ‘Pclass’라는 칼럼에 어떤 값들이 들어있는지 확인한 뒤, value_counts()를 사용하여 그렇다면 각 값들이 몇 개씩 있는지 확인하는 것이다.

3) columns가 많은 경우에 문 자형 columns만 빨리 확인하고 싶을 때

먼저 describe()를 이용하여 연속형 columns를 가져온 뒤, columns를 이용하여 숫자 데이터 칼럼의 이름들만 추출해서 가져온다. 그리고 tolist()를 이용하여 그 이름들을 리스트 형태로 만들어준다.

다음으로 데이터 프레임의 모든 칼럼들을 리스트로 만들어준다.

연속형 데이터 칼럼은 a로 선언하고, 전체 칼럼은 b로 선언한다.

set을 이용하여 b(전체 칼럼)에서 a(연속형 데이터가 들어있는 칼럼)의 중복을 제거해주면 범주형 데이터 칼럼만 남게 된다. 이것을 list( )를 사용하여 다시 리스트 형태로 만들어준다.

범주형 데이터 칼럼만 추출한 것을 c로 선언한 뒤, [ ]를 사용해보면 범주형 데이터 칼럼에 해당되는 것만 뽑아서 확인할 수 있다.

반응형

ML Studio(클래식)에 대한 데이터 준비 – Azure Architecture Center

목차

향상된 기계 학습을 위한 데이터 준비

아티클

09/22/2022

읽는 데 13분 걸림

기여자 6명

이 문서의 내용

데이터 전처리 및 정리는 모델 학습에 데이터 세트를 사용할 수 있기 전에 수행해야 하는 중요한 작업입니다. 원시 데이터는 노이즈가 많고, 불안정하고, 값이 누락된 경우가 종종 있습니다. 이러한 데이터를 모델링에 사용하면 결과가 잘못될 수 있습니다. 이러한 작업은 TDSP(팀 데이터 과학 프로세스)의 일부이며 일반적으로 필요한 전처리를 검색하고 계획하는 데 사용되는 데이터 세트의 초기 탐색을 수행합니다. TDSP 프로세스에 대한 자세한 지침은 팀 데이터 과학 프로세스에 설명된 단계를 참조하세요.

데이터 검색 작업 등의 전처리 및 정리 작업은 데이터가 저장된 위치와 포맷 방식에 따라 R 또는 Python 등의 다양한 도구 및 언어와 함께 SQL, Hive 또는 Azure Machine Learning 스튜디오(클래식)와 같은 다양한 환경에서 수행할 수 있습니다. TDSP는 반복 성향을 띠기 때문에, 이러한 작업은 프로세스의 워크플로 내의 다양한 단계에서 발생할 수 있습니다.

이 문서에서는 Azure Machine Learning 스튜디오(클래식)에 데이터를 수집하기 전후에 수행할 수 있는 다양한 데이터 처리 개념과 작업을 소개합니다.

Azure Machine Learning 스튜디오(클래식) 내부에서 수행된 데이터 검색 및 전처리의 예제는 데이터 전처리 비디오를 참조하세요.

데이터 전처리 및 정리가 필요한 이유

실제 데이터는 다양한 소스 및 프로세스에서 수집되며 데이터 세트의 품질을 떨어트리는 이상값 또는 손상된 값이 포함될 수 있습니다. 다음과 같은 일반적인 데이터 품질 문제가 자주 발생합니다.

불완전 : 데이터에 특성이 없거나 값이 누락되었습니다.

: 데이터에 특성이 없거나 값이 누락되었습니다. 노이즈가 많은 : 데이터에 잘못된 레코드 또는 이상값이 있습니다.

: 데이터에 잘못된 레코드 또는 이상값이 있습니다. 불일치: 데이터에 충돌하는 레코드 또는 일치하지 않는 값이 있습니다.

우수한 예측 모델을 구축하려면 우수한 데이터가 필요합니다. “쓰레기를 넣고 쓰레기를 얻는 현상”을 방지하고 데이터 품질을 높여서 궁극적으로 모델 성능을 높이려면 데이터 상태 검사를 수행하여 조기에 데이터 문제를 발견하고 적절한 데이터 처리 및 정리 단계를 결정하는 것이 중요합니다.

가장 일반적으로 사용되는 데이터 상태 검사 방법으로 어떤 것이 있습니까?

다음을 검사하여 데이터의 전체적인 품질을 확인할 수 있습니다.

레코드 수.

수. 특성 (또는 기능 ) 수.

(또는 ) 수. 특성 데이터 유형 (명목, 서수 또는 연속).

(명목, 서수 또는 연속). 누락된 값 의 수.

의 수. 잘 구성된(Well-Formed) 데이터. 데이터가 TSV 또는 CSV로 되어 있으면 열 구분 기호 및 줄 구분 기호가 열과 줄을 항상 올바르게 구분하는지 확인합니다. 데이터가 HTML 또는 XML 형식이면 해당 표준에 따라 올바르게 구성되었는지 확인합니다. 또한 반 구조적 데이터 또는 구조화되지 않은 데이터에서 구조적 정보를 추출하려면 구문 분석이 필요할 수 있습니다.

데이터. 일관되지 않은 데이터 레코드. 값의 범위가 허용되는지 확인하세요. 예를 들어, 데이터에 학생 GPA(Grade Point Average)가 포함되어 있으면 GPA가 지정된 범위(예: 0~4) 내에 있는지 확인합니다.

데이터 문제를 찾으면 처리 단계가 필요합니다. 처리 단계에서는 누락된 값 정리, 데이터 정규화, 분할, 텍스트 처리를 통해 데이터 정렬, 일반 필드의 혼합된 데이터 형식 등에 영향을 미칠 수 있는 포함된 문자를 제거 및/또는 대체하는 작업이 수행됩니다.

Azure Machine Learning에서는 올바르게 구성된 테이블 형식 데이터를 사용합니다. 데이터가 이미 테이블 형식이면 Machine Learning에서 Azure Machine Learning 스튜디오(클래식)를 사용하여 바로 데이터 전처리를 수행할 수 있습니다. 데이터가 테이블 형식이 아닌 XML 형식이라고 한다면 데이터를 테이블 형식으로 변환하려면 구분 분석이 필요할 수 있습니다.

데이터 전처리의 주요 작업

데이터 정리 : 누락된 값을 입력하고, 시끄러운 데이터와 이상값을 검색하고 제거합니다.

: 누락된 값을 입력하고, 시끄러운 데이터와 이상값을 검색하고 제거합니다. 데이터 변환 : 차원 및 노이즈를 줄이기 위해 데이터를 정규화합니다.

: 차원 및 노이즈를 줄이기 위해 데이터를 정규화합니다. 데이터 감소 : 데이터 처리를 용이하게 하는 샘플 데이터 레코드 또는 특성입니다.

: 데이터 처리를 용이하게 하는 샘플 데이터 레코드 또는 특성입니다. 데이터 불연속화 : 특정 기계 학습 방법에서 쉽게 사용할 수 있도록 연속 특성을 범주 특성으로 변환합니다.

: 특정 기계 학습 방법에서 쉽게 사용할 수 있도록 연속 특성을 범주 특성으로 변환합니다. 텍스트 정리: 탭으로 구분된 데이터 파일에 포함된 탭, 레코드 줄 바꿈 문제를 일으킬 수 있는 포함된 새 줄 등 데이터 정렬 문제를 일으킬 수 있는 포함된 문자를 제거합니다.

아래 섹션에서는 일부 데이터 처리 단계에 대해 자세히 설명합니다.

누락된 값을 처리하는 방법

누락된 값을 처리하려면 누락된 값이 문제 해결에 더 나은 이유를 먼저 확인하는 것이 좋습니다. 일반적인 누락 값 처리 방법은 다음과 같습니다.

삭제 : 값이 누락된 레코드를 제거합니다.

: 값이 누락된 레코드를 제거합니다. 더미 대체 : 누락된 값을 더미로 대체합니다. 예를 들어 범주 값은 알 수 없음, 숫자 값은 0으로 대체합니다.

: 누락된 값을 더미로 대체합니다. 예를 들어 범주 값은 알 수 없음, 숫자 값은 0으로 대체합니다. 평균 대체 : 누락된 값이 숫자이면 평균으로 대체합니다.

: 누락된 값이 숫자이면 평균으로 대체합니다. 빈도 대체 : 누락된 값이 범주이면 가장 빈도가 높은 항목으로 대체합니다.

: 누락된 값이 범주이면 가장 빈도가 높은 항목으로 대체합니다. 회귀 대체: 회귀 메서드를 사용하여 누락된 값을 회귀된 값으로 대체합니다.

데이터를 정규화하는 방법

데이터 정규화는 숫자 값을 지정된 범위로 다시 스케일링합니다. 일반적인 데이터 정규화 방법은 다음과 같습니다.

최소-최대 정규화 : 0과 1 사이에서 데이터를 선형적으로 범위로 변환합니다. 여기서 최소값은 0, 최대값은 1로 조정됩니다.

: 0과 1 사이에서 데이터를 선형적으로 범위로 변환합니다. 여기서 최소값은 0, 최대값은 1로 조정됩니다. Z 점수 정규화 : 평균 및 표준 편차를 기반으로 데이터 조정: 데이터와 평균의 차이를 표준 편차로 나눕니다.

: 평균 및 표준 편차를 기반으로 데이터 조정: 데이터와 평균의 차이를 표준 편차로 나눕니다. 소수점 배열: 특성 값의 소수점을 이동하여 데이터 크기를 조정합니다.

데이터를 분할하는 방법

연속 값을 명목 특성 또는 간격으로 변환하여 데이터를 분할할 수 있습니다. 다음은 이 작업을 수행하는 방법 중 일부입니다.

동일 너비 범주화 : 특성의 모든 가능한 값 범위를 크기가 같은 N개의 그룹으로 나누고 bin 번호를 사용하여 bin에 속하는 값을 할당합니다.

: 특성의 모든 가능한 값 범위를 크기가 같은 N개의 그룹으로 나누고 bin 번호를 사용하여 bin에 속하는 값을 할당합니다. 동일 높이 범주화: 특성의 모든 가능한 값 범위를 인스턴스 수가 같은 N개의 그룹으로 나누고 bin 번호를 사용하여 bin에 속하는 값을 할당합니다.

데이터를 줄이는 방법

데이터를 쉽게 처리할 수 있도록 데이터 크기를 줄이는 다양한 방법이 있습니다. 데이터 크기 및 도메인에 따라 다음 방법을 적용할 수 있습니다.

레코드 샘플링 : 데이터 레코드를 샘플링하고 데이터에서 대표적인 하위 집합만 선택합니다.

: 데이터 레코드를 샘플링하고 데이터에서 대표적인 하위 집합만 선택합니다. 특성 샘플링 : 데이터에서 가장 중요한 특성의 하위 집합만 선택합니다.

: 데이터에서 가장 중요한 특성의 하위 집합만 선택합니다. 집계: 데이터를 여러 그룹으로 나누고 각 그룹에 대한 숫자를 저장 합니다. 예를 들어 어떤 식당 체인의 지난 20년 간 일일 수익을 월별 수익으로 집계하면 데이터 크기를 줄일 수 있습니다.

텍스트 데이터를 정리하는 방법

표 형식 데이터의 텍스트 필드에 열 정렬 및/또는 레코드 경계에 영향을 미치는 문자가 포함될 수 있습니다. 예를 들어, 탭으로 구분된 파일에 포함된 탭은 열 정렬 문제를 일으킬 수 있고, 포함된 줄 바꿈 문자는 레코드 줄 바꿈 문제를 일으킬 수 있습니다. 텍스트를 쓰고 읽는 동안 텍스트 인코딩 처리가 잘못되면 정보가 손실되고, 읽을 수 없는 문자(예: null)가 의도치 않게 도입되며, 텍스트 구문 분석에 영향을 미칠 수도 있습니다. 데이터를 올바르게 정렬하고 구조화되지 않은 데이터 또는 반 구조적 데이터에서 구조적 데이터를 추출할 수 있도록 텍스트 필드를 정리하려면 신중한 구문 분석 및 편집 작업이 필요할 수 있습니다.

데이터 탐색을 통해 초기에 데이터를 살펴볼 수 있습니다. 이 단계에서 다양한 데이터 문제를 파악하고 그에 맞는 적절한 방법을 적용하여 이러한 문제를 해결할 수 있습니다. 문제의 원인이 무엇인지, 문제가 어떻게 시작되었는지 등의 질문에 대한 답을 고민해 보는 것이 중요합니다. 이 프로세스를 통해 문제 해결에 필요한 데이터 처리 단계를 결정할 수 있습니다. 최종 사용 사례 및 가상 사용자 식별을 사용하여 데이터 처리 작업의 우선 순위를 지정할 수도 있습니다.

참조

[머신러닝] 데이터 전 처리하기

[출처] 2021 NIPA AI 온라인 교육

데이터 분석 및 전처리 단계 : 수집한 데이터를 분석하고 머신러닝에 사용할 형태로 변환시키는 단계

크롤링이나 DB 데이터를 통해 수집된 데이터를 머신러닝에 학습시키기 위해서는 데이터 전 처리 과정이 필요하다.

데이터 전 처리는 크게 3가지 역할을 한다.

머신러닝의 입력 형태로 데이터 변환 (피처 엔지니어링) 결측값 및 이상치를 처리하여 데이터 정제 학습용 및 평가용 데이터 분리

1. 데이터 변환

실제 학습에 사용되는 데이터 셋은 이미지, 자연어, 범주형, 시계열 등 다양한 데이터 형태를 가지고 있다.

대부분의 머신러닝 모델은 숫자 데이터를 입력으로 받으며, 대부분의 원본 데이터는 머신러닝 모델이 학습할 수 없는 형태로 되어있다.

따라서 학습에 사용할 데이터는 머신러닝 모델이 학습할 수 있는 수치형 자료로 변환이 필요하다.

[출처] 2021 NIPA AI 온라인 교육

2. 데이터 정제

결측값은 값이 측정되지 않은 것으로 일반적인 머신러닝의 입력값으로 사용할 수 없다.

Null, None, NaN 등의 결측값을 처리하는 방법은 다음과 같다.

결측값이 존재하는 샘플 삭제

결측값이 많이 존재하는 변수 삭제

결측값을 다른 값으로 대체

이상치가 존재하면 모델의 성능 저하를 유발할 수 있다.

이상치는 일반적으로 전 처리 과정에서 제거하며, 이상치를 판단하는 기준이 중요하다.

이상치인지 판단하는 방법은 다음과 같다

통계지표(카이제곱 검정, IQR 지표 등)를 사용하여 판단

데이터 분포를 보고 직접 판단

머신러닝 기법을 사용하여 이상치 분류

3. 데이터 분리

데이터 분리는 머신러닝 모델의 성능을 평가하기 위해서 필요하다.

학습에 사용된 데이터로 평가할 수 없기 때문에 초기 데이터 셋에서 일정 비율로 학습용, 평가용 데이터를 분리한다.

일반적으로 7 : 3 ~ 8 : 2 로 학습용 : 평가용 데이터를 분리함.

※ 지도학습의 경우에는 입력 값인 Feature 데이터와 예측 대상인 Label 데이터로 분리하여 저장함.

파이썬 데이터 전처리 흐름

1. 데이터 불러오기

import numpy as np import pandas as pd #데이터 시각화 라이브러리 import matplotlib.pyplot as plt import seaborn as sns #dataframe 형태로 읽어오기 data=pd.read_csv(“data.csv”, encoding=’euc-kr’) #상위 5개 데이터 data.head() #데이터 타입 data.dtypes #데이터 column 이름 data.columns.values #dataframe 모양 (행, 열) data.shape #dataframe 정보 요약 data.info() # 수치형 변수의 데이터 정보 요약 data.describe()

head(N), tail(N) 함수를 통해 상위 N개, 하위 N개 데이터 확인이 가능함.

info 함수의 출력 값으로 Column, Non-Null Count, Dtype 정보를 알 수 있음.

Non-Null Count의 값이 0인 변수는 데이터 정제 단계에서 삭제

2. 데이터 정제

결측값 처리

#각 열의 빈 데이터 개수 확인 data[[column1,…]].isna().sum() #모든 열의 빈 데이터 개수 확인 data.isna().sum() #drop 함수를 통한 값이 없는 변수 삭제 corona_del = corona.drop(columns = [column1, … ]) #결측값 정보 출력 data.isnull().sum() #해당 변수의 결측값만 삭제 data = data[~data[column].isnull()] #모든 변수의 결측값 삭제 data = data.dropna()

값이 없는 변수 삭제

변수에 결측값이 존재하는 샘플 삭제

중복값 제거

#중복값 확인 data[data.duplicated(keep=False)] #제거 전 df 길이 print(len(df)) #중복값 제거 data = data.drop_duplicates() #제거 후 df 길이 print(len(df))

이상치 제거

#소수점을 갖는 이상치 처리 data = data[data[column]-np.floor(data[column]) == 0][column] #정제된 dataframe 정보 corona_del.info()

소수점을 가지는 이상치 삭제 (소수점인 데이터를 이상치라고 판단)

3. 데이터 분리

from sklearn.model_selection import train_test_split #예측해야하는 label 데이터를 제외한 feature 데이터 X = data.drop(columns=[label 데이터]) #예측해야하는 label 데이터 y = data[label 데이터] # sklearn의 train_test_split으로 쉽게 분리 가능 x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)

sklearn에서 제공하는 train_test_split을 통해 쉽게 훈련용, 테스트용 데이터 분리 가능

머신 러닝 데이터 전처리 | [14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법 1149 명이 이 답변을 좋아했습니다

We are using cookies to give you the best experience on our website.

You can find out more about which cookies we are using or switch them off in settings.

머신러닝 2_5 데이터 전처리(Preprocessing)

반응형

결손값 처리 (Null/ NaN 처리)

데이터 인코딩(레이블, 원-핫 인코딩) 머신러닝알고리즘은 문자열 데이터 속성을 입력값으로 받지않기 때문에 문자형이 아닌 숫자형으로 표현 되어야한다. 레이블인코딩 – 남, 여 → 1, 0 , 숫자값이기 때문에 의도하지 않아도 1이 더크다는 의미로 영향을 받는 알고리즘이 있을수있다. 따라서 회귀에는 적용하지말고 tree 계열 ML 알고리즘은 적용가능 , 이러한 문제점을 해결하기위해 나온것이 원핫 인코딩이다. 사이킷런의 LabelEncoder 클래스 , fit() 과 transform() 을 이용하여 변환 원핫(One-hot) 인코딩 -feature 값의 유형에 따라 새로운 피처를 추가 해서 고유값에 해당하는 컬럼에만 1을 표시 하고 나머지 컬럼에는 0 을 표시 하는 방식이다. -성별_남(남자일때 1) ,성별_여 (여자일때 1) 사이킷런의 OneHotEncoder 클래스 fit() 과 transform() 을 이용하여 숫자형으로 변환 – 인자로 이차원ndarray 입력 필요, Sparse 배열 형태로 변환되며 toarray() 를 적용하여 다시 Dense 형태로 변환 되어야함. pd.get_dummies(DataFrame) 을 이용 하면 쉽게 원핫 인코딩 가능 – 확인

데이터 스케일링

이상치 제거

Feature 선택 , 추출 및 가공

데이터인코딩

1. 레이블인코딩

2. 원-핫인코딩 (One-Hot encoding)

피처 스케일링과 정규화

데이터 스케일(Scale) : 변수를 구성하는 값 들의 크기 , 규모, 범위를 의미

feacure scaling : 서로 다른 변수의 값 범위를 일정한 수준으로 맞추는 작업

Feature Scaling을 하는 이유는?

변수 값의 범위 또는 단위가 달라서 발생 가능한 문제를 예방할 수 있다. 머신러닝 모델이 특정 데이터의 편향성을 갖는 걸 방지할 수 있다. 즉 데이터 범위 크기에 따라 모델이 학습하는 데 있어서 bias(편향)가 달라질 수 있으므로 하나의 범위 크기로 통일해주는 작업이 필요할 수 있다.

Feature Scaling 종류

표준화- 데이터의 피처 각각이 평균이 0 이고 분산이 1인 가우시안 정규분포를 가진 값으로 변환하는 것을 의미 (데이터분포의 중심을 0으로)

정규화- 서로 다른 피처의 크기를 통일하기 위해 크기를 변환해주는 개념, 일반적으로 이상치 제거후 정규화

사이킷 런에서

StandardScaler: Sklrean(사이킷런)에서 제공하는 표준화를 위한 클래스이며, 개별 변수를 평균이 0이고 분산이 1인 가우시안 정규 분포를 가질 수 있도록 값을 변환해준다. StandardScaler 사용 시 주의할 점 Scaler에 의해 변환된 데이터는 ndarray 형식이므로 데이터 관리의 용이성을 위해 DataFrame 형식으로의 명시적 변환이 필요할 수 있다. 변수의 최소값과 최대값 크기를 제한하지 않음 ,

따라서 이상값(outlier) 있는 경우 평균과 표준편차에 영향을 미치기 때문에 데이터 분포 (확산)에 영향을 미침.

MinMaxScaler: 데이터값을 0과 1사이의 범위값으로 변환(음수값이 있으면 -1 에서 1값으로 변환) , 데이터 분포가 가우시안분포가 아닐경우 적용

선형, 회기는 스케일링 해주는것이 좋고 tree 분류는 스케일링에 크게 영향을 받지 않는다.

머신러닝 모델은 학습 데이터를 기반으로 학습되기 때문에 반드시 테스트 데이터는 학습데이터 스케일링 기반에 따라야 하고 테스트 데이터 에 다시 fit() 을 적용하면안되고 scaler 객체를 이용해 transform() 을 적용해야한다.

Scaler를 사용하는 이유:

데이터가 가진 크기과 편차가 다르기 때문에 한 피처의 특징을 너무 많이 반영하거나 패턴을 찾아내는데 문제가 발생하기 때문이다

StandardScaler

MinMaxScaler

반응형

데이터 전처리

728×90

오늘은 머신러닝을 공부하는데 어쩌면 기본중에 기본이라고 할 수 있는 데이터 전처리에 대해 알아보겠다.

[사실 나도 이해하는데 조금 힘들었다. 아니, 잘 모르겠다. 그래도 적어보겠다]

본 내용은 ‘혼자 공부하는 머신러닝 + 딥러닝’ 교재를 이용하여 배운 것을 토대로 작성합니다.

위 머신러닝 공부를 할때 사용하는 IDE는 ‘구글 코랩’ 입니다.

코랩 사용법을 익히고 오시길 바랍니다.

또한 파이썬의 기초적인 지식을 알아야 합니다.

위 코드들은 각자의 파일이 아닌 하나의 파일에 작성된 코드들입니다.

들어가기 전에

저번 시간에 훈련 세트와 테스트 세트로 나눈 머신러닝 프로그램을 가지고 완벽하게 구분해 내는것을 사장님께 보여주고, 실전에 투입해도 괜찮다라는 승낙을 받게되었다. 하지만, 며칠 뒤에 갑자기 사장님이 급하게 필자를 부르는 것이다.

음..조금 문제가 생긴듯 하네, 길이가 25cm이고 무게가 150g이면 도미인데 자네가 준 모델은 빙어라고 예측하네.

무엇이 문제였을까 확인해보자.

넘파이로 데이터 준비하기

일단 처음처럼 도미와 빙어 데이터를 준비하겠다.

fish_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0, 9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0] fish_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0, 6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

전에는 이 리스트는 순회하면서 원소를 하나씩 꺼내 생선 하나의 길이와 무게를 이중 리스트로 직접 구성했었다.

하지만 저번 시간에 넘파이를 배웠으니 간편하게 만들수가 있다.

import numpy as np np.column_stack(([1,2,3], [4,5,6])

넘파이의 column_stack() 함수는 전달받은 리스트를 일렬로 세운 다음 차례대로 나란히 연결한다.

예를 들어보자면, 다음과 같은 간단한2개의 리스트를 나란히 붙여보자. 연결할 리스트는 파이썬 튜플로 전달한다.

array([[1, 4], [2, 5], [3, 6]])

[1,2,3] 과 [4,5,6] 두 리스트를 일렬로 세운 다음 나란히 옆으로 붙였다. 만들어진 배열의 (3,2) 크기의 배열이다.

즉 3개의 행이 있고 2개의 열이 있다라는 말이다.

그럼 이제 이 방법으로 fish_length 와 fish_weight를 합치겠다.

fish_data = np.column_stack((fish_length, fish_weight))

위와 방법은 동일하다.

print(fish_data[:5])

[[ 25.4 242. ] [ 26.3 290. ] [ 26.5 340. ] [ 29. 363. ] [ 29. 430. ]]

기대했던 대로 잘 연결되었다.

넘파이 배열을 출력하면 리스트처럼 한줄로 길게 출력되지 않고 행과 열을 맞추어 가지런히 정리된 모습으로 보여준다.

동일한 방법으로 타깃 데이터도 만들어보자.

저번 시간에는 리스트[1],[0]을 여러 번 곱해서 타깃 데이터를 만들었다. 하지만 이것마저 넘파이에 더 좋은 방법이 있다.

print(np.ones(5)) # 원하는 수만큼 1과 0을 채워주는 함수

np.ones() 함수와 np.zero() 함수이다. 이 두 함수는 각각 원하는 개수의 1과 0을 채운 배열을 만들어준다.

[1. 1. 1. 1. 1.]

위에 코드에서 np.ones() 함수로 1을 5개 생성했다.

이 방법으로 1이 35개인 배열과 0이 14개인 배열을 간단히 만들 수 있다. 그 다음 두 배열을 그대로 연결하면 된다.

np.column_stack() 함수를 사용하지 않고 첫 번째 차원을 따라 배열을 연결하는 np.concatenate() 함수를 사용한다.

fish_target = np.concatenate((np.ones(35), np.zeros(14)))

np.concatenate() 함수를 사용해 타깃 데이터를 만들었다. np.column_stack() 과 마찬가지로 배열을 튜플로 전달해야 한다.

[1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

잘 만들어진 듯 하다.

넘파이 배열은 핵심 부분이 C,C++과 같은 저수준 언어(Low Level Language)로 개발되어서 빠르고, 데이터 과학 분야에 알맞게 최적화 되었이다.

이제 다음 차례는 훈련 세트와 테스트 세트를 나눌 차례이다.

사이킷런으로 훈련 세트와 테스트 세트 나누기

사이킷런은 머신러닝 모델을 위한 알고리즘뿐만 아니라 다양한 유틸리티 도구도 제공한다.

대표적인 도구가 바로 지금 사용할 train_test_input() 함수이다. 이 함수는 전달되는 리스트나 배열을 비율에 맞게 훈련 세트와 테스트 세트로 나누어 준다. 물론 나누기 전에 알아서 섞어준다.

from sklearn.model_selection import train_test_split

사용법은 아주 간단하다. 나누고 싶은 리스트나 배열을 원하는 만큼 전달하면 된다. 우리는 fish_data 와 fish_target을 나누겠다.

그리고 나오는 결과를 같게 하기위해 저번 시간에 np.random.seed() 함수를 사용해서 필자와 결과가 같아지도록 만들었었다.

train_test_split() 함수에는 친절하게도 자체적으로 랜덤 시드를 지정할 수 있는 random_state 매개변수가 있다.

다음과 같이 훈련 세트와 테스트 세트를 나눈다.

train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, random_state=42)

fish_data와 fish_target 2개의 배열을 전달했으므로 2개씩 나뉘어 총 4개의 배열이 반환된다.

차례대로 처음 2개는 입력 데이터 (train_input, test_input), 나머지 2개는 타깃 데이터(train_target, test_target)이다.

랜덤 시드는 42로 지정했다.

이 함수는 기본적으로 25%를 테스트 세트로 떼어낸다.

잘 나누었는지 넘파이 배열의 shape 속성으로 입력 데이터의 크기를 출력해보겠다.

print(train_input.shape, test_input.shape) print(train_target.shape, test_target.shape)

(36, 2) (13, 2) (36,) (13,)

훈련 데이터와 테스트 데이터를 각각 36개와 1개로 나누었다.

입력 데이터는 2개의 열이 있는 2차원 배열이고 타깃 데이터는 1차원 배열이다.

도미와 빙어는 잘 섞였는지 확인해보자.

print(test_target)

[1. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

13개의 테스트 세트 중에 10개가 도미(1)이고 ,3개가 빙어(0)이다. 잘 섞인 것 같지만 빙어의 비율이 조금 모자라다.

원래 도미와 빙어의 개수가 35개와 14개이므로 비율은 2.5:1이다. 근데 이 테스트 세트의 비율은 3.3:1이다.

여기서도 저번에 본 샘플링 편향이 조금 나타났다.

이처럼 무작위로 데이터를 나누었을 때 샘플이 골고루 섞이지 않을 수 있다.

훈련 세트와 테스트 세트에 샘플의 클래스 비율이 일정하지 않으면 모델이 일부 샘플을 올바르게 학습 할 수 없을 것이다.

train_test_split()함수는 이러한 문제를 간단히 해결할 방법이 있다.

stratify 매개변수에 타깃 데이터를 전달하면 클래스 비율에 맞게 데이터를 나눈다. 훈련 데이터가 작거나 특정 클래스의 샘플 개수가 적을 때 특히 유용하다.

train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify=fish_target, random_state=42)

아까 선언한 train_test_split() 함수 매개변수에 stratify 매개변수만 추가해주자.

print(test_target)

[0. 0. 1. 0. 1. 0. 1. 1. 1. 1. 1. 1. 1.]

빙어가 하나 더 늘었다. 이제 테스트 세트의 비율이 2.25:1이 되었다. 이건 데이터가 작아서 전체 훈련 데이터의 비율과 동일하게 맞출 수 없다. 하지만 꽤 비슷한 비율이다.

자 모든 데이터가 준비됐다. 문제를 해결해보자.

수상한 도미 한 마리

앞에서 준비했던 데이터로 k-최근접 이웃 알고리즘을 훈련해 보겠다.

from sklearn.neighbors import KNeighborsClassifier kn = KNeighborsClassifier() kn.fit(train_input,train_target) kn.score(test_input, test_target)

1.0

테스트 세트의 도미와 빙어를 모두 올바르게 분류했다.

그럼 이 모델에 아까 오류를 일으킨다고 말했던 도미의 데이터를 넣어보고 결과를 확인해보자.

[0.]

아쉽게도 아직도 빙어라고 구분한다.

그럼 이 샘플을 다른 데이터와 함께 산점도로 그려보자. 눈으로 보면 이해라도 가지 않겠는가?

import matplotlib.pyplot as plt plt.scatter(train_input[:,0], train_input[:,1]) plt.scatter(25,150, marker=’^’) plt.xlabel(‘length’) plt.ylabel(‘weight’) plt.show()

위 코드의 산점도이다.

새로운 샘플은 삼각형으로 표시했다.

이상하다. 이 샘플은 분명히 오른쪽 위로 뻗어있는 다른 도미 데이터에 더 가깝다.

왜 이 모델은 왼쪽 아래에 낮게 깔린 빙어 데이터에 가깝다고 판단한걸까?

k-최근접 이웃 알고리즘은 주변의 샘플 중에서 다수인 클래스를 예측으로 사용한다. 이 샘플의 주변 샘플을 알아보자.

KNeighborsClassifier 클래스는 주어진 샘플에서 가장 가까운 이웃을 찾아주는 kneighbors() 메소드를 제공한다. 이 메소드는 이웃까지의 거리와 이웃 샘플의 인덱스를 반환한다. KNeighborsClassifier 클래스의 이웃 개수인 n_neighbors의 기본값은 5이므로 5개의 이웃이 반환된다.

distances, indexes = kn.kneighbors([[25,150]])

indexes 배열을 사용해 훈련 데이터 중에서 이웃 샘플을 따로 구분해 그려보겠다.

plt.scatter(train_input[:,0], train_input[:,1]) plt.scatter(25,150, marker=’^’) plt.scatter(train_input[indexes,0], train_input[indexes,1], marker=’D’) # marker=’D’로 지정하면 산점도를 마름모로 그린다. plt.xlabel(‘length’) plt.ylabel(‘weight’) plt.show()

위 코드의 산점도이다.

marker=’D’로 지정하면 산점도를 마름모로 그린다.

삼각형 샘플에 가장 가까운 5개의 샘플이 초록 다이아몬드로 표시되었다. 역시 예측 결과와 마찬가지로 가장 가까운 이웃에 도미가 하나밖에 포함되지 않았다. 나머지 4개의 샘플은 모두 빙어이다.

직접 데이터를 확인해 보자.

print(train_input[indexes]) print(train_target[indexes])

[[[ 25.4 242. ] [ 15. 19.9] [ 14.3 19.7] [ 13. 12.2] [ 12.2 12.2]]] [[1. 0. 0. 0. 0.]]

길이가 25cm , 무게가 150g인 생선에 가장 가까운 이웃에는 빙어가 압도적으로 많다.

따라서 이 샘플의 클래스를 빙어로 예측하는 것은 무리가 아니다. 왜 가장 가까운 이웃을 빙어라고 생각한 걸까?

산점도를 보면 직관적으로 도미와 가깝게 보이는데 말이다.

이 문제의 해결 실마리를 찾기 위해 kneighbors() 메소드에서 반환한 distances 배열을 출력해 보겠다.

이 배열에는 샘플까지의 거리가 담겨있다.

print(distances)

[[ 92.00086956 130.48375378 130.73859415 138.32150953 138.39320793]]

뭔가 이상한걸 눈치챘나? 어떻게 문제를 해결할 수 있을까?

기준을 맞춰라

아까 산점도를 다시 보자.

아까 봤던 산점도이다.

삼각형 샘플에 가장 가까운 첫 샘플까지의 거리는 92, 그 외 가장 가까운 샘플들은 모두 130,138 이다.

그런데 거리가 92와 130이라고 했을 때 그래프에 나타난 거리 비율이 이상하다.

대충 보아도 92의 거리보다 족히 몇 배는 되어 보이는데 겨우 거리가 130이란게 이상하다는 것이다. 뭐가 문제일까?

바로 x축은 범위가 좁고(10~40), y축은 범위가 넓다(0~1000). 따라서 y축으로 조금만 멀어져도 거리가 아주 큰 값으로 계산되는 것이다.

이 때문에 오른쪽 위의 도미 샘플이 이웃을 선택되지 못했던 것이다.

이를 눈으로 명확히 확인하기 위해 x축의 범위를 동일하게 0~1,000으로 맞추어 보겠다.

멧플롯립에서 x축의 범위를 지정하려면 xlim() 함수를 사용한다.(비슷하게 y축의 범위를 지정하려면 ylim() 함수를 사용한다.)

plt.scatter(train_input[:,0], train_input[:,1]) plt.scatter(25,150, marker=’^’) plt.scatter(train_input[indexes,0], train_input[indexes,1], marker=’D’) plt.xlim((0,1000)) # 맷플롯립에서 x 축 범위를 지정하는 함수. plt.xlabel(‘length’) plt.ylabel(‘weight’) plt.show()

위 코드의 산점도이다.

산점도가 거의 일직선으로 나타난다! x축과 y축의 범위를 동일하게 맞추었더니 모든 데이터가 수직으로 늘어난 형태가 되었다.

확실히 이런 데이터라면 생선의 길이(x축)는 가장 가까운 이웃을 찾는데 크게 영향을 미치지 못할 것 이다. 오로지 생선의 무게(y축) 만 고려 대상이 된다.

두 특성(길이와 무게)의 값이 놓인 범위가 매우 다르다. 이를 두 특성의 스케일(scale)이 다르다라고도 말한다.

특성 간 스케일이 다른 일은 매우 흔한 일이다. 어떤 사람이 방의 넓이를 재는데 세로는 cm로, 가로는 inch로 쟀다면 정사각형의 방도 직사각형이 되는건 순식간이다.

데이터를 표현하는 기준이 다르다면 알고리즘이 올바르게 예측할 수가 없다. 알고리즘이 거리 기반 일 때 특히 더 그렇다.

여기에는 k-최근접 이웃 알고리즘도 포함된다. 이런 알고리즘들을 샘플 간의 거리에 영향을 많이 받으므로 제대로 사용하려면 특성값을 일정한 기준으로 맞춰 주어야 한다. 이런 작업을 데이터 전처리(data preprocessing)라고 부른다.

가장 널리 사용하는 전처리 방법 중 하나는 표준점수(standard score)이다.(혹은 z점수라고도 부른다)

표준점수는 각 특성값이 0에서 표준편차의 몇 배만큼 떨어져 있는지를 나타낸다.

이를 통해 실제 특성값의 크기와 상관없이 동일한 조건으로 비교할 수있다.

계산하는 방법은 간단하다. 평균을 빼고 표준편차를 나누어 주면 된다. 넘파이는 편하게도 이 두 함수를 모두 제공한다.

mean = np.mean(train_input, axis=0) # mean() 함수는 평균을 계산한다. std = np.std(train_input, axis=0) # std() 함수는 표준편차를 제공한다.

np.mean() 함수는 평균을 계산하고, np.std() 함수는 표준편차를 계산한다. train_input은 (36,2) 크기의 배열이다.

특성마다 값의 스케일이 다르므로 평균과 표준편차는 각 특성별로 계산해야 한다. 이를 위해 axis=0으로 지정했다.

이렇게 하면 행을 따라 각 열의 통계 값을 계산한다.

계산된 평균과 표준편차를 출력해보면,

print(mean,std)

[ 27.29722222 454.09722222] [ 9.98244253 323.29893931]

각 특성마다 평균과 표준편차가 구해졌다.

이제 원본 데이터에서 평균을 빼고 표준편차로 나누어 표준점수를 변환하겠다.

train_scaled = (train_input – mean) / std

이건 어떻게 계산이 되는걸까? 넘파이는 똑똑하게도 train_input의 모든 행에서 mean에 있는 두 평균값을 빼준다.

그다음 std에 있는 두 표준편차를 다시 모든 행에 적용한다. 이런 넘파이 기능을 브로드캐스팅(broadcasting)이라고 부른다.

전처리 데이터로 모델 훈련하기

앞에서 표준점수로 변환한 train_scaled를 만들었다.

그럼 이제 아까 문제의 빙어 표시 샘플을 다시 산점도로 그려보겠다.

plt.scatter(train_scaled[:,0], train_scaled[:,1]) plt.scatter(25,150, marker=’^’) plt.xlabel(‘length’) plt.ylabel(‘weight’) plt.show()

위 코드의 산점도이다.

엥, 우리가 예상했던거와는 또 다르다. 오른쪽 꼭대기 위에 삼각형 샘플 하나 빼고 다 왼쪽 하단에 몰려있다. 하지만 이건 당연하다.

훈련 세트를 mean(평균)으로 빼고 std(표준편차)로 나누어 주었기 때문에 값의 범위가 크게 달라졌다.

그러니까 샘플도 동일한 비율로 변환 시켜줘야 한다라는 뜻이다.

여기에 아주 중요한 점이 하나 있다. 바로 훈련 세트의 mean,std를 이용해서 변환해야 한다는 점이다. 사실 샘플 하나만으로는 평균과 표준편차를 구할 수도 없다. 그럼 동일한 기준으로 샘플을 변환하고 산점도를 다시 그려보자.

new = ([25,150] – mean) / std plt.scatter(train_scaled[:,0], train_scaled[:,1]) plt.scatter(new[0],new[1], marker=’^’) plt.xlabel(‘length’) plt.ylabel(‘weight’) plt.show()

위 코드의 산점도이다.

이 그래프는 앞서 표준편차로 변환하기 전의 산점도와 거의 동일하다. 크게 달라진 점은 x축과 y축의 범위가 -1.5 ~ 1.5 사이로 바뀌었다는 점이다. 훈련데이터의 두 특성이 비슷한 범위를 차지하고 있다. 이제 이 데이터셋으로 k-최근접 이웃 모델을 다시 훈련해보자.

kn.fit(train_scaled, train_target)

훈련을 마치고 테스트 세트로 평가할 때는 주의해야 한다. 앞서 수상한 샘플을 훈련 세트의 평균과 표준편차로 변환해야지 같은 비율로 산점도를 그릴 수 있었다. 마찬가지로 테스트 세트도 훈련 세트의 평균과 표준편차로 변환해야 한다. 그렇지 않으면 훈련한 모델이 쓸모 없어 지게된다. 자 이제 테스트 세트의 스케일을 변환 해보자.

test_scaled = (test_input – mean) / std # test_input 도 표준점수와 동일한 비율로 바꿔줘야 한다.

테스트 해보자!

kn.score(test_scaled, test_target)

1.0

역시 100%의 정확도를 보여준다. 모든 테스트 세트의 샘플을 완벽하게 구분했다.

그럼 아까 말썽을 일으키던 수상한 생선의 샘플은 어떨까? 아까 훈련 세트의 평균과 표준편차로 변환한 샘플을 사용해 예측 해보자.

print(kn.predict([new]))

[1.]

도미로 예측을 했다! 확실히 길이가 25cm 이고 무게가 150g인 생선은 도미일 것이다.

마지막으로 kneighbors() 함수로 이 샘플의 k-최근접 이웃을 구한 다음 산점도로 그려 보겠다.

특성을 표준점수로 바꾸었기 때문에 k-최근접 이웃 알고리즘이 올바르게 거리를 측정했을 것이다.

plt.scatter(train_scaled[:,0], train_scaled[:,1]) plt.scatter(new[0], new[1], marker=’^’) plt.scatter(train_scaled[indexes,0], train_scaled[indexes,1], marker=’D’) plt.xlabel(‘length’) plt.ylabel(‘weight’) plt.show()

위 코드의 산점도이다.

아까 보았던 수상한 생선에서 가장 가까운 샘플은 모두 도미이다. 따라서 이 수상한 샘플을 도미로 예측하는 것이 당연하다.

특성값의 스케일에 민감하지 않고 안정적인 예측을 할 수 있는 모델을 만들었다.

스케일이 다른 특성 처리 – 정리

우리가 만든 모델은 완벽하게 테스트 세트를 분류했었다. 하지만 사장님이 가져온 샘플에서는 엉뚱하게 빙어라고 예측을 한것이다. 그래프를 그려보아도 이 샘플은 도미에 가까운데 말이다.

이는 샘플의 두 특성인 길이와 무게의 스케일이 다르기 때문이다. 길이보다 무게의 크기에 따라 예측값이 좌지우지된다.

대부분의 머신러닝 알고리즘은 특성의 스케일이 다르면 잘 작동하지 않는다.

이를 위해 특성을 표준점수로 변환했다. 사실 특성의 스케일을 조정하는 방법은 여러가지가 존재 하지만, 대부분의 경우 표준점수로 충분하다. 또 가장 널리 사용하는 방법이기도 하다.

데이터를 전처리할 때 주의할 점은 훈련 세트를 변환한 방식 그대로 테스트 세트를 변환해야 한다는 것이다. 그렇지 않으면 특성값이 엉뚱하게 변환될 것이고, 그것이 곧 모델이 잘 작동하지 않는 길로 인도하게 될 것이기 때문이다.

이제 우리는 원인을 해결하고 새로운 모델을 제출했다!

728×90

키워드에 대한 정보 머신 러닝 데이터 전처리

다음은 Bing에서 머신 러닝 데이터 전처리 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법

  • 머신러닝
  • 데이터
  • 준비하기
  • 친절한AI
  • 인공지능
  • Artificial Intelligence
  • Machine Learning
  • Data
  • Preprocessing
  • 데이터 전처리
[14] #머신러닝, #데이터 #준비 #방법 #- #데이터 #제공 #사이트, #전처리 #방법


YouTube에서 머신 러닝 데이터 전처리 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [14] 머신러닝, 데이터 준비 방법 – 데이터 제공 사이트, 전처리 방법 | 머신 러닝 데이터 전처리, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  빛 번짐 효과 | ❓무엇이든물어뽀샵 148 - 신비로운 글로우효과(Glow Effect)는 어떻게 만드나요? 153 개의 베스트 답변

Leave a Reply

Your email address will not be published. Required fields are marked *