Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 서말리포켓
- 선정산서비스
- fundbox
- 데이터분석
- pmf
- 한장으로끝내는비즈니스모델100
- retention
- 코호트
- 리텐션
- 핀테크
- 퍼널분석
- 바로팜
- model_selection
- 활성화
- 셀프스토리지
- activation
- BM분석
- 비즈니스모델
- 머신러닝
- 인게이지먼트
- 팔방이익구조
- 올라
- aarrr
- mysql설치 #mysql #mysqluser #mysqlworkbench
- sklearn
- 전환율
- CAC
- allra
- 역설구조
- 그로스해킹
Archives
- Today
- Total
데이터로그😎
데이터 전처리 본문
<목차>
1. 데이터 인코딩
1-1. 레이블 인코딩
1-2. 원-핫 인코딩
2. 피처 스케일링
2-1. StandardScaler (표준화)
2-2. MinMaxScaler(정규화)
1. 데이터 인코딩
1-1. 레이블 인코딩
- 언제 사용하는가?
- 문자열 → 숫자열로 인코딩하기 좋음
- 각 레이블에 고유의 숫자들을 매길 때 사용
- fit
- items 리스트에 있는 고유한 문자열을 찾아냄.
- TV=0, 냉장고= 1, 전자레인지=2, 컴터=3, 선풍기=4, 믹서=5로 매팽할 방법을 학습함.
- transform
- items 리스트의 값들을 이전에 학습된 방법에 따라 인코딩.
- tv → 0, 냉장고 → 1, 전자레인지 → 2,... 로 인코딩.
from sklearn.preprocessing import LabelEncoder
items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']
encoder =LabelEncoder()
# 문자열 학습
encoder.fit(items)
# items 리스트를 인코딩. 모든 문자열을 fit에서 학습된 매핑 방법에 따라 인코딩된 정수값으로 변환.
labels = encoder.transform(items)
>>> 결과
array([0, 1, 4, 5, 3, 3, 2, 2])
- 디코딩
encoder.inverse_transform([0, 1, 4, 5, 3, 3, 2, 2])
1-2. 원-핫 인코딩
- 언제 사용하는가?
- 0과 1으로만 분리할 때(와인: 레드와인(0), 화이트와인(1))
- 분류 문제에서 범주형 변수를 처리할 때
- 비선형 데이터를 처리할 때
- 비선형 구조?
-
더보기비선형, 선형 구조?
1. 선형 구조 (Linear)
- 데이터, 요소들이 일렬로 나열되어 있는 구조
- 배열, list
2. 비선형 (Nonlinear)
- 요소들 간에 복잡, 다양한 관계
- 순차, 직선 구조 X
- 그래프, 트리
- 인코딩된 범주형 데이터를 다른 모델에 입력으로 사용할 때
- 방법1
- 내가 표현하고 싶은 것만 1로 나머진 0으로
- 다중 공선성이 발생할 수도 있다. 따라서 원핫 인코딩통해 생성된 column 중 하나를 삭제하고 모델을 만들어주면 됨. 즉 column이 n개 생성되었을 때 n-1개만 사용
from sklearn.preprocessing import OneHotEncoder
oh_encoder = OneHotEncoder()
items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']
items = np.array(items).reshape(-1,1)
# OneHotEncoder 클래스는 입력 데이터로 2차원 배열을 받음.
# 따라서 list인 item을 1차원 array형태로 바꾸고, reshape를 통해 2차원으로 변환
oh_encoder.fit(items)
oh_labels =oh_encoder.transform(items)
# oh_labels(원핫인코더로 변환한 결과는 '희소행렬')
# 따라서 toarray()를 이용해 '밀집행렬'로 변환
oh_labels.toarray()
>>>결과
array([[1., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 1.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0., 0.],
[0., 0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0., 0.]])
- 방법2: get_dummies()
- 판다스에서 원핫인코딩을 더 쉽게 지원하는 API
import pandas as pd
items=['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']
df= pd.DataFrame({'item':['TV','냉장고','전자레인지','컴퓨터','선풍기','선풍기','믹서','믹서']})
pd.get_dummies(df)
- 방법3
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder',OneHotEncoder(drop='first'),[2])],remainder = 'passthrough')
# drop='first' 첫번째 열은 자르겠다. [2]: 2인덱스를 변환해주시오.
X = ct.fit_transform(X)
X
2. 피처 스케일링
2-1. StandardScaler(표준화)
- 데이터의 분포를 통일 할 때 사용
- 평균은 0, 표준편차는 1로 변환
- 선형회귀, 로지스틱 회귀, 서포트벡터머신
- 이상치 있는 경우에도 영향 적게 받음
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df) # array형태로 반환됨
iris_df_scaled = pd.DataFrame(data=iris_scaled, columns = iris.feature_names)
print('featrue평균값')
print(iris_df_scaled.mean())
print()
print('feature 분산값')
print(iris_df_scaled.var())
- 결과
- 데이터 모양은 유사
- mean=0, 분산=1로 바뀜. (= 표준화)
2-2. MinMaxScaler
- 단위가 다르고 최대최소가 존재하는 경우
- 최소값을0, 최대값을 1로 변환함.
- 최대최소가 존재한다? = 데이터의 범위가 정해져 있다.
- ex) 영화 평점 (네이버:1~10, 넷플: 1~5)
- 이미지 처리, neural network
- 이미지 처리: 각 픽셀값 0~255 사이. 따라서 이러한 데이터를 신경망 모델에 입력하기 전에 0~1사이로 스케일링 하여 입력할 수 있음.
- 이상치 많을 땐 적합하지 않음
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(iris_df)
iris_scaled = scaler.transform(iris_df)
iris_df_scaled = pd.DataFrame(data= iris_scaled, columns= iris.feature_names)
print('feature들의 최소값')
print(iris_df_scaled.min())
print('feature들의 최대값')
print(iris_df_scaled.max())
⚠️2-3. 스케일러 사용시 주의 사항
- 가능하면 전체 데이터의 스케일링 변환 후 학습, 테스트 데이터로 분리하기
- 전체 데이터 스케일링 → train, test data 분할
- 1이 여의치 않다면 테스트 데이터 변환시에는 학습데이터로 이미 fit()이 된 scaler 객체를 이용해 transform()으로 변환
- train data에만 fit, transform사용 → test data 변환시에는 학습데이터로 이미 fit()이 된 scaler 객체를 이용해 transform() 만 실행
scaler =MinMaxScaler()
scaler.fit(train_array)
train_scaled = scaler.transform(train_array)
test_scaled = scaler.transform(test_array)
'#4. 기타 공부 > #4.2. 머신러닝' 카테고리의 다른 글
[지도학습] 2. Decision Tree (1) | 2023.09.04 |
---|---|
[지도학습] 0. 분류(Classification) (0) | 2023.09.04 |
[지도학습] 1. 분류의 평가지표 (0) | 2023.09.04 |
model_selection 모듈 (1) | 2023.09.03 |
머신러닝의 분류 (0) | 2023.08.30 |