데이터 전처리

: 데이터를 분석 및 처리에 적합한 형태로 만드는 과정으로 반드시 거쳐야 하는 과정이다.

 

 

sklearn.preprocessing 패키지

: 모델을 만들기 적합한 데이터로 변환하는 것을 도와줌 -> x값

1. 결측치 추정 : Null 비율 20% 미만

2. 레이블 인코딩 : 문자를 숫자로 변환

3. 표준화 : 최대값 및 최소값 정의

4. 구간화 : 연속형(이상치 제외 평균)에서 범주형(Null 값을 미리 정의된 값으로 대체)으로 변형

 

 

# 정규화, 표준화
import seaborn as sns

iris = sns.load_dataset('iris')
x = iris.iloc[:, :-1]
y = iris.iloc[:, -1]

# 표준화(standardization) : 연속형 데이터의 경우 변수들의 Scale이 다르면 모델링 과정이 제대로 수행이 안되기 때문에 표준화를 시킨다.

# 데이터 전처리 : scaling

from sklearn.preprocessing import scale

x_scale = scale(x)
x_scale[:5, :]

# scale(x) : 표준 정규분포를 사용해 표준화 → 평균 : 0, 표준편차 : 1

x_scale.mean(axis=0)

# axis = 0 : 서로 다른 끼리 / axis = 1 : 서로 다른 끼리 / default(기본값)  : axis  = 0

 

from sklearn.preprocessing import minmax_scale

sc = minmax_scale(x)
sc[:5, :]

# 0 ~ 1 사이 값으로 스케일링(단위 조정)

# minmax_scale() : 최대값과 최솟값을 사용하여 표준화

 

from sklearn.preprocessing import StandardScaler

sc = StandardScaler() # 평균 : 0, 표준편차 : 1

sc.fit(x)

# fit() : 스케일링에 사용될 평균과 표준편차를 계산

fit() : 데이터에 머신러닝 모델을 맞추도록 훈련시키는 함수(데이터셋에서 변환을 위한 기반 설정)

transform() : fit() 통해 세운 기반으로 실제 학습시킨 것을 적용

 

iris_scale = sc.transform(x)
iris_scale[:5, :]

# transform(): 표준화를 수행해서 데이터 변환

 

 

sc.inverse_transform(iris_scale)[:5, :]

# 데이터(iris_scale)를 원래 표현으로 스케일 백

 

y

# y의 결과 값의 데이터 형태인 문자는 빈도수만 알 수 있다.

위에 언급한 것처럼 문자는 빈도수만 알 수 있기 때문에 여기서 레이블 인코딩(Label Encoding)이 필요하다.

 

 

레이블 인코딩

: 실제 값에 상관없이 0 ~ k-1 까지정수로 변환하는 것

(예) 지역 또는 성별 등 문자로 되어있는 데이터를 숫자로 변환한다.

 

from sklearn.preprocessing import LabelEncoding

le = LabelEncoder()
le.fit(y) #레이블 인코더 모델 생성
species = le.transform(y) #라벨을 표준화된 인코딩으로 변환
species

 

One-Hot Encoding

클래스의 수만큼 0 또는 1을 갖는 열을 이용해서 데이터 표현

(예) 성별을 저장하는 변수가 male, female을 가진다면 새로운 두 개의 변수(A_m, B_fm)를 만들고  male일 경우 두 변수가 각각 1, 0값을 가지며, female일 경우 두 변수가 각각 0, 1값을 가짐

 

from sklearn.preprocessing import OneHotEncoder

ohe = OneHotEncoder(categories = 'auto')
ohe.fit(species.reshape(-1, 1))

iris_onehot = ohe.transform(species.reshape(-1, 1))
iris_onehot

# 결과 : (150, 1) → 150개의 샘플 수 , 1열

# reshape() : 데이터 수를 해당 열 개수만큼 자동 구조화

# reshape(-1, 1) : 행의 위치를 나타나는 곳에 '-1'은 열의 값은 특정 정수로 지정되어 있을 때, 남은 배열의 길이와 남은 차원으로부터 추정해서 알아서 지정하라는 뜻 (마지막 )을 의미하고, 열의 위치에 있는 '1'은 1열로 나타내라는 의미이다.

 

