[머신러닝] 3. 전처리(범주형데이터)

PurinYun·2023년 11월 22일
0

AIffel

목록 보기
19/75

사이킷런 활용

사이킷런이란?
• 파이썬을 활용한 머신러닝도구
• 데이터분석(예측)을 위한 간단하고 효율적인 도구
• 누구나쉽게 다양한 상황에서 활용가능
• 오픈소스

사이킷런으로할수있는것
-분류(ex.스팸메일)
-회귀(ex.가격)
-클러스터링(ex.고객세그먼트)
-차원축소(ex.변수(컬럼)의수를줄임)
-모델선택(ex.모델튜닝,평가)
-전처리(ex.데이터가공/변환)

# 데이터 생성
import pandas as pd
import numpy as np
data = pd.DataFrame({
    '메뉴': ['[인기]아이펠치킨','닭강정','간장치킨','마늘치킨','파닭','승일양념치킨','양념반후라이드반','황금후라이드','[베스트]풀잎치킨'],
    '가격': [16000,15000,14000,14000,14000,13000,13000,12000,9900],
    '호수' : [11,12,9,9,11,10,10,10,10],
    '칼로리' : [1200.0,1500.0,1600.0,1800.0,1300.0,1400.0,1300.0,1000.0,1000.0],
    '할인율' : [0.5,0.2,0.2,0.2,0.2,0.2,0.2,0.2,np.nan],
    '할인가' : [8000.0,12000.0,11200.0,11200.0,11200.0,10400.0,10400.0,9600.0,np.nan],
    '원산지' : ['국내산','브라질','국내산','국내산','브라질','국내산','국내산','국내산','국내산'],
    '살찔까요' : ['no','yes','yes','yes','yes','yes','yes','no','no'],
    '고민' : ['무조건먹자','먹지말자','먹지말자','먹지말자','먹지말자','먹지말자','먹지말자','무조건먹자','무조건먹자']
})
data.to_csv('final_modudak.csv', index=False)
data


# 데이터 변경
data.loc[2,'원산지'] = '미국'
data

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df

전처리: 범주형 데이터

레이블 인코딩(Label Encoding)과 원핫 인코딩(One-hot Encoding)은 범주형 데이터를 수치형 데이터로 변환하는 방법입니다.
레이블 인코딩은 각 카테고리를 숫자로 대응시켜서 변환합니다. 예를 들어, "red", "green", "blue"라는 3개의 카테고리가 있다면 "red"를 1로, "green"을 2로, "blue"를 3으로 변환하는 것입니다. 이 방법은 간단하고 직관적이지만, 각 카테고리가 가지는 값의 크기 차이가 있을 경우 예측 결과에 영향을 미칠 수 있습니다.
반면에, 원핫 인코딩은 각 카테고리를 벡터 형태로 변환합니다. 예를 들어, "red", "green", "blue"라는 3개의 카테고리가 있다면 "red"는 [1, 0, 0], "green"은 [0, 1, 0], "blue"는 [0, 0, 1]로 변환하는 것입니다. 이 방법은 각 카테고리를 독립적인 변수로 취급하기 때문에 각 카테고리가 가지는 값의 크기 차이를 고려하지 않습니다. 따라서, 범주형 변수의 카테고리가 많을수록 차원이 커지는 단점이 있지만, 예측 결과에 영향을 미치는 위험이 적습니다.
따라서, 레이블 인코딩은 카테고리가 서열을 가지는 경우(예: "bad", "average", "good")나 카테고리의 수가 적을 경우에 사용하고, 원핫 인코딩은 카테고리의 수가 많을 경우에 사용합니다.

1. type확인

• df.info()

[리마인드] 판다스의 자료형
• object(문자열) : 예) '호수'
• int64(정수) : 예) 10
• float64(실수) : 예) 12.12

2. 레이블 인코딩

• le.fit_transform(df['컬럼명'])
*한번에 fit과 transform 변환

# type확인
df.info()

# 레이블(label) 인코딩 
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(df['원산지'])
le.transform(df['원산지'])

# fit_transform
# fit과 transform을 한번에!
le.fit_transform(df['원산지'])

