👉 ex) 음성 인식
1. Defact
👉 ex) 반도체 결함
- Artifact(아티팩트)는 Defact와 동일한 의미를 갖는 용어
👉 ex) 두개골
2. Noise(잡음, 노이즈)
✍ 구간설정 방법
1. 동일 간격(equal-distance) 구간화 -> pandas의 cut() 사용
2. 동일 빈도(eual-frequency) 구간화 → pandas의 qcut() 사용
✍ 구간별 대표값 설정 방법
import pandas as pd
import numpy as np
# 데이터 생성하기, 결과를 보기 용이하도록 sort
df = pd.DataFrame({'uniform': np.sort(np.random.uniform(0,10,10)),
'normal': np.sort(np.random.normal(5,1,10)),
'gamma': np.sort(np.random.gamma(2, size=10))})
# 데이터 확인하기
df.plot(kind='hist', bins=15, alpha=0.5)
df.describe()
↳ 결과
# cut(), qcut() 기본 동작 확인
col = 'uniform'
num_bins = 5
df_binned = pd.DataFrame()
df_binned[col] = df[col].sort_values() # 원 데이터
df_binned['eq_dist_auto'] = pd.cut(df_binned[col], num_bins) # 동일 간격으로 나누기
df_binned['eq_dist_fixed'] = pd.cut(df_binned[col], bins=[0,2,4,6,8,10]) # 지정된 구간으로 나누기
df_binned['eq_freq_auto'] = pd.qcut(df_binned[col], num_bins) # 동일 빈도로 나누기
df_binned
↳ 결과
# 구간화하여 평균값 대체하기
cols = ['uniform', 'normal', 'gamma']
# 동일 간격 구간화
df_ew = df.copy()
for col in cols:
df_ew[col+'_eq_dist'] = pd.cut(df_ew[col], 3) # 구간으로 나누기
means = df_ew.groupby(col+'_eq_dist')[col].mean() # 구간별 평균값 계산
df_ew.replace({col+'_eq_dist': means}, inplace=True) # 평균값으로 대체
display(df_ew)
# 동일 빈도 구간화
df_ef = df.copy()
for col in cols:
df_ef[col+'_eq_freq'] = pd.qcut(df_ef[col], 3) # 구간으로 나누기
means = df_ef.groupby(col+'_eq_freq')[col].mean() # 구간별 평균값 계산
df_ef.replace({col+'_eq_freq': means}, inplace=True) # 평균값으로 대체
display(df_ef)
# 시각화
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(10,5))
df_ew.astype(float).plot(ax=axes[0])
df_ef.astype(float).plot(ax=axes[1])
plt.show()
↳ 결과
import warnings
# hide warnings
warnings.filterwarnings("ignore")
from sklearn.preprocessing import KBinsDiscretizer
# 동일 간격 구간화
ed_binner = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform', subsample=None)
df_ed = ed_binner.fit_transform(df)
# 동일 빈도 구간화
ef_binner = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='quantile', subsample=None)
df_ef = ef_binner.fit_transform(df)
# K-means 구간화
km_binner = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='kmeans', subsample=None)
df_km = km_binner.fit_transform(df)
# 결과 확인
df_ed = pd.DataFrame(df_ed, columns=df.columns+'_eq_dist')
df_ef = pd.DataFrame(df_ef, columns=df.columns+'_eq_freq')
df_km = pd.DataFrame(df_km, columns=df.columns+'_km')
df_bin = pd.concat([df, df_ed, df_ef, df_km], axis=1)
df_bin
↳ 결과
# 구간화하여 평균값 대체하기
for bin_col in df_bin.columns:
col = bin_col.split('_')[0]
means = df_bin.groupby(by=bin_col)[col].mean() # 구간별 평균값 계산
df_bin.replace({bin_col: means}, inplace=True) # 평균값으로 대체
df_bin
↳ 결과
# 시각화
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(15,5))
pd.concat([df_bin.iloc[:,:3], df_bin.iloc[:,3:6]], axis=1).astype(float).plot(ax=axes[0])
pd.concat([df_bin.iloc[:,:3], df_bin.iloc[:,6:9]], axis=1).astype(float).plot(ax=axes[1])
pd.concat([df_bin.iloc[:,:3], df_bin.iloc[:,9:]], axis=1).astype(float).plot(ax=axes[2])
plt.show()
↳ 결과
# 특성 이산화
# 라이브러리 불러오기
import numpy as np
from sklearn.preprocessing import Binarizer
# 특성 만들기
age = np.array([[6],
[12],
[20],
[36],
[65]])
# Binarizer 객체를 만들기
binarizer = Binarizer(threshold=18)
# 특성 변환하기
binarizer.fit_transform(age)
↳ 결과
# 특성을 나눈다
np.digitize(age, bins=[20,30,64])
↳ 결과
# 특성을 나눈다
np.digitize(age, bins=[20,30,64], right=True)
↳ 결과
# 특성을 나눈다
np.digitize(age, bins=[18])
↳ 결과
from sklearn.preprocessing import KBinsDiscretizer
# 네 개의 구간으로 나누기
kb = KBinsDiscretizer(4, encode='ordinal', strategy='quantile')
kb.fit_transform(age)
↳ 결과
# 원-핫 인코딩을 반환함
kb = KBinsDiscretizer(4, encode='onehot-dense', strategy='quantile')
kb.fit_transform(age)
↳ 결과
# 동일한 길이의 구간을 만듦
kb = KBinsDiscretizer(4, encode='onehot-dense', strategy='uniform')
kb.fit_transform(age)
↳ 결과
kb.bin_edges_
↳ 결과