ML에서 데이터 타입들에 따라 다르게 전처리 한다.

 

예를 들어 범주형과 수치형으로 나눌수 있다.

범주형 수치형
숫자값으로는 의미를 안가짐 숫자값으로 의미를 가짐
소형, 중형, 대형 170cm, 164.5cm , ...

위와 같이 확실히 다른것을 할수 있다..

주로 데이터들이 범주형은 pandas에서 dtypes 함수를 호출했을때 결과값은 object이고

수치형은 float 등 숫자형으로 나올것이다. ( 물론 dataFrame.info() 와 dataFrame.describe() 를 통해 정확히 분류해야함 )

 

그러면 전처리시 범주형과 수치형을 나눠서 해야하는데 인덱스별로 즉 컬럼별로 다 코딩을 해야하는것은 아니다.

 

범주형 컬럼, 수치형 컬럼을 미리 구분해두고 저장해둔다음에 반복문을 돌려두면 된다.

 


범주형, 수치형 column 나누는 방법

 

나누기 위해서 우선 pandas에서 지원하는 dtypes에 대해서 알아볼 필요가 있다.

 

dataFrame.dtypes 의 결과값의 타입은 Series형태이다. 즉 column이 하나인 dataFrame으로 나온다고 봐도 상관없다.

 

Series 로 나오는것을 확인 할 수 있다.

 

 

그러면 이제 data라는 이름의 dataFrame에는 어떤 column이 들어있는지 확인하면 아래와 같다.

 

 

총 2개의 object 타입이 있고 나머지는 int와 float로 구성되어있다.

int나 float형에도 범주형이 있을수 있으므로 describe 함수로 좀더 자세히 확인해보자

 

column의 이름에서도 알수는 있지만 각 수치 그자체로 의미를 가지므로 범주형이라 할 수 없다.

 

그러면 이제 범주형과 수치형을 직접 나눠서 저장하는 방법도 있지만 자동으로 해보는 코드를 살펴본다.

 

아래의 코드를 먼저 확인해보면 float, int, object인지 판별하는 간단한 코드이다.

 

코드 결과

위 사진을 보면 Object를 판별 하는 방법은 'O' 인지 확인하면 된다.

 

그럼 아래의 코드들로 컬럼들을 구분할 수 있다.

 

먼저 인코딩이 있으면 디코딩도 있을거고 이 두개 차이가 뭔데..?

컴퓨터 구조 시간에 인코더랑 디코더를 배웠던 기억이 있는데 이게 머신러닝에서도 쓰인다고..?

 

간단하게 설명하자면

  • 인코더 : 원래있는 데이터를 사용자가 정의한 방식으로 다르게 표현하는 것  (  ex. 암호문 만들기 )
  • 디코더 : 인코더로 다르게 표현된 값을 다시 원상복구 시키는 것 ( ex. 암호문 해독기 )

그럼 머신러닝에서 인코더는 언제 쓰여..?

 

머신러닝에 있어 데이터는 수치형뿐만 아닌 범주형의 데이터들도 많아. 또는 string값들도 있지

머신이 교육을 하기 위해서는 당연히 string값들보단 int형으로 들어가는게 편하겠지 우리가 동작하는 과정을 이해 하기 쉽고.

 

그러기 위해서 범주형이나 string의 값들을 int로 다르게 표현하기 위해서 사용되는게 인코더야

 


Sklearn.preprocessing 패키지를 이용한 범주형 변수 인코딩

여기에서 범주형 변수란, 차의 등급을 나타내는 [소형, 중형, 대형] 처럼 표현되는 변수이다.

범주형 변수는 주로 데이터 상에서 문자열로 표현되는 경우가 많으며, 문자와 숫자가 매핑되는 형태로 표현되기도 한다.

 

위 패키지에서 다뤄 볼 것은 label encoding, one-hot encoding이다.

 


1. Label Encoding

라벨 인코딩은 n개의 범주형 데이터를 0~n-1 의 연속적인 수치 데이터로 표현한다.


소형 : 0
중형 : 1
대형 : 2

  • 라벨 인코딩은 간단한 방법이지만, '소형'과 '중형'이라는 범주형 데이터가 가지고 있는 차이가 0과 1의 수치적인 차이라는 의미가 아님을 주의해야 한다..

 

 


