[머신러닝] 특성 공학
특성 공학이란?
특성 공학(Feature Engineering)은 기계학습 모델에서 가장 중요한 단계 중 하나로, 원시 데이터를 더 유용한 형태로 전처리하고 변환하는 과정을 말합니다. 이 과정은 기계 학습 알고리즘이 모델을 훈련할 때 사용할 수 있도록 데이터를 준비하는 것입니다. 특성 공학은 데이터 세트 내의 특성(또는 변수)을 분석, 선택 및 변환하여 기계 학습 모델의 성능을 최적화하는 것을 목표로 합니다.
특성 공학의 정의
특성 공학은 기계 학습 모델이 ‘학습’할 때 최적의 결과를 얻을 수 있도록 데이터를 적절히 변환하고 최적화하는 과정입니다. 이 과정에서는 원본 데이터로부터 새로운 특성을 생성하거나 기존 특성을 수정하여 모델이 이해하기 쉽고, 효과적으로 처리할 수 있는 형태로 만듭니다. 특성 선택, 특성 추출, 특성 생성 등 여러 방법이 포함되며, 이런 변환은 모델이 데이터를 더 잘 이해하고, 더 정확한 예측을 내리는 데 도움을 줍니다.
특성 공학의 중요성
데이터의 질과 특성의 선택 및 변환은 모델의 예측 성능에 직접적인 영향을 미칩니다. 좋은 특성을 선택하고 효과적으로 변환함으로써, 조금 더 간단한 모델을 사용하더라도 더 높은 성능을 달성할 수 있습니다. 반대로, 관련 없거나 노이즈가 많은 특성을 그대로 사용하면, 모델이 복잡해지고 과적합(overfitting) 될 가능성이 높아집니다. 따라서 특성 공학은 모델의 일반화 능력을 향상시키고, 학습 시간을 단축시켜, 전반적인 성능을 크게 개선할 수 있습니다.
기계학습 모델의 성능 향상에 미치는 영향
특성 공학은 데이터를 모델이 ‘이해’할 수 있는 최적의 형태로 변환하기 때문에, 모델의 성능 향상에 결정적인 역할을 합니다. 예를 들어, 분류 문제에서는 특성 공학을 통해 클래스 간의 구분이 더 명확한 특성을 만들 수 있고, 회귀 문제에서는 출력 변수와의 상관 관계가 더 강한 특성을 생성할 수 있습니다. 특성 공학을 통해 오버피팅을 줄이고, 모델의 정확도를 높이며, 학습 과정을 보다 효율적으로 만들 수 있습니다.
특성 공학의 과정은 통계적 분석과 도메인 지식을 기반으로 하며, 종종 탐색적 데이터 분석(EDA)과 밀접하게 연관되어 있습니다. 우수한 특성을 설계하기 위해 데이터 이해와 전문 지식, 실험을 통한 반복적인 접근이 필요합니다.
예시
예를 들어, 날짜 데이터를 다루고 있다면, 단순히 연-월-일 정보에서 그치지 않고, 해당 날짜가 주말인지 아닌지, 공휴일인지 아닌지, 계절이 무엇인지 등 추가적인 정보를 특성으로 생성할 수 있습니다. 이러한 특성 공학의 접근은 모델이 더 복잡한 패턴을 이해하고 예측 성능을 높일 수 있게 합니다.
import pandas as pd
# 날짜 데이터 예시
data = {'date': ['2023-04-01', '2023-04-02', '2023-04-03']}
df = pd.DataFrame(data)
# datetime으로 변환
df['date'] = pd.to_datetime(df['date'])
# 연, 월, 일, 요일 추가
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['weekday'] = df['date'].dt.weekday
print(df)
이 코드는 날짜 데이터로부터 추가적인 시간 관련 특성을 추출하는 간단한 예시입니다. 이처럼 특성 공학을 통해 기계 학습 모델의 입력 데이터를 변환하고 최적화하는 것은 모델의 성능을 극대화하는 필수적인 접근법입니다.
특성 선택(Feature Selection)은 머신러닝 모델의 성능을 향상시키고, 과적합을 줄이며, 모델을 더 빠르고 효율적으로 만들기 위해 중요한 단계입니다. 머신러닝 알고리즘에 적용되는 데이터는 수백에서 수천 개의 특성을 가질 수 있으며, 이 중 일부는 불필요하거나 중복될 수 있습니다. 따라서 특성 선택은 중요한 특성을 식별하고, 불필요한 특성을 제거하여 모델링 과정을 최적화하는 기술입니다.
특성 선택의 정의
특성 선택은 데이터셋의 특성(또는 변수) 중에서 중요한 특성만을 선택하고, 나머지는 배제함으로써 데이터의 차원을 줄이는 과정입니다. 이는 모델이 더 빠르고 정확하게 예측하기 위해 필요한 과정으로, 모델의 복잡성을 줄이고, 과적합 위험을 감소시킵니다.
특성 선택 기법
필터 방식(Filter Methods)
필터 방식은 모델 학습 전에 특성의 중요도를 평가하여 중요한 특성을 선택합니다. 이 방식은 통계적 기준을 사용하여 각 특성의 중요도를 평가하고, 특정 임곗값보다 중요도가 높은 특성만 선택합니다. 예를 들어 상관계수, 카이제곱 검정, 정보 이득 등이 있습니다.
from sklearn.feature_selection import SelectKBest, chi2
X = ... # 특성 데이터
y = ... # 타겟 변수
# 최상의 5개 특성을 선택
X_new = SelectKBest(chi2, k=5).fit_transform(X, y)
래퍼 방식(Wrapper Methods)
래퍼 방식은 특정 머신러닝 모델의 성능을 기준으로 특성의 중요도를 평가합니다. 이 방식은 후진 제거법(Backward Elimination), 전진 선택법(Forward Selection), 단계적 선택법(Stepwise Selection) 등이 있습니다. 래퍼 방식은 모델을 기반으로 최적의 특성 조합을 찾아내는 과정이 포함되므로 계산 비용이 높을 수 있습니다.
from mlxtend.feature_selection import SequentialFeatureSelector as SFS
from sklearn.linear_model import LogisticRegression
# 데이터 준비
X = ... # 특성 데이터
y = ... # 타겟 변수
# 로지스틱 회귀 모델을 사용한 전진 선택법
sfs = SFS(LogisticRegression(),
k_features=3,
forward=True,
floating=False,
scoring='accuracy',
cv=0)
sfs = sfs.fit(X, y)
selected_features = X.columns[list(sfs.k_feature_idx_)]
임베디드 방식(Embedded Methods)
임베디드 방식은 모델 자체의 특성 선택 기능을 사용하여 중요한 특성을 선택합니다. 이 방식은 모델을 학습하는 동시에 특성의 중요도를 평가하고 선택합니다. 예를 들어, LASSO 회귀가 임베디드 방식을 사용하는 한 예입니다.
from sklearn.linear_model import LassoCV
# 데이터 준비
X = ... # 특성 데이터
y = ... # 타겟 변수
# LASSO 모델을 사용한 특성 선택
lasso = LassoCV().fit(X, y)
importance = np.abs(lasso.coef_)
print("Selected Features:", np.where(importance > 0)[0])
특성 선택의 적용 사례
특성 선택은 다양한 머신러닝 프로젝트에서 사용됩니다. 예를 들어, 고차원의 유전자 데이터셋에서 중요한 유전자를 식별하거나, 금융 분야에서 중요한 지표를 선택하여 주식 가격 예측 모델을 개선하는데 사용됩니다. 또한, 텍스트 분류 문제에서도 중요한 단어나 문구를 식별하기 위해 특성 선택 방법이 사용됩니다.
특성 추출(Feature Extraction)은 고차원 데이터에서 중요한 정보를 요약해 내면서 차원을 감소시키는 과정입니다. 이 목적은 데이터 내의 중요한 정보는 최대한 보존하면서, 계산 비용과 과적합(overfitting)의 위험을 줄이기 위해 불필요한 정보를 제거하는 것입니다. 특성 추출은 데이터 전처리, 시각화, 그리고 머신러닝 모델의 성능 향상을 위해 주로 사용됩니다.
주요 특성 추출 기법
주성분 분석(PCA)
PCA는 데이터에서 가장 큰 변동성(Variance)을 가지는 방향을 찾아, 그 방향으로 데이터를 투영시킵니다. 이 과정을 반복해 주요 축을 여러 개 찾아내며, 이 축들은 서로 직교(orthogonal)합니다. PCA는 차원 축소, 시각화 등에서 주로 사용됩니다. Python 예시:
from sklearn.decomposition import PCA
pca = PCA(n_components=2) # 2차원으로 축소
transformed_data = pca.fit_transform(original_data)
선형 판별 분석(LDA)
LDA는 클래스를 가장 잘 구분하는 축을 찾는 것을 목표로 하는 방법입니다. 주로 지도 학습에서 사용되며, 클래스 간 분산은 최대화하고, 클래스 내 분산은 최소화하는 방식으로 작동합니다. 이는 데이터의 분류 문제에 유용하게 적용됩니다. Python 예시:
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
lda = LDA(n_components=2) # 2차원으로 축소
transformed_data = lda.fit_transform(X, y) # X는 데이터, y는 레이블
t-SNE
t-SNE(t-distributed Stochastic Neighbor Embedding)는 고차원 데이터의 구조를 보존하면서 저차원(주로 2차원 또는 3차원)으로 매핑하는 기술입니다. 특히 복잡한 구조를 가진 데이터의 시각화에 유용합니다. 서로 가까운 데이터는 저차원에서도 가깝게, 서로 먼 데이터는 멀게 매핑됩니다. Python 예시:
from sklearn.manifold import TSNE
tsne = TSNE(n_components=2) # 2차원으로 축소
transformed_data = tsne.fit_transform(original_data)
특성 추출의 적용 사례
특성 추출은 다양한 분야에서 적용됩니다. 예를 들어, 이미지 처리에서는 고차원의 이미지 데이터로부터 필요한 정보를 추려내기 위해 PCA나 t-SNE 같은 기술을 사용할 수 있습니다. 텍스트 데이터 분석에서도 고차원 단어 벡터에서 중요한 특성을 추출하여 문서 분류, 감성 분석 등에 사용됩니다. 금융 분석에서는 주성분 분석(PCA)를 이용해 다수의 경제 지표 중 주요한 변동 요인을 추려낼 수 있습니다.
이러한 기법들을 활용함으로써, 원래의 고차원 데이터에 비해 훨씬 적은 차원의 데이터를 이용하여 빠르고 효율적으로 정보를 처리할 수 있게 됩니다. 이는 모델의 복잡도를 줄이고, 계산 비용을 낮추며, 과적합의 위험을 감소시키는데 도움을 줍니다.
특성 생성(Feature Creation)
특성 생성(Feature Creation)은 기존 데이터로부터 새로운 특성을 생성하는 프로세스로, 기계 학습 모델의 성능을 향상시키기 위해 사용됩니다. 이는 기존 특성의 조합, 변환, 또는 새로운 데이터 소스로부터 추가적인 정보를 추출하여 수행됩니다.
특성 생성의 정의
특성 생성은 원본 데이터 세트의 정보를 최대한 활용하여 새로운 정보를 도출하는 과정입니다. 이 과정을 통해 모델이 데이터에서 패턴을 더 잘 학습할 수 있도록 도와주며, 종종 모델의 정확도를 크게 향상시킬 수 있습니다.
수동 특성 생성과 자동 특성 생성
특성 생성은 크게 수동과 자동 두 가지 방식으로 나눌 수 있습니다.
-
수동 특성 생성: 도메인 지식을 활용하여 직접 새로운 특성을 만드는 방법입니다. 예를 들어, 날짜 데이터에서 요일, 주, 월 등을 파생시키는 것이 있습니다. 수동 특성 생성은 분석가의 통찰력에 크게 의존합니다.
-
자동 특성 생성: 기계 학습 알고리즘을 사용하여 자동으로 새로운 특성을 생성하는 방식입니다. 예를 들어, 특성 추출 기법이나 딥러닝 모델을 사용할 수 있습니다.
특성 생성 기법과 도구
특성 생성에 사용될 수 있는 다양한 기법과 도구가 있습니다.
- 수학적 변환: 로그 변환, 제곱, 제곱근 등 기존 변수에 수학적 연산을 적용하는 방법
- 결합: 두 개 이상의 변수를 결합하여 새로운 변수 생성. 예를 들어, "성"과 "이름"을 결합하여 "전체 이름" 생성
- 범주화: 연속형 변수를 임계값을 기준으로 여러 범주로 나누는 과정
- 다항 특성(Polynomial Features): sklearn의
PolynomialFeatures
를 활용하여 특성 간의 상호작용을 통한 새로운 특성 생성
예시: 다항 특성 생성
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
# 임의 데이터 생성
X = np.array([[1, 2], [3, 4], [5, 6]])
# 다항 특성 생성기 정의
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)
print(X_poly)
특성 생성의 적용 사례
특성 생성은 다양한 데이터 과학 및 기계 학습 프로젝트에서 활용됩니다. 예를 들어, 금융 분야에서는 고객 데이터로부터 신용 점수를 예측하기 위한 새로운 특성을 생성할 수 있습니다. 마케팅 분야에서는 고객의 구매 이력으로부터 고객 세분화를 위한 새로운 특성을 만들 수 있습니다.
특성 생성은 모델의 성능을 향상시키는 중요한 단계 중 하나입니다. 적절한 도메인 지식과 창의적인 사고를 바탕으로 새롭고 유익한 특성을 만들어내는 것이 중요합니다.
차원 축소(Dimensionality Reduction)와의 차이점
차원 축소는 고차원 데이터를 저차원으로 표현하는 프로세스입니다. 이 과정은 데이터의 중요한 정보를 최대한 유지하며 차원의 수를 줄여 계산 복잡도를 감소시키고, 시각화를 용이하게 합니다. 주요 차원 축소 기법에는 주성분 분석(PCA), t-SNE, LDA(Linear Discriminant Analysis) 등이 있습니다.
차원 축소와 특성 선택/추출의 차이점
-
특성 선택(Feature Selection) 은 원본 특성 집합에서 중요한 특성을 선택하는 과정입니다. 즉, 데이터의 차원을 줄이기 위해 불필요하거나 중복된 특성을 제거하지만, 원본 특성의 형태는 유지됩니다. 특성 선택 방법에는 필터 방법, 래퍼 방법, 임베디드 방법 등이 있습니다.
-
특성 추출(Feature Extraction) 은 원본 고차원 데이터를 보다 낮은 차원의 데이터로 변환하는 과정입니다. 이때 변환된 데이터는 원본 데이터의 중요한 정보를 요약한 새로운 특성들로 구성됩니다. 특성 추출은 데이터의 차원을 축소하는 결과를 도출하지만, 새롭게 생성된 특성은 원본 데이터의 특성과는 다른 형태를 갖습니다.
차원 축소와 특성 생성의 관계
- 특성 생성(Feature Creation) 은 기존 데이터에서 새로운 특성을 생성하는 과정입니다. 이 과정에서 데이터의 차원이 증가할 수도 있습니다. 차원 축소는 이렇게 생성된 다양한 특성을 포함한 데이터의 차원을 줄여, 모델의 성능을 향상시키고 과적합을 방지하기 위해 사용될 수 있습니다.
차원 축소의 중요 포인트
차원 축소는 데이터의 복잡성을 줄이고, 노이즈를 제거하며, 데이터를 시각화하기 위해 필수적입니다. 하지만 차원 축소 과정에서 정보 손실이 발생할 수 있습니다. 따라서 목적에 맞게 적절한 방법을 선택하는 것이 중요합니다.
예시: 주성분 분석(PCA)을 활용한 차원 축소
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import numpy as np
# 데이터를 표준화(평균 0, 단위 분산)
X_std = StandardScaler().fit_transform(X)
# PCA 실행
pca = PCA(n_components=2) # 2차원으로 축소
X_pca = pca.fit_transform(X_std)
print(f'원본 데이터의 차원: {X_std.shape[1]}')
print(f'축소된 데이터의 차원: {X_pca.shape[1]}')
이 예시에서 PCA를 활용하여 데이터를 2차원으로 축소했습니다. 이렇게 차원이 축소된 데이터는 분석이나 시각화에 유용하게 사용될 수 있습니다.
결론
차원 축소는 기계학습에서 데이터를 효율적으로 처리하기 위해 필수적인 과정입니다. 특성 선택/추출과 같은 다른 특성 공학 기법과 결합하여 사용될 때, 더욱 효과적인 데이터 전처리 및 모델링 결과를 얻을 수 있습니다.
적용 사례
특성 공학은 기계 학습 모델의 성능을 향상시키기 위해 필수적인 단계 중 하나입니다. 이는 데이터의 본질을 더 잘 반영할 수 있는 특성(Features)을 찾아내어 모델의 학습 효율을 증대시키는 과정입니다. 실제 적용 사례를 통해 특성 공학의 중요성과 그 효과를 살펴보겠습니다.
금융 분야에서의 사기 탐지
금융 분야에서 사기 탐지는 막대한 손실을 방지하기 위한 핵심적인 작업입니다. 신용카드 사기, 은행 계좌 사기 등 다양한 형태의 금융 사기가 존재하며, 이를 탐지하기 위해 특성 공학은 큰 역할을 합니다.
특성 공학의 역할:
- 시간대별 분석: 사기 거래는 특정 시간대에 집중적으로 발생할 수 있습니다. 거래 시간을 기준으로 하루 중 시간대별, 요일별 특성을 만들어 분석할 수 있습니다.
- 지리적 정보 활용: 거래가 이루어진 지리적 위치를 활용하여 비정상적인 거리에서의 거래를 탐지하는 특성을 생성합니다.
- 거래 행동 분석: 짧은 시간 내에 이루어진 다수의 거래나 평소와 다른 큰 금액의 거래 등, 사용자의 일반적인 거래 패턴과 다른 행동을 분석합니다.
성공 사례 분석:
한 금융 기관에서는 고객의 거래 패턴과 이전 사기 사례를 분석하여 특성을 추출하고, 이를 기반으로 머신러닝 모델을 통해 실시간으로 사기 거래를 탐지하는 시스템을 개발했습니다. 이 과정에서 특성 공학을 통해 사기 거래의 패턴을 더 명확하게 파악할 수 있었으며, 이로 인해 사기 거래 탐지율을 기존 대비 20% 향상시켰습니다.
의료 분야에서의 질병 예측
의료 분야에서는 환자의 다양한 의료 기록과 검사 결과를 통해 질병을 예측하는 것이 중요합니다.
특성 공학의 역할:
- 라벨 단순화: 복잡한 의료 기록에서 핵심적인 정보를 추출하여 쉽게 분석할 수 있는 형태로 변환합니다.
- 결합 특성 생성: 다양한 검사 결과의 비율이나 차이를 통해 새로운 특성을 생성합니다. 예를 들어, 두 가지 혈액 검사 결과의 비율을 통해 특정 질병의 위험도를 측정할 수 있습니다.
- 시간적 변화 분석: 시간의 경과에 따른 환자의 상태 변화를 반영하는 특성을 생성하여, 질병의 진행 상태나 발병 위험을 예측합니다.
성공 사례 분석:
한 연구에서는 환자의 기존 의료 기록을 분석하여 당뇨병 발병 위험을 예측하는 모델을 개발했습니다. 이때 연령, 체질량 지수(BMI), 가족력 등 기존 정보에 더해, 검사 결과 간의 비율과 같은 새로운 특성을 개발하여 사용함으로써 모델의 예측 정확도가 크게 향상되었습니다.
소셜 미디어에서의 감성 분석
소셜 미디어의 데이터는 대량의 의견과 감정을 담고 있으며, 이를 분석하는 것은 여러 분야에서 중요한 통찰을 제공합니다.
특성 공학의 역할:
- 텍스트 데이터 전처리: 소셜 미디어 텍스트에서 유의미한 정보를 추출하기 위한 전처리 과정. 해시태그, 이모티콘 등을 활용한 특성 추출이 포함됩니다.
- N-gram 분석: 텍스트 내 단어의 조합을 분석하여 문맥상 의미를 포착하는 특성을 생성합니다.
- 감성 단어 사전 활용: 사전에 정의된 긍정적 혹은 부정적 의미를 가진 단어의 빈도를 분석하여 감성 점수를 계산하는 특성을 생성합니다.
성공 사례 분석:
한 기업에서는 제품에 대한 소셜 미디어 상의 리뷰를 분석하여, 고객 만족도를 평가하는 모델을 개발했습니다. 이 과정에서 텍스트 데이터를 충분히 활용하기 위해 다양한 특성 공학 기법을 사용했습니다. 예를 들어, 감성 단어 사전을 통한 점수화, 특정 제품 관련 용어의 빈도 분석 등을 통해, 고객의 긍정적 혹은 부정적 의견을 정확히 분류할 수 있었으며, 이로 인해 제품 개선에 큰 도움을 받을 수 있었습니다.
특성 공학은 다양한 분야에서 데이터의 질과 모델의 성과를 높이는 데 기여합니다. 다른 분야에서도 이러한 접근 방식을 적용하여 데이터 분석과 모델링 과정을 최적화할 수 있습니다.