언어/파이썬

머신러닝with파이썬 4강(2)_데이터전처리: 범주형 데이터, 수치형 데이터

디지털랫드 2024. 3. 8. 12:49

데이터 전처리 : 범주형 데이터


이번 시간에는 데이터 전처리를 시작해 보도록 하겠습니다.
머신러닝은 한글 또는 영어로 된 데이터를 인식할 수 없으므로 범주형 데이터는 숫자로 변환(인코딩)시켜줘야 합니다.

이번 시간 정리


1. type확인

  • df.info()

[리마인드] 판다스의 자료형

  • object(문자열) : 예) '호수'
  • int64(정수) : 예) 10
  • float64(실수) : 예) 12.12

2. 레이블 인코딩

  • le.fit_transform(df['컬럼명']) *한번에 fit과 transform 변환
 
 
실행 완료
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9 entries, 0 to 8
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   가격      9 non-null      int64  
 1   호수      9 non-null      int64  
 2   칼로리     9 non-null      float64
 3   원산지     9 non-null      int64  
 4   살찔까요    9 non-null      int64  
dtypes: float64(1), int64(4)
memory usage: 488.0 bytes
 
 
실행 완료
[26]:
array([0, 1, 0, 0, 1, 0, 0, 0, 0])
 
 
실행 완료
[25]:
array([0, 1, 0, 0, 1, 0, 0, 0, 0])
 
 
실행 완료
[24]:
가격호수칼로리원산지살찔까요012345678
16000 11 1200.0 0 0
15000 12 1500.0 1 1
14000 9 1600.0 0 1
14000 9 1800.0 0 1
14000 11 1300.0 1 1
13000 10 1400.0 0 1
13000 10 1300.0 0 1
12000 10 1000.0 0 0
9900 10 1000.0 0 0

영상을 잠시 멈추고 실습을 진행해 주세요.


 
 
실행 완료
[23]:
가격호수칼로리원산지살찔까요012345678
16000 11 1200.0 국내산 0
15000 12 1500.0 브라질 1
14000 9 1600.0 국내산 1
14000 9 1800.0 국내산 1
14000 11 1300.0 브라질 1
13000 10 1400.0 국내산 1
13000 10 1300.0 국내산 1
12000 10 1000.0 국내산 0
9900 10 1000.0 국내산 0

3. 여러 개의 column을 인코딩하는 경우

 
실행 완료
[22]:
가격호수칼로리원산지살찔까요012345678
16000 11 1200.0 국내산 no
15000 12 1500.0 브라질 yes
14000 9 1600.0 국내산 yes
14000 9 1800.0 국내산 yes
14000 11 1300.0 브라질 yes
13000 10 1400.0 국내산 yes
13000 10 1300.0 국내산 yes
12000 10 1000.0 국내산 no
9900 10 1000.0 국내산 no
 
실행 완료
 

for in 반복문

  • 자료형에 담긴 자료들을 하나씩 꺼내고 싶을때 사용한다.
  • 이렇게 반복문을 활용해서 실행을 하게 되면 컬럼이 아무리 많아도 반복문을 통해서 한번에 인코딩 할 수 있다.
 
실행 완료
 
 
실행 완료
[19]:
가격호수칼로리원산지살찔까요012345678
16000 11 1200.0 국내산 no
15000 12 1500.0 브라질 yes
14000 9 1600.0 국내산 yes
14000 9 1800.0 국내산 yes
14000 11 1300.0 브라질 yes
13000 10 1400.0 국내산 yes
13000 10 1300.0 국내산 yes
12000 10 1000.0 국내산 no
9900 10 1000.0 국내산 no

4. 원핫(one-hot) 인코딩

  • 각 카테고리별로 컬럼을 만들어서 해당되는 카테고리의 컬럼은 1, 나머지 컬럼은 0으로 인코딩
 
 