2. One-hot Encoding

원핫 인코딩은 n개의 범주형 데이터를 n개의 비트(0,1) 벡터로 표현한다.
예를 들어, 위에서 언급한 소형, 중형, 대형으로 이루어진 범주형 변수를 원핫 인코딩을 통해 변환하면 다음과 같이 표현할 수 있습니다.


소형 : [1, 0, 0]
중형 : [0, 1, 0]
대형 : [0, 0, 1]

  • 원핫 인코딩으로 범주형 데이터를 나타내게되면, 서로 다른 범주에 대해서는 벡터 내적을 취했을 때 내적 값이 0이 나오게 된다. 간단하게 말해서 중형에 1값이 있다고 다른 소형이나 대형에서 0이었던 값이 변하는것이 아닌 독립적으로 계산된다.
  • Sklearn의 One-hot Encoder는 numpy 행렬로 입력을 넣어줘야 정상적으로 작동하므로, pandas DataFrame에서 numpy-array로 추출하여 사용한다.

데이터에 null값이 존재할때 즉 데이터 프레임에 빵꾸 나있을때에 그대로 머신에 넣으면 오류가 난다.. ( 아닌가..? 해본적이없다.. )

이를 해결하기위해 우리가 임의로 데이터를 넣자니 안될거같고.. 어떤 방법들이 있는지 알아보자..

일단 아래 나온 방법들이 가장 좋다라는 것은 아니다 언제나 데이터에 따라 머신에 따라 어떤 방법을 써야할지는 엔지니어가 결정해야한다.

 


pandas로 null값 확인하기

  • 먼저 imputation을 하기전에 null이 있는지부터 확인을 해야한다.
  • 방법은 isna 또는 isnull이 있다. 둘다 같은 함수.. 이름만 다른..
  • pd.isnull( dataFrame ).sum() 을 통해 결측치의 갯수를 확인 할 수 있다.
    • pd.isnull 을 통해 True / False로만 구성된 dataFrame생성
    • sum()을 통해 열별로 계산 ( True +1, False +0 )
    • sum()을 한번 더 하게 된다면 행으로도 계산하여 데이터 프레임 전체의 null값을 확인할 수 있다.

 

pd.isna( dataframe ) 을 통해 true/false 데이터프레임 생성
sum() 을 통해 열별 합 계산

 

sum().sum()을 통해 전체 null갯수 확인

 


Sklearn.impute.Simplelmputer 을 통한 대체

simpleimputer을 통해서는 평균, 최빈, 중앙값등 간단한 대체가 가능하다.

라이브러리 사용을 위해 import

1. 평균값으로 대체 (Mean Imputation)

  • 결측치가 존재하는 변수에서 결측되지 않은 나머지 값들의 평균을 내어 결측치를 대체하는 방법이다.
  • 해당 값으로 대체 시 변수의 평균값이 변하지 않는다는 장점이 있지만, 많은 단점이 존재한다. 

strategy 변수에 mean을 줌으로 평균으로 대체하게해줌

 

2. 중앙값으로 대체 (Median Imputation)

  • 중간값은 데이터 샘플을 개수에 대해서 절반으로 나누는 위치의 값을 말한다.
  • 데이터 샘플의 수가 짝수개일 때에는 중간에 위치한 두 값의 평균을 사용한다.
  • 모든 관측치의 값을 모두 반영하지 않으므로 지나치게 작거나 큰 값(이상치)들의 영향을 덜 받는다.

 

 

 

3. 최빈값으로 대체 (Most-Frequent Imputation)

  • 최빈값은 가장 많이 나온 값이다.

 


 

1. 새로운 값으로 대체 (Substitution)

아예 해당 데이터 대신에 샘플링 되지 않은 다른 데이터에서 값을 가져온다. (그렇다면 validation set에서도 쓰지 않고 아예 버리게 되는 셈인 건가?)

2. Hot deck imputation

 다른 변수에서 비슷한 값을 갖는 데이터 중에서 하나를 랜덤 샘플링하여 그 값을 복사해오는 방법. 이 방법은 결측값이 존재하는 변수가 가질 수 있는 값의 범위가 한정되어 있을 때 이점을 갖는다. 또한 random하게 가져온 값이기 때문에 어느 정도 변동성을 더해준다는 점에서 표준오차의 정확도에 어느 정도 기여를 한다는 점이다.