iris_onehot.toarray()[:5]

# 배열로 변환

 

#판다스 활용한 One Hot Encoding

 

import pandas pd

pd.get_dummies(iris.species)

# get_dummies() : 더미변수 (예) 수영장이 있으면 1, 없으면 0

→ get_dummies()를 이용하면 간단히 원핫 인코딩괸 결과를 얻을 수 있다.

# 평균값 인코딩

import seaborn as sns

titanic = sns.load_dataset('titanic')
titanic.head()

titanic.isnull().sum() # null값 확인

# 결과를 보면 deck가 다른 칼럼들의 비해 null값이 많음 (결측치가 많음)

titanic.info() 
# null값과 데이터 프레임 확인

sex_mean = titanic.groupby('sex')['survived'].mean()

# titanic에 대한 것 중 'sex'를 그룹화하고 거기에 따른 'survived' 생존에 따른 평균값을 sex_mean에 저장한다.

 

titanic['sex_mean'] = titanic['sex'].map(sex_mean) 
titanic[:5]

# titanic['sex'].map(sex_mean) : sex_mean인 평균값을 sex_mean이라는 칼럼을 생성해 추가!

 

# sex, sex_mean 변수 추출
titanic[['sex', 'sex_mean']].head()

# pivot table로 정리

 

titanic_pivot = titanic.titanic_pivot(index = titanic.index,
					columns = 'survived',
                                        values = 'sex_mean')
titanic_pivot[:5]

# 남자 : 0.188908 / 여자 : 0.742038

# 0 : 생존 / 1 : 사망

titanic_pivot.hist(bins = 10)

▶ 에측값을 히스토리 차트로 보면 남자(0.188908)가 여자(0.742038)보다 생존률(0)이 더 높다는 것을 알 수 있다.

평균값 인코딩의 장점은 만들어지는 특정변수의 수가 매우 적어, One-hot의 문제였던 차원의 저주가 없어 비교적 빠른 학습이 가능하다.

 

 # nan 생성

import random

random.seed(42) 

for col in range(4) : 
	x.iloc[[random.sample(range(len(iris)), 20], col] = flot('nan') # nan 생성
 
 x.head()

# 랜덤으로 iris 데이터 길이 중에서 20개만 뽑은 행과 col의 열을 가져와 nan으로 추가

 

imputer 활용, nan(결측치) 해결(평균, 중위수로 대체)

# x에 대한 행 평균값(mean)

x.mean(axis=0)

from sklearn.impute import SimpleImputer

imp_mean = SimpleImputer(strategy = 'mean')
imp_mean.fit(x) # 학습

imp_mean.transform(x)[:5, :] #Nan 값을 평균값으로 변경

# impute 모듈의 SimpleImputer 클래스를 이용하면 데이터의 평균, 중앙값, 최빈값 또는 상수값 중 하나로 결측값을 채울 수 있음

# SimpleImputer(strategy = 'mean') : 결측값을 평균값(mean)으로 채울 방법 지정

# x에 대한 행 중위값(median)

x.median(axis=0)

imp_median = SimpleImputer(strategy = 'median')
imp_median.fit(x)

imp_median.tansform(x)[:5, :]

# SimpleImputer(strategy = 'mean') : 결측값을 중앙값(median)으로 채울 방법 지정

 

# x에 대한 행 최빈값(mode)

x.mode(axis=0)

imp_freq = SimpleImputer(strategy='most_frequent')
imp_mostfreq = imp_freq.fit_tansform(x)
imp_mostfreq[:5, :]

 

 


(천안 스타형 학습 과정에서 배운 내용 복습 및 모르는 내용 서칭 후 추가 작성)

'Project > 23.07~08 AI' 카테고리의 다른 글

머신러닝_5. 단순회귀분석_규제  (0) 2023.07.11
머신러닝_4. 모델링  (0) 2023.07.11
머신러닝_3. 데이터 분리  (0) 2023.07.11
머신러닝_1. 데이터 탐색  (0) 2023.07.10
머신러닝_0. 개요  (0) 2023.07.10

+ Recent posts