import pandas as pd
df = pd.DataFrame({'weight':[40, 80, 60, 50, 90], # feature: weight, continuous
'height':[162, 155, 182, 173, 177], # feature: height, continuous
'sex':['f', 'm', 'm', 'f', 'm'], # feature: sex, categorical
'blood_type':['O', 'A', 'B', 'O', 'A'], # feature: blood_type, categorical
'health':['good', 'excellent', 'bad', 'bad', 'good'], # target: health, categorical
})
df
-> 데이터프레임 생성 5사람의 체중, 키, 성별, 혈액형, 건강 의 특성으로 분류
from sklearn.preprocessing import OrdinalEncoder
# 데이터프레임 복사
df_oe = df.copy()
# OrdinalEncoder에 대한 객체 생성
oe = OrdinalEncoder()
# 데이터로 oe 학습
oe.fit(df)
# 학습된 결과
print(f'{oe.categories_=}')
# OrdinalEncoder는 수치형 weight와 height도 범주형으로 인식하여 변경하므로 주의
# 학습된 결과를 적용하여 변환
df_oe = pd.DataFrame(oe.transform(df), columns=df.columns)
df_oe
oe.categories_=[array([40, 50, 60, 80, 90]), array([155, 162, 173, 177, 182]), array(['f', 'm'], dtype=object), array(['A', 'B', 'O'], dtype=object), array(['bad', 'excellent', 'good'], dtype=object)]
# OrdinalEncoder 수정된 사용
# 데이터프레임 복사
df_oe = df.copy()
# OrdinalEncoder에 대한 객체 생성
oe = OrdinalEncoder()
# 데이터로 oe 학습
oe.fit(df[['sex', 'blood_type']])
# 학습된 결과
print(f'{oe.categories_=}')
# 학습된 결과를 적용하여 삽입
df_oe.iloc[:,2:4] = oe.transform(df[['sex', 'blood_type']])
df_oe
oe.categories_=[array(['f', 'm'], dtype=object), array(['A', 'B', 'O'], dtype=object)]
:16: DeprecationWarning: In a future version, df.iloc[:, i] = newvals
will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either df[df.columns[i]] = newvals
or, if columns are non-unique, df.isetitem(i, newvals)
df_oe.iloc[:,2:4] = oe.transform(df[['sex', 'blood_type']])
# 디코딩(decoding)
oe.inverse_transform(df_oe.iloc[:,2:4])
from sklearn.preprocessing import LabelEncoder
# 데이터프레임 복사
df_le = df.copy()
# LabelEncoder는 하나의 변수에 대해서만 변환 가능
# LabelEncoder 객체 생성과 fit을 동시에 적용
health_le = LabelEncoder().fit(df.health)
df_le['health'] = health_le.transform(df.health)
df_le
# fit_transform() 메서드를 사용하여 한번에 인코딩 수행가능
# 데이터프레임 복사
df_le = df.copy()
# LabelEncoder 객체 생성과 fit을 동시에 적용
df_le['health'] = LabelEncoder().fit_transform(df.health)
df_le
from sklearn.preprocessing import TargetEncoder
# 데이터프레임 복사
df_te = df.copy()
# TargetEncoder에 대한 객체 생성
# smooth는 정밀도를 조정하고 target_type은 인코딩 타입을 지정
te = TargetEncoder(smooth=0, target_type='continuous')
# 데이터로 te 학습
# 타겟을 weight라고 가정하고 blood_type을 인코딩
# blood_type_target은 weight와 비례하여 인코딩된 값
# 인코딩이 되는 값은 2차원으로 변환해야 함
te.fit(df['blood_type'].values.reshape(-1, 1), df.weight)
# 학습된 결과
print(f'{te.categories_=}')
# 학습된 결과를 적용하여 새로운 컬럼 삽입
df_te['blood_type_target'] = te.transform(df['blood_type'].values.reshape(-1, 1))
df_te
-> 코드가 오류가 계속 뜸... 확인이 불가.. 교수님께서 보여주신 결과를 첨부
from sklearn.preprocessing import OneHotEncoder
# 데이터프레임 복사
df_ohe = df.copy()
# OneHotEncoder에 대한 객체 생성 후 fit
ohe = OneHotEncoder().fit(df_ohe[['blood_type']])
# 학습된 결과
print(f'{ohe.categories_=}')
# 학습된 결과를 적용하여 새로운 컬럼 삽입
# OneHotEncoder는 결과를 sparse matrix로 반환하므로 toarray()를 통해 ndarray로 변환
df_ohe[ohe.categories_[0]] = ohe.transform(df_ohe[['blood_type']]).toarray()
df_ohe
pd.get_dummies(df, columns=['sex', 'blood_type'], drop_first=False)
from sklearn.preprocessing import Binarizer
# 데이터 불러오기
df_bin = df.copy()
# Binarizer 객체 생성과 fit, transform을 동시에 적용
# Binarizer는 수치형 변수에 대해서만 변환 가능
df_bin['weight_bin'] = Binarizer(threshold=50).fit_transform(df.weight.values.reshape(-1,1))
df_bin['height_bin'] = Binarizer(threshold=170).fit_transform(df.height.values.reshape(-1,1))
df_bin
from sklearn.preprocessing import LabelBinarizer
# 데이터프레임 복사
df_lb = df.copy()
# LabelBinarizer 객체 생성과 fit을 적용
lb = LabelBinarizer().fit(df.health)
# lb.classes_ : LabelBinarizer가 인코딩한 클래스 확인
print(f'{lb.classes_ = }')
# lb.transform() : 인코딩 변환
health_lb = lb.transform(df.health)
print('health_lb = \n', health_lb)
# 인코딩된 데이터를 데이터프레임으로 변환
df_lb[lb.classes_] = health_lb
df_lb
multi-class(여러개의 범주가 있는) 데이터를 이진수 컬럼으로 인코딩
하나의 컬럼(종속변수, 타겟)에만 사용 가능
from sklearn.preprocessing import MultiLabelBinarizer
# 데이터프레임 복사
df_mlb = df.copy()
# multi-class를 위한 컬럼 추가
df_mlb['test'] = [['math', 'english'], ['math', 'science'], ['science'], ['math', 'english'],
['science']] # target: test, categorical, multi-class
df_mlb
# MultiLabelBinarizer 객체를 생성하고 fit() 메소드를 호출하여 클래스를 인코딩
mlb = MultiLabelBinarizer().fit(df_mlb.test)
# classes_ 속성을 사용하면 어떤 클래스가 인코딩되었는지 확인 가능
print(f'{mlb.classes_ = }')
# 인코딩된 데이터를 데이터프레임으로 변환
df_mlb[mlb.classes_] = mlb.transform(df_mlb.test)
df_mlb
from sklearn.preprocessing import KBinsDiscretizer
# 데이터프레임 복사
df_kbd = df.copy()
# KBinsDiscretizer 객체 생성과 fit을 적용
kbd = KBinsDiscretizer(n_bins=3, encode='ordinal').fit(df[['weight', 'height']])
# kbd.transform() : 인코딩 변환
# 인코딩된 데이터를 데이터프레임으로 변환
df_kbd[['weight_bin', 'height_bin']] = kbd.transform(df[['weight', 'height']])
df_kbd
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder, LabelEncoder, TargetEncoder, OneHotEncoder, Binarizer, LabelBinarizer, MultiLabelBinarizer, KBinsDiscretizer
# 새로운 성적 데이터프레임 생성
grade_data = pd.DataFrame({'math':[85, 90, 78, 92, 88],
'english':[70, 85, 92, 80, 95],
'science':[88, 75, 90, 82, 88],
'subject':['math', 'english', 'science', 'math', 'english'],
})
# OrdinalEncoder 예시
oe = OrdinalEncoder()
grade_data_oe = grade_data.copy()
grade_data_oe[['subject']] = oe.fit_transform(grade_data[['subject']])
# LabelEncoder 예시
le = LabelEncoder()
grade_data_le = grade_data.copy()
grade_data_le['subject'] = le.fit_transform(grade_data['subject'])
# TargetEncoder 예시
te = TargetEncoder(smooth=0, target_type='continuous')
te.fit(grade_data['subject'].values.reshape(-1, 1), grade_data['math'])
grade_data_te = grade_data.copy()
grade_data_te['subject_target'] = te.transform(grade_data['subject'].values.reshape(-1, 1))
# OneHotEncoder 예시
ohe = OneHotEncoder(drop='first', sparse=False)
grade_data_ohe = pd.DataFrame(ohe.fit_transform(grade_data[['subject']]), columns=['subject_english', 'subject_science'])
grade_data_ohe = pd.concat([grade_data, grade_data_ohe], axis=1)
# Binarizer 예시
binarizer = Binarizer(threshold=80)
grade_data_bin = grade_data.copy()
grade_data_bin['math_bin'] = binarizer.fit_transform(grade_data['math'].values.reshape(-1, 1))
# KBinsDiscretizer 예시
kbd = KBinsDiscretizer(n_bins=3, encode='ordinal')
grade_data_kbd = pd.DataFrame(kbd.fit_transform(grade_data[['math', 'english']]), columns=['math_bin', 'english_bin'])
grade_data_kbd = pd.concat([grade_data, grade_data_kbd], axis=1)