3. Cold deck imputation

 Hot deck imputation과 유사하게, 다른 변수에서 비슷한 값을 갖는 데이터 중에서 하나를 골라 그 값으로 결측치를 대체하는 방식이다. 다만 cold deck imputation에서는 비슷한 양상의 데이터 중에서 하나를 랜덤 샘플링하는 것이 아니라 어떠한 규칙 하(예를 들면, k번째 샘플의 값을 취해온다는 등)에서 하나를 선정하는 것이다. 이 경우 hot deck imputation 과정에서 부여되는 random variation이 제거된다.

4. Regression imputation

 결측치가 존재하지 않는 변수를 feature로 삼고, 결측치를 채우고자 하는 변수를 target으로 삼아 regression task를 진행하는 것이다. 데이터 내의 다른 변수를 기반으로 결측치를 예측하는 것이기 때문에 변수 간 관계를 그대로 보존할 수 있지만 동시에 예측치 간 variability는 보존하지 못한다. (회귀분석을 생각해보면 regression line은 random component가 존재하지 않는다. regression 값 그 자체로 존재한다. )

5. Stochastic regression imputation

regression 방법에 random residual value를 더해서 결측치의 최종 예측값으로 대체하는 방식. regression 방법의 이점을 모두 갖는데다 random component를 갖는 데에서 따르는 이점 또한 갖는다. 

6. Interpolation and extrapolation (보간법, 보외법)

같은 대상으로부터 얻은 다른 관측치로부터 결측치 부분을 추정하는 것이다. 이 경우는 longitudinal data의 경우(어린이의 성장 과정을 추적하는 과정에서 얻은 키 데이터라든지 하는 경우)에만 가능할 것이다. 

 

 


결론

위와 같이 많은 방법들이 있다. 물론 이 방법들로 진행해야 하는것은 없다.

 하지만 서로 다른 방법에 따라 결과의 차이는 분명히 나타난다.

간단한 아래의 예시들을 비교해보면

  • 타이타닉에서 나이의 null 값을 나이의 평균으로 넣는방법
  • 타이타닉에서 나이의 null값을 이름 열을 통해서 대략적인 성별을 판단해 성별의 평균 나이로 넣는방법

분명 둘다 mean을 통한 imputation이지만 조금만 더 자세하게 다룰수 있다..

결국 쓰는사람이 데이터를 좀더 자세하게 다룬다면 더 좋은 결과가 나올수 있다.

스케일링 하는 이유

  • 데이터간 범위가 다르다면 머신이 동작하면서 오류값이 가장 낮은 곳으로 수렴하는 과정에서 속도 차이가 발생
  • 예를 들어 나이, 몸무게, 키 데이터가 있다면 나이와 몸무게는 키 데이터보다 숫자가 작아서 오류 역전파 과정에서 가중치가 크게 변하지 않음 하지만 키 데이터는 숫자가 커서 크게 변함..
  • 이를 해결하기 위해 모든 데이터들의 범위를 똑같이 맞춰주는 과정이 scaling
  • 분포의 모양을 바꾸는것은 아니다.

 


1. Min - Max Scaling

 

  • 수치형 데이터를 0~1 사이로 변경시켜줌
  • 언제나 0과 1의 값은 존재하게된다.
  • 코드 예시

우선 필요한 라이브러리 import 스케일러는 sklearn.preprocessing에 있다

 

 

랜덤 정수값으로 dataFrame 생성해서 확인을 한다. ( 1~100사이의 정수로 이루어진 size [200,5] df )

 

scaler 불러와서 우선 fit을 한다. fit은 통계값을 계산하는 과정이라 생각하면된다 여기서는 최대 최소값 찾는정도. 이후 transform을 통해 minMax Scaling수행하여 dataframe으로 확인한다.

 

최대 최소가 모두 0,1 이 된것을 확인 할 수 있다.

 


2. Standard Scaling 

  • 표준 정규분포화 하여서 평균이 0이고 표준편차가 1이 되도록 scaling을 하는 방법이다.
  • z-score 정규화라고도 말한다.
  • 코드 예시

