본문 바로가기

Machine Learning_모델설계_Python

데이터 전처리_1

안녕하세요 배도리입니다. 이제 넘파이, 판다스 이후 데이터 전처리에 대해서 배워보겠습니다. 데이터 전처리는 데이터 분석 또는 기계 학습 모델에 데이터를 입력하기 전에 데이터를 정리, 변환 및 조작하는 과정을 말합니다. 이는 원본 데이터의 품질을 향상시키고 분석 또는 모델링 작업의 정확성과 신뢰성을 향상시키는 데 도움을 줍니다. 데이터 분석 또는 기계 학작업의 성공을 결정짓는 중요한 요소입니다. 데이터가 적절하게 전처리되지 않으면 모델이 잘 작동하지 않거나 부정확한 결과를 제공할 수 있습니다. 따라서 데이터 전처리는 분석 과정에서 필수적인 단계로 여겨집니다. 저 또한 프로젝트 및 공모전을 준비하면서 데이터 전처리가 상당히 중요하다는것을 몸소 깨달았습니다. 머신러닝 모델을 학습하기 이전에 꼭 데이터 전처리에 대해 공부합시다!

 

 

1. 데이터 전처리란

▪ 데이터 전처리는 데이터의 품질을 올리는 과정이며 데이터의 품질은 데이터 분석의 90%를 좌우한다.

▪ ML 모델에 훈련 데이터를 입력하기 전에 데이터를 가공합니다.

▪ 넘파이나 판다스 같은 머신러닝의 핵심 도구, 맷플롯립과 시본 같은 데이터 시각화 도구를 활용하여 실제 데이터를 정리합니다.

 

▪ 데이터 전처리 과정

▪ 데이터 실수화: 컴퓨터가 이해할 수 있는 값으로의 변환

▪ 불완전한 데이터 제거: NULL, NA, NAN 값의 제거 (혹은 특정 값으로 채움)

▪ 잡음 섞인 데이터 제거

- 가격 데이터에 있는 (-) 값 제거

- 연령 데이터 중 과도하게 큰 값 제거  예) 나이 값으로 200, 300, 400 등의 값이 존재하는 경우

▪ 모순된 데이터 제거

- 남성 데이터 중 주민번호가 ‘2’로 시작하는 경우

▪ 불균형 데이터 해결

-과소표집(undersampling), 과대표집(oversampling)

 

 

2. 데이터 전처리 방법

데이터 실수화(Data Vectorization) ▪ 범주형 자료, 텍스트 자료, 이미지 자료 등을 실수로 구성된 형태로 전환하는 것

 

데이터 정제(Data Cleaning) ▪ 없는 데이터는 채우고, 잡음 데이터 제거하고, 모순 데이터를 올바른 데이터로 교정하는 것

 

데이터 통합(Data Integration) ▪ 여러 개의 데이터 파일을 하나로 합치는 과정

 

 데이터 변환 (Data Transformation) ▪ 데이터를 정규화 하거나, 로그를 씌우거나, 평균값을 계산하여 사용하거나, 사람 나이 등을 10대, 20대, 30대 등으로 구간화 하는 작업

 

데이터 균형 (Data Balancing) ▪ 특정 클래스의 관측치가 다른 클래스에 비해 매우 낮을 경우 샘플링을 통해 클래스 비율을 맞추는 작업

 

 

 데이터 실수화

▪ 범주형 자료, 텍스트 자료, 이미지 자료 등을 실수로 구성된 형태로 전환

▪ 2차원 자료의 예시

- [n_sample, n_features]

- 2차원 자료는 행렬 혹은 2차원 텐서(2-dimensional tensor)라 불림

▪ 자료의 유형에는 연속형 자료 (Continuous data), 범주형 자료 (Categorical data), 텍스트 자료 (Text data)

 

범주형 자료

One-hot encoding을 이용한 데이터 실수화입니다.

▪ 범주형 데이터의 개수(집합의 크기)를 벡터의 차원으로 하고, 오직 하나의 차원에만 1을 부여함으로써 데이터를 구별하는 인코딩 방식입니다.

• 표현하고 싶은 집합 원소의 인덱스에만 1의 값을, 나머지 인덱스에는 0을 부여하는 벡터 표현 방식입니다.

• 차원의 저주(curse of dimensionality)라는 단점이 있습니다.

1. 데이터의 희소성: 원핫인코딩은 대부분의 열에 0 값을 가지는 희소한 데이터를 생성합니다. 이는 많은 0 값을 가진 열이 있고 실제로 중요한 정보를 가진 열은 매우 적은 값을 가지는 경우를 의미합니다.
2. 계산 비용 증가: 고차원 데이터에서는 데이터 처리 및 분석 작업에 필요한 계산 비용이 증가합니다. 
3. 과적합 가능성: 고차원 데이터에서는 모델이 훈련 데이터에 과도하게 적합되어 일반화 성능이 저하될 수 있습니다. 

 

다음은 Scikit-Learn 라이브러리를 이용하여 범주형자료를 전처리하는 과정입니다.

 

Scikit-Learn의 DictVectorizer 함수(Python 딕셔너리 형태의 데이터를 벡터 형태로 변환해주는 기능을 제공)

• sparse = True (디폴트옵션: 메모리 공간의 낭비를 줄임)