# 데이터 변환
df['원산지'] = le.fit_transform(df['원산지'])
df
# '살찔까요' 레이블인코딩
le = LabelEncoder()
df['살찔까요'] = le.fit_transform(df['살찔까요'])
df

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

# 활용할 데이터 선택 - 원본 데이터 불러오기
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df

# 데이터가 object 타입인 column 선택 ['원산지', '살찔까요']

# 방법1 
cols = ['원산지', '살찔까요']

# 방법2 : object(문자열) 타입의 컬럼명만 cols 변수에 할당하게 됨
cols = df.select_dtypes(include='object').columns

for in 반복문

• 자료형에 담긴 자료들을 하나씩 꺼내고 싶을때 사용한다.
• 이렇게 반복문을 활용해서 실행을 하게 되면 컬럼이 아무리 많아도 반복문을 통해서 한번에 인코딩 할 수 있다.

# 한 번에 레이블 인코딩
from sklearn.preprocessing import LabelEncoder

for col in cols:
    le = LabelEncoder()
    df[col] = le.fit_transform(df[col])
    
# 인코딩 결과 확인
df

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

• 각 카테고리별로 컬럼을 만들어서 해당되는 카테고리의 컬럼은 1,
나머지 컬럼은 0으로 인코딩

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df

# 원핫인코딩
# 데이터프레임을 입력받기 때문에 대괄호를 2번 써야 합니다. (df[['원산지']])
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse=False)
cat = ohe.fit_transform(df[['원산지']])
cat

# 카테고리
ohe.categories_

# 피처(컬럼)이름과 카테고리
ohe.get_feature_names_out()

# 데이터프레임으로 변환
df_cat = pd.DataFrame(cat, columns=ohe.get_feature_names_out())
df_cat

# 데이터 프레임 합치기
df = pd.concat([df,df_cat],axis=1)
df

# 기존 컬럼 삭제
df = df.drop(['원산지'], axis=1)
df

4. 원핫 인코딩(심화)

• 여러 개 컬럼 한 번에 인코딩

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df


# 원핫인코딩
cols = df.select_dtypes(include='object').columns
ohe = OneHotEncoder(sparse=False)
cat = ohe.fit_transform(df[cols])
df_cat = pd.DataFrame(cat, columns=ohe.get_feature_names_out())
df_cat


# 데이터프레임 합치기
df = pd.concat([df, df_cat], axis=1)
df.head()


# 컬럼 삭제
df = df.drop(cols, axis=1)
df

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

# 활용할 데이터 선택
df = data[['가격', '호수', '칼로리', '원산지', '살찔까요']].copy()
df.head()

# 판다스를 활용한 원핫 인코딩
df = pd.get_dummies(df)
df

전처리: 수치형 데이터

  1. 표준화 (StandardScaler)
    • 모든값을 평균이 0, 분산이 1인 표준정규분포로 변환
    �=�−��z=σx−μ​

  2. 정규화 (MinMaxScaler)

• 모든값을 0~1 사이 값으로 변환 (데이터 사이즈 축소)

사이킷런 제공 데이터 셋

1. 피처 이름 확인

• dataset.feature_names

2. 타겟 확인

• dataset.target

3. 데이터 확인

• dataset.data[:2]* 2세트만 확인시

4. 데이터 프레임 만들기

-변수명= pd.DataFrame(data=dataset.data , columns=dataset.feature_names)

5. 타겟 추가

• cancer_df['target'] = dataset.target

6. 데이터셋 확인

• load로 시작하는 함수를 이용해 데이터를 불러올 수 있다.
• import sklearn.datasets
• sklearn.datasets.all*
언더바가 연달아 2개

머신러닝

1. train_test_split

-사이킷런의 train_test_split 라이브러리를 활용하면 쉽게 train set(학습데이터셋)과 테스트셋을 랜덤하게 나누어 준다.

2. test_size=0.3

-학습용으로 70%를 두고 30% 데이터는 테스트용으로 둔다.

3. random_state

-반복 연산시 일정하게 섞기 위해 사용하며 random값을 고정하여 동일한 결과를 얻을 수 있다.

profile
Fantivation

0개의 댓글