standardScaler는 sklearn.preprocessing에 있다.

 

위의 minMax scaler와 똑같이 사용하면 된다.

 

mean이 정확한 0이 아닌 아주 작은 수로 되긴했지만 이는 컴퓨터의 표현의 한계이므로 넘어가자 std인 표준편차도 1로 수렴한것을 볼 수 있다.

 

머신러닝과 데이터의 관계는 땔수 없다.

 

이때 데이터를불러와 데이터를 전처리하고 가공하는 작업을 python의 기본 문법으로 하기에는 쉽지않다..

 

애초에 엑셀 데이터를 기본 python 문법으로 불러오는것부터 막막하다.

 

이를 위해 numpy와 pandas는 머신러닝을 배우기 시작할때 가장먼저 배우게 된다.

 


파이썬 기본 라이브러리에는 numpy와 pandas가 없으므로 import문을 통해 가져와야한다.

 

numpy와 pandas가 뭔지 모르겠으면 아래의 링크를 확인...

 

[Python] Numpy와 Pandas 왜 둘 다 배워..? :: 음기의 공부노트 (tistory.com)

 

[Python] Numpy와 Pandas 왜 둘 다 배워..?

솔직히 csv읽어오고 데이터 전처리시 data frame만 사용하는거 같은데 왜 둘다 배움..? . .  pandas로 불러온 data frame에서 values로 계산 작업할때 결과물이 모두 numpy라서 numpy도 필요해 NumPy 특징 N-deme..

eomgisan.tistory.com

 


공통

1. 인덱싱과 슬라이싱

  • 파이썬의 기본 문법으로 타 언어보다 다양한 방법과 쉽게 인덱싱 그리고 슬라이싱을 할 수 있다.
  • 인덱싱
    • 앞부분 부터 할 경우에는 0부터 시작
    • 뒷 부분 부터 할 경우 에는 -1부터 시작

양수로 인덱싱  ( 앞 부분부터 인덱싱 )
음수로 인덱싱 ( 뒷 부분부터 인덱싱 )

  • 슬라이싱
    • [ 시작부분 : 끝나는 부분 : 스텝 ] 형식으로 끝나는 부분이 8 일경우 인덱스 8의 원소는 안들어가게된다.
    • 스텝은 진행할때마다 인덱스를 얼마나 바꿀건지 정하는 부분으로 만약 역순으로 리스트를 불러오고 싶으면 -1, 짝수나 홀수의 인덱스만 불러 오고 싶으면 2 로 설정한다.
    • 아래는 예시로 코딩 해보면서 연습하며 익숙해지도록 하자.
    • 아래의 예시중 A[-2:1] 은 결과가 안나온다 step이 default가 1이므로 -2의 인덱스부터 1까지 양의 방향으로 연결이 안되기 때문이다. 고로 이때는 step을 -1로 설정하면 잘 나오게 된다.

 

 

2. lamda함수 문법

 

 

3. 반복 중첩...


Numpy

 

1. 행렬의 형태 확인  : .shape  .reshape(m,n)

  • Numpy는 같은 타입의 데이터들로 이루어진 행렬간 연산에 자주 쓰인다. 연산을 하기 위해서는 필수적으로 행렬들간 크기들이 맞아야 한다.
  • 즉 연산전 행렬의 크기를 확인하고 그에 맞게 변경시켜주는 함수이다.
  • reshape는 진행시 원소의 갯수가 같은 행렬로만 변경 가능하다 ( ex. [3,4] -> [2,6] 가능 / [3,4] -> [1,2] 불가능 )
  • 또한 변경후 원소들은 이전 행렬에서의 순서대로 들어간다. 아래의 그림을 참고하면 이해하기 쉽다


 

2. 행렬간 연결하기 : .concatenate( [ array1, array2 ],  axis = 진행할 차원 )

  • 먼저 axis는 연결 시킬 차원을 지정한다. 쉽게 말해서 행을 기준으로 붙일건지, 열을 기준으로 붙일건지 지정하는 인자이다.
  • 하지만 numpy는 주로 n차원인 데이터를 다룰때 많이 사용하게 되므로 4차원만 넘어가도 쉽지 않다..
  • 나는 쉽게 이해하기 쉽게 그냥 shape의 결과로 나오는 tuple의 몇번째 원소를 바꿀건지를 지정한다고 이해하였다.


 