• sparse = False (범주형 자료의 수량화 결과를 눈으로 확인할 수 있음)

x=[{'city':'Paris','temp':1.0},
   {'city':'Seoul','temp':10.0},
   {'city':'Sydney', 'temp':20.0}]
x
[{'city': 'Paris', 'temp': 1.0},
{'city': 'Seoul', 'temp': 10.0},
{'city': 'Sydney', 'temp': 20.0}]
 
 
from sklearn.feature_extraction import DictVectorizer
vec=DictVectorizer(sparse=False
vec.fit_transform(x)  # x를 범주형 수량화 수량화 자료로 변환
array(
[[ 1., 0., 0., 1.],
[ 0., 1., 0., 10.],
[ 0., 0., 1., 20.]])

 

• sparse = False 로 한다면 밀집배열로 바꿔주는 겁니다. 밀집 배열(Dense Array)은 배열의 모든 원소가 메모리에 연속적으로 저장되는 데이터 구조를 말합니다. 대부분의 원소가 0이 아닌 값을 가지며, 메모리 사용량이 상대적으로 높습니다. 

 

• sparse = True 로 한다면 희소행렬(Sparse Matrix)로 변환됩니다. 희소행렬 행렬의 원소 값이 대부분 0으로 채워진 행렬이며 불필요한 0 값이 대부분이므로 메모리 낭비가 심합니다.  행렬의 크기가 클수록 연산 시 많은 시간이 소요됩니다.

vec1=DictVectorizer(sparse=True) #메모리를 줄임(디폴트옵션)
x1=vec1.fit_transform(x)
x1
<3x4 sparse matrix of type '<class 'numpy.float64'>' with 6 stored elements in Compressed Sparse Row format>

 

 

텍스트 자료

▪ 단어의 출현 횟수를 이용한 데이터 실수화가 적용됩니다. 간단한 그림으로 살펴보겠습니다.

text=['떴다 떴다 비행기 날아라 날아라',
      '높이 높이 날아라 우리 비행기',
      '내가 만든 비행기 날아라 날아라',
      '멀리 멀리 날아라 우리 비행기']
text
['떴다 떴다 비행기 날아라 날아라',
'높이 높이 날아라 우리 비행기',
'내가 만든 비행기 날아라 날아라',
'멀리 멀리 날아라 우리 비행기']
 

 

 Scikit-Learn의 CountVectorizer(텍스트 데이터를 단어 빈도수를 기반으로 벡터화할 때 사용)

from sklearn.feature_extraction.text import CountVectorizer
vec2=CountVectorizer()
#텍스트 데이터를 벡터화합니다. 이렇게 하면 문장들이 단어 빈도수를 기반으로 벡터화되고, 결과는 희소 행렬(sparse matrix)로 반환됩니다.
t=vec2.fit_transform(text).toarray()  #희소 행렬을 밀집 배열(dense array) 형태로 변환합니다.
 
import pandas as pd
t1=pd.DataFrame(t, columns=vec2.get_feature_names_out())
t1

toarray() 함수를 사용하여 희소 행렬을 밀집 배열 형태로 변환하는 주된 이유는 데이터 처리 및 분석에 따라 밀집 배열 형태가 더 적합한 경우가 있기 때문입니다. 하지만 주의할 점은, 희소 행렬을 밀집 배열로 변환할 때 메모리 사용량이 급격히 증가할 수 있으므로, 데이터의 크기와 메모리 제한을 고려해야 합니다. 특히 대규모 데이터를 다룰 때는 밀집 배열로 변환하는 것이 불가능할 수도 있습니다. . 

 

 

▪ 출현 횟수가 정보의 양과 비례하는 것이 아니므로, TF-IDF 기법을 이용해야 합니다.

TF-IDF(Term Frequency Inverse Document Frequency): 자주 등장하여 분석에 의미를 갖지 못하는 단어의 중요도를 낮추는 기법입니다. (예: The, a 등의 관사)

– 가중치 재계산: 높은 빈도의 단어가 여러 문서에 등장할 수록 가중치가 낮아집니다.

 

from sklearn.feature_extraction.text import TfidfVectorizer
tfid=TfidfVectorizer() 
# sparse=True가 디폴트 옵션으로 설정되어 있습니다. 이는 반환된 벡터가 희소 행렬 형태로 저장
 
x2=tfid.fit_transform(text).toarray()
# 주어진 텍스트 데이터(text)를 fit_transform() 함수를 사용하여 TF-IDF 벡터로 변환
# 그 후, toarray() 함수를 사용하여 희소 행렬을 밀집 배열 형태로 변환
 
x3=pd.DataFrame(x2,columns=tfid.get_feature_names_out())
#열 이름으로 TF-IDF 벡터의 특성 이름을 사용
 
x3
 

 

다음 게시글에는  나머지 전처리방법에 대해 다루겠습니다.

'Machine Learning_모델설계_Python' 카테고리의 다른 글

데이터 전처리_3  (0) 2023.05.07
데이터 전처리_2  (1) 2023.05.05
Pandas_3 그룹별 집계  (2) 2023.05.03
Pandas_2 데이터 추출  (1) 2023.05.02
Pandas_1 개요  (3) 2023.05.01