범주형 변수를 서로 조합하여 만든 변수를 변환할 때는 타깃 인코딩이 효과적이다. 목적변수의 평균을 계산하는 그룹이 더 세분화되는 만큼, 더 특징적인 일련의 경향을 파악할 가능성이 높아지기 떄문이다.
와이드 포맷은 주목 대상 변수만 유지할 수 있지만, 해당 변수의 시계열적인 변화를 알아보기 쉽고 lag 특징을 구할 때 다루기 쉽다. 한편 학습을 진행할 때는 날짜와 사용자벼로 목적변수를 가지는 롱 포맷으로 만들어야 한다.
롱 포맷으로 주어진 데이터를 와이드 포맷으로 변환한 뒤에 특징을 만들고, 변환된 데이터를 다시 롱 포맷으로 변환해 특징을 부가한 뒤 학습을 실시하는 경우가 있으므로 이러한 포맷 전환해 익숙해져야 한다.
pandas에서 데이터를 다룰 경우
# 와이드 포맷, 롱 포맷
# -----------------------------------
# 와이드 포맷의 데이터 읽기
df_wide = pd.read_csv('../input/ch03/time_series_wide.csv', index_col=0)
# 인덱스의 형태를 날짜형으로 변경
df_wide.index = pd.to_datetime(df_wide.index)
print(df_wide.iloc[:5, :3])
'''
A B C
date
2016-07-01 532 3314 1136
2016-07-02 798 2461 1188
2016-07-03 823 3522 1711
2016-07-04 937 5451 1977
2016-07-05 881 4729 1975
'''
# 롱 포맷으로 변환
df_long = df_wide.stack().reset_index(1)
df_long.columns = ['id', 'value']
print(df_long.head(10))
'''
id value
date
2016-07-01 A 532
2016-07-01 B 3314
2016-07-01 C 1136
2016-07-02 A 798
2016-07-02 B 2461
2016-07-02 C 1188
2016-07-03 A 823
2016-07-03 B 3522
2016-07-03 C 1711
2016-07-04 A 937
...
'''
# 와이드 포맷으로 되돌림
df_wide = df_long.pivot(index=None, columns='id', values='value')
# x는 와이드 포맷의 데이터 프레임
# 인덱스 = 날짜 등의 시간, 열 = 사용자나 매장 등, 값 = 매출 등 주목 대상 변수를 나타냄
# 1일 전의 값을 획득
x_lag1 = x.shift(1)
# 7일 전의 값을 획득
x_lag7 = x.shift(7)
# shift() 함수로 각각의 날짜 데이터 값을 일정 기간 전의 데이터로 치환(여기서는 1일전)
# 첫 번째 행은 이전 날짜가 없어 NaN(빈 값)이 됨. 두 번째부터는 전날 데이터로 치환
# 변환된 데이터 기준으로 rolling() 함수를 이용. window=3(자신을 포함하여 3개 행)
# 3일 범위의 날짜 기간(자신 포함 이전 3일)의 데이터 평균을 구함. 단, NaN이 하나라도 포함되면 NaN 반환
# 1기전부터 3기간의 이동평균 산출
x_avg3 = x.shift(1).rolling(window=3).mean()
# 모든 날짜를 1일 이전 데이터로 치환한 뒤,
# 변환된 데이터의 지정 시점부터 이전 날짜의 7일간의 범위에서 최댓값을 산출
x_max7 = x.shift(1).rolling(window=7).max()
# 7일 이전, 14일 이전, 21일 이전, 28일 이전의 합의 평균으로 치환
x_e7_avg = (x.shift(7) + x.shift(14) + x.shift(21) + x.shift(28)) / 4.0
# PCA
from sklearn.decomposition import PCA
# 데이터는 표준화 등의 스케일을 갖추기 위한 전처리가 이루어져야 함
# 학습 데이터를 기반으로 PCA에 의한 변환을 정의
pca = PCA(n_components=5)
pca.fit(train_x)
# 변환 적용
train_x = pca.transform(train_x)
test_x = pca.transform(test_x)
# TruncatedSVD
from sklearn.decomposition import TruncatedSVD
# 데이터는 표준화 등의 스케일을 갖추기 위한 전처리가 이루어져야 함
# 학습 데이터를 기반으로 SVD를 통한 변환 정의
svd = TruncatedSVD(n_components=5, random_state=71)
svd.fit(train_x)
# 변환 적용
train_x = svd.transform(train_x)
test_x = svd.transform(test_x)
# NMF
# -----------------------------------
# 비음수의 값이기 때문에 MinMax스케일링을 수행한 데이터를 이용
train_x, test_x = load_minmax_scaled_data()
# -----------------------------------
from sklearn.decomposition import NMF
# 데이터는 음수가 아닌 값으로 구성
# 학습 데이터를 기반으로 NMF에 의한 변환 정의
model = NMF(n_components=5, init='random', random_state=71)
model.fit(train_x)
# 변환 적용
train_x = model.transform(train_x)
test_x = model.transform(test_x)
# -----------------------------------
# MinMax스케일링을 수행한 데이터를 이용
# 카운트 행렬은 아니지만, 음수가 아닌 값이면 계산 가능
train_x, test_x = load_minmax_scaled_data()
# -----------------------------------
from sklearn.decomposition import LatentDirichletAllocation
# 데이터는 단어-문서의 카운트 행렬 등으로 함
# 학습 데이터를 기반으로 LDA에 의한 변환을 정의
model = LatentDirichletAllocation(n_components=5, random_state=71)
model.fit(train_x)
# 변환 적용
train_x = model.transform(train_x)
test_x = model.transform(test_x)
# LinearDiscriminantAnalysis
# -----------------------------------
# 표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
# -----------------------------------
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
# 데이터는 단어-문서의 카운트 행렬 등으로 함
# 학습 데이터를 기반으로 LDA에 의한 변환을 정의
lda = LDA(n_components=1)
lda.fit(train_x, train_y)
# 변환 적용
train_x = lda.transform(train_x)
test_x = lda.transform(test_x)
# t-sne
# -----------------------------------
# 현 버전에 설치 이슈가 있어, 확인 중.
# 표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
# -----------------------------------
import bhtsne
# 데이터는 표준화 등의 스케일을 갖추기 위한 전처리가 이루어져야 함
# t-sne에 의한 변환
data = pd.concat([train_x, test_x])
embedded = bhtsne.tsne(data.astype(np.float64), dimensions=2, rand_seed=71)
# UMAP
# -----------------------------------
# 표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
# -----------------------------------
import umap
# 데이터는 표준화 등의 스케일을 갖추는 전처리가 이루어져야 함
# 학습 데이터를 기반으로 UMAP에 의한 변환을 정의
um = umap.UMAP()
um.fit(train_x)
# 변환 적용
train_x = um.transform(train_x)
test_x = um.transform(test_x)
# 클러스터링
# -----------------------------------
# 표준화된 데이터를 사용
train_x, test_x = load_standarized_data()
# -----------------------------------
from sklearn.cluster import MiniBatchKMeans
# 데이터는 표준화 등의 스케일을 갖추는 전처리가 이루어져야 함
# 학습 데이터를 기반으로 Mini-Batch K-Means를 통한 변환 정의
kmeans = MiniBatchKMeans(n_clusters=10, random_state=71)
kmeans.fit(train_x)
# 해당 클러스터를 예측
train_clusters = kmeans.predict(train_x)
test_clusters = kmeans.predict(test_x)
# 각 클러스터 중심까지의 거리를 저장
train_distances = kmeans.transform(train_x)
test_distances = kmeans.transform(test_x)
참고 : 데이터가 뛰어노는 AI 놀이터, 캐글