3. 통계량 계산하기 : .sum(axis=0)    .mean(axis=0)    .var(axis=0)   .std(axis=0)    .max(axis=0)    .min(axis=0)   

.unique()

 

  • 행렬의 모든 원소에 대하여 합계산 한 값을 출력하는 경우는 거의 없을것이야..
  • 주로 통계량을 계산할때는 column별로 또는 한 차원을 기준으로 진행을 할텐데 위의 axis를 지정해주는 이유이다.
  • 모든 numpy함수의 문법은 다음과 같은 np.sum(행렬, 변수), 행렬.sum(변수) 두개의 형태를 모두 지원한다.
  • unique는 axis를 지정하지 않고 행렬 내 모든 원소를 확인해 중복값들을 제거한 후 [n,]의 형태로 결과를 반환한다.
sum 합계 계산
mean 평균 계산
var 분산 계산
std 표준편차 계산
max 최댓값 계산
min 최솟값 계산
unique 중복값 제거후 리스트 출력

 


 

 

4. 로그함수와 지수함수 적용 : np.log(대상)   /   np.exp(대상)

  • 통계나 확률분포를 배우게 되면 log함수나 지수함수는 필수적으로 계산식에 들어가게 된다.
  • 이때 사용되는 것이 log와 exp이다.
  • 위의 예시들과 달리 log와 exp는 행렬.log() 또는 행렬.exp()로 계산할 수 없으며 꼭 위의 문법들로 사용해야한다.

 

 


Pandas

판다스는 2차원의 여러가지 데이터 타입의 원소들을 저장하는 라이브러리이다.

판다스의 데이터 타입은 series와 dataframe 두 종류가 있다. series는 단순히 column이 1개인 2차원 배열이고 dataframe은 column이 여러개인 2차원 배열이다.


 

1. 데이터 불러오기 : pd.read_csv(경로)

  • 판다스의 주된 사용 목적은 데이터를 불러오고, 데이터에 대해 질의 등이다. 주로 수치 계산은 numpy
  • 이를 위해서는 사용자의 db에 있는 데이터를 python으로 불러와야하는데 이떄 사용되는 함수는 read_csv가 대표적이다.
  • db 환경에 따라 경로를 지정할때라던지 추가적인 라이브러리 설치가 필요 하니 이는 구글링으로 해결하자.. ( ex. kaggle 데이터셋 colab으로 불러올때, 컴퓨터 디렉터리 파일 불러올때 등등.. )

 

2. 데이터 프레임의 형태 확인하기 : .shape()

  • numpy와 동일하게 데이터를 불러오면 먼저 형태를 확인해야 한다.
  • 예를 들어 데이터들의 갯수는 몇개인지 ( 행 ), 데이터들의 column은 몇개인지 ( 열 ) 확인하여 데이터 분석 과정을 설계하여야한다.
  • 문법은 numpy와 같으므로 생략한다.
  • reshape은 지원 안함..

 


 

3. 데이터들을 몇개만 뽑아서 보기 : .head( 출력할 행의 갯수 )

  • 데이터 프레임이 가진 데이터를 몇개만 지정해서 출력해주는 함수이다.
  • default 값으로는 5가 지정되어있다.
  • 주로 데이터 불러온후 이 함수를 사용하여 변수 저장이 어찌 되어있는지 각 데이터가 어떤 의미를 가지는지 확인하기 위해 사용한다.
  • 이것을 통해 null값이 포함되어있는지도 운좋으면 확인 가능하지만 주로 이것 말고 다른 방법을 통해 null값을 확인한다.


 

4. 데이터의 정보 확인하기 : .info()

  • 데이터들은 수치형과 범주형이 있다.
  • 쉽게말해 수치형은 연속적인 데이터로 모든 숫자에 대해 의미를 가지는 값이다 ( ex. 몸무게 )
  • 범주형은 불연속 적인 데이터로 특정 값에 대해서만 의미를 가지는 값이다. ( ex. 등수 )
  • info() 함수는 이를 확인하기 위해 사용된다. 수치형 데이터와 범주형 데이터들에게 모두 같은 데이터 전처리 과정을 하지 않고 서로 다른 방법을 사용해야한다. ( 많은 방법이 있지만 정답은 없다. )

 