실행 완료
[16]:
가격호수칼로리원산지살찔까요012345678
16000 11 1200.0 국내산 no
15000 12 1500.0 브라질 yes
14000 9 1600.0 국내산 yes
14000 9 1800.0 국내산 yes
14000 11 1300.0 브라질 yes
13000 10 1400.0 국내산 yes
13000 10 1300.0 국내산 yes
12000 10 1000.0 국내산 no
9900 10 1000.0 국내산 no
 
 
실행 완료
[17]:
array([[1., 0.],
       [0., 1.],
       [1., 0.],
       [1., 0.],
       [0., 1.],
       [1., 0.],
       [1., 0.],
       [1., 0.],
       [1., 0.]])
 
 
실행 완료
[18]:
[array(['국내산', '브라질'], dtype=object)]
 
 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/1618568311.py in <module>
      1 # 피처(컬럼)이름과 카테고리
----> 2 ohe.get_feature_names_out()

NameError: name 'ohe' is not defined
 
 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/559772865.py in <module>
      1 # 데이터프레임으로 변환
----> 2 df_cat = pd.DataFrame(cat, columns=ohe.get_feature_names_out())
      3 df_cat

NameError: name 'cat' is not defined
 
 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/2345693229.py in <module>
      1 # 데이터 프레임 합치기
----> 2 df = pd.concat([df,df_cat],axis=1)
      3 df

NameError: name 'df_cat' is not defined
 
 
실행 완료
[12]:
가격호수칼로리살찔까요012345678
16000 11 1200.0 no
15000 12 1500.0 yes
14000 9 1600.0 yes
14000 9 1800.0 yes
14000 11 1300.0 yes
13000 10 1400.0 yes
13000 10 1300.0 yes
12000 10 1000.0 no
9900 10 1000.0 no

5. 원핫(one-hot) 인코딩(심화)

  • 여러 개 컬럼 한 번에 인코딩
 
 
실행 완료
[11]:
가격호수칼로리원산지살찔까요012345678
16000 11 1200.0 국내산 no
15000 12 1500.0 브라질 yes
14000 9 1600.0 국내산 yes
14000 9 1800.0 국내산 yes
14000 11 1300.0 브라질 yes
13000 10 1400.0 국내산 yes
13000 10 1300.0 국내산 yes
12000 10 1000.0 국내산 no
9900 10 1000.0 국내산 no

영상을 잠시 멈추고 실습을 진행해 주세요.


※TIP
Jupyter Notebook으로 학습을 진행하실 경우
코드 에러시 Jupyter Notebook내 하단에서 에러 위치를 확인 할수 있습니다.
또한 코드에 ctrl + / 로 주석처리를 하며 데이터 값, 옵션 값 등을 출력 통해서 확인하면 빠르게 에러를 찾을 수 있습니다.

 
 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/3361793199.py in <module>
      1 # 원핫인코딩
      2 cols = df.select_dtypes(include='object').columns
----> 3 ohe = OneHotEncoder(sparse=False)
      4 cat = ohe.fit_transform(df[cols])
      5 df_cat = pd.DataFrame(cat, columns=ohe.get_feature_names_out())

NameError: name 'OneHotEncoder' is not defined
 
 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/2525919477.py in <module>
      1 # 데이터프레임 합치기
----> 2 df = pd.concat([df, df_cat], axis=1)
      3 df.head()

NameError: name 'df_cat' is not defined
 
 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/3152749986.py in <module>
      1 # 컬럼 삭제
----> 2 df = df.drop(cols, axis=1)
      3 df

NameError: name 'cols' is not defined

[TIP] 원핫인코딩: 판다스 활용

 
 
실행 완료
[5]:
가격호수칼로리원산지살찔까요01234
16000 11 1200.0 국내산 no
15000 12 1500.0 브라질 yes
14000 9 1600.0 국내산 yes
14000 9 1800.0 국내산 yes
14000 11 1300.0 브라질 yes