5. 데이터의 열별 기초 통계량 확인하기 : describe()

  • 열별로 즉 column별로 최솟값 최빈값 최대값 중위값등 기초적인 통계량을 보여준다.
  • 이것을 통해 대략적인 데이터의 분포를 확인 할 수 있고 null값이 포함되어있는지도 확인이 가능하다. ( count 값 )

 


 

6. 데이터 프레임의 데이터값만 가져오기 : values()

  • 특이하게 데이터 프레임에서 인덱싱으로 한 열을 지정하면 단순한 행렬이 나오는건이 아닌 series가 나오게 된다. 즉 dictionary처럼 키와 값의 쌍으로 이루어진 [n,2]짜리 데이터 프레임이 나온다 생각하면 된다.
  • 또한 (2,3)의 위치하여있는 값을 가져올때도 [2,2] 짜리 데이터 프레임이 나오게 된다.. 이게 진짜 화남..
  • 단순한 값만 가지고있는 행렬 즉 numpy의 계산을 지원하는 형태로 나오게 하기 위해서는 valuse() 함수를 사용하면된다.
  • 이는 numpy에서 지원하는 형태로 배열을 반환하게 된다.

 


 

7. 행렬간 연결하기 : .concat( [ df1, df2 ],  axis = 진행할 차원 )

  • numpy의 concatenate와 동일한 과정을 수행한다.

 


 

8. column 순서 변경하기 

 


 

9. 특정 조건의 행 또는 열을 추출하기 : loc[행조건, 열조건], iloc[행인덱스, 열인덱스]

  • loc과 iloc모두 특정 행또는 열을 추출한다. 특별히 iloc은 인덱스를 사용하므로 앞에 i가 붙었다 생각하면 둘 구분이 쉽다.
  • 주로 loc을 많이 사용한다. 조건을 줌으로 특정 범위의 값들만 데이터를 불러와 연속형을 범주형으로 바꿀수도 있고..
  • loc을 많이 써보면 이해하기 쉽다.. 아래는 간단한 예시이다.

age가 39인 데이터의 age,b,c,d값을 가져온다.


 

10. 데이터 열별 또는 전체에게 간단한 수식 계산 하기 : map, apply, applymap

  • map은 Series의 각 원소에 연산을 적용한다. 즉 한 열에 대해서만 적용할 수 있다. 각 원소의 값을 받아 단일값을 반환한다.

 

  • apply는 데이터프레임에서 사용할 수 있는 함수로 행 또는 열에 대해서 함수를 적용할때 사용한다.

 

  • applymap은 series의 map과 동일하게 단일값을 입력을 받아 단일값을 출력한다. 데이터 프레임에서 사용할 수 있다.

솔직히 csv읽어오고 데이터 전처리시 data frame만 사용하는거 같은데 왜 둘다 배움..?

.

.

 

 pandas로 불러온 data frame에서 values로 계산 작업할때 결과물이 모두 numpy라서 numpy도 필요해

 

 


NumPy

 

특징

  • N-demension의 Matrix에 대해 연산이 가능해!!
  • Matrix내의 모든 원소는 같은 데이터 타입이어야만 해!!
  • 난수 생성이 가능해
  • 선형대수학에서 배운 내용들을 적용하기가 쉽다!

 


Pandas

 

특징

  • csv와 같은 데이터 파일을 불러올때 종종 쓰여!
  • SQL처럼 데이터에 대해 질의를 할수 있어
  • col 별로 데이터 타입이 달라도 괜찮아!!
  • 2차원 데이터만 사용이 가능해! ( n차원 이상에서는 사용이 불가능해.. excel이 3차원으로 나오진 않잖아 )

 


정리

 

그니깐 그냥 Pandas로 데이터 전체적으로 확인하고 삽입, 삭제, 질의 등을 통해 지울거 지워

그리고 나서 Numpy를 통해 수식 계산이나 연산을 통해 데이터를 통계내고 싶으면 pandas -> values 를 통해 numpy배열 생성해서 거기서 계산 후 다시 pandas로 저장하자!

+ Recent posts