1제조 데이터 피처의 특성
피처 엔지니어링(Feature Engineering)은 원시 데이터를 모델이 학습하기 좋은 형태로 변환하는 과정입니다. 제조 환경에서는 센서 데이터의 특성상 시간, 주파수, 통계적 특성을 모두 고려해야 합니다.
제조 데이터의 특징은 다음과 같습니다:
- 시계열성: 센서 값은 시간에 따라 변화하며, 과거 값이 미래 예측에 중요
- 다변량성: 수백 개의 센서가 동시에 측정되며 상호 연관성 존재
- 주파수 패턴: 진동, 전류 등은 주파수 도메인에서 의미 있는 패턴 발견
- 도메인 지식: 물리적 법칙과 공정 지식을 반영한 피처가 효과적
시간 도메인 피처
평균, 표준편차, RMS 등 원시 신호의 통계적 특성을 나타내는 피처
주파수 도메인 피처
FFT를 통한 주파수 분석, 진동 패턴, 모터 이상 탐지에 유용
도메인 지식 피처
물리 법칙과 공정 전문 지식을 반영한 엔지니어링 피처
상호작용 피처
센서 간 비율, 곱셈, 차이 등 변수 간 관계를 나타내는 피처
2시계열 피처 추출
시간 도메인에서 센서 데이터의 통계적 특성을 추출합니다. 슬라이딩 윈도우를 사용하여 시간 구간별로 피처를 계산합니다.
# 시계열 피처 추출기
class TimeSeriesFeatureExtractor:
# 설정: 윈도우 크기, 오버랩 비율
config = {window_size: 100, overlap: 0.5}
# 슬라이딩 윈도우로 피처 추출
extract_features(data, sensor_columns):
for each window in sliding_windows(data):
for each sensor:
features = extract_sensor_features(window[sensor])
return features_dataframe
# 센서별 통계 피처 (시간 도메인)
extract_sensor_features(values):
mean = 평균값
std = 표준편차
rms = sqrt(mean(values^2)) # 신호 에너지
kurtosis = 첨도 (뾰족한 정도)
skewness = 왜도 (비대칭도)
peak_to_peak = max - min
crest_factor = peak / rms # 충격 검출
# 롤링 윈도우 피처 (시간 변화 추적)
rolling_features(sensor, windows=[10, 30, 60]):
rolling_mean_{window} = 이동평균
rolling_std_{window} = 이동표준편차
pct_change_{window} = 변화율
# 예시: 진동 센서 → 피처
vibration_x → vibration_x_mean, vibration_x_std, vibration_x_rms, ...
temperature → temperature_mean, temperature_rolling_mean_30, ...
Mean(평균)은 신호의 중심 경향을 나타내며 DC 성분 측정에 적합합니다. RMS(Root Mean Square)는 신호의 에너지를 나타내며 AC 성분이 포함된 진동, 전류 측정에 더 유용합니다. 제조 설비 모니터링에서는 RMS가 설비 상태를 더 잘 반영합니다.
3주파수 도메인 피처
진동, 전류, 압력 등의 신호는 주파수 도메인에서 분석하면 특정 주파수 대역의 이상을 탐지할 수 있습니다. FFT(Fast Fourier Transform)를 사용하여 주파수 스펙트럼을 추출합니다.
# 주파수 피처 추출기
class FrequencyFeatureExtractor:
# FFT 기반 피처 추출
extract_fft_features(signal, sampling_rate=1000):
# 1. FFT 변환
fft_values = FFT(signal)
fft_magnitude = abs(fft_values)
psd = fft_magnitude^2 # Power Spectral Density
# 2. 주요 피처 계산
peak_frequency = argmax(magnitude)의 주파수
spectral_energy = sum(psd) # 총 에너지
spectral_centroid = sum(freq * psd) / sum(psd) # 무게중심
spectral_entropy = -sum(p * log(p)) # 신호 복잡도
# 3. 대역별 에너지 (제조 설비용)
energy_low = sum(psd[0-50Hz]) # 저주파
energy_mid = sum(psd[50-200Hz]) # 중간주파
energy_high = sum(psd[200-500Hz]) # 고주파
# 모터 결함 진단 (주파수 패턴 분석)
class MotorSignatureAnalyzer:
motor_hz = motor_rpm / 60 # RPM → Hz 변환
detect_motor_faults(vibration_signal):
fft = FFT(signal)
# 결함별 주파수 패턴
imbalance = magnitude at 1x RPM # 불균형
misalignment = magnitude at 2x, 3x RPM # 축정렬 불량
bearing = sum(magnitude[1-5kHz]) # 베어링 결함
looseness = sum(harmonics 1x~5x) # 느슨함
return fault_scores
불균형(Imbalance): 1x RPM | 미스얼라인먼트(Misalignment): 2x, 3x RPM | 베어링 결함(Bearing Fault): BPFO, BPFI (고주파) | 느슨함(Looseness): 여러 하모닉 성분. 이러한 패턴을 피처로 활용하면 정밀한 예측 정비가 가능합니다.
4자동화된 피처 선택
수백 개의 피처를 모두 사용하면 과적합과 계산 비용 증가 문제가 발생합니다. 통계적 방법과 머신러닝 기법을 사용하여 중요한 피처만 선택합니다.
# 자동 피처 선택기
class AutoFeatureSelector:
# 방법 1: 상호 정보량 (비선형 관계 탐지)
select_by_mutual_information(X, y, k=50):
scores = mutual_info(X, y)
return top_k_features(scores)
# 방법 2: RFE (재귀적 피처 제거)
select_by_rfe(X, y, n_features=50):
model = RandomForest()
# 가장 낮은 중요도 피처를 반복 제거
rfe = RFE(model, n_features)
return selected_features
# 방법 3: 트리 기반 중요도
select_by_importance(X, y, threshold=0.01):
model = RandomForest().fit(X, y)
importances = model.feature_importances_
return features where importance >= threshold
# 방법 4: 상관관계 기반
select_by_correlation(X, y, threshold=0.1):
correlations = X.corrwith(y)
return features where abs(corr) >= threshold
# 중복 피처 제거 (상관계수 0.95 이상)
remove_correlated_features(X):
corr_matrix = X.corr()
return features without highly_correlated_pairs
# 앙상블: 여러 방법 조합
ensemble_selection(X, y, methods, top_k):
for method in methods:
scores[method] = run_method(X, y)
# Soft voting: 평균 점수
# Hard voting: 다수결
return top_k by ensemble_scores
| 방법 | 장점 | 단점 | 사용 시기 |
|---|---|---|---|
| Mutual Information | 비선형 관계 탐지 | 계산 비용 높음 | 복잡한 관계가 있는 데이터 |
| RFE | 모델 기반 선택 | 시간 소요 큼 | 정확한 선택이 필요할 때 |
| Tree Importance | 빠르고 직관적 | 편향 가능성 | 초기 탐색 단계 |
| Correlation | 매우 빠름 | 선형 관계만 탐지 | 빠른 필터링이 필요할 때 |
5Feature Store 통합
Feast를 사용하여 피처를 중앙에서 관리하고, 학습과 추론 환경에서 일관되게 사용할 수 있습니다.
# Feast Feature Store 구성
# 1. Entity 정의 (피처의 키)
Entity: machine_id (설비 ID)
# 2. FeatureView 정의 (피처 그룹)
sensor_stats_features:
entity: machine_id
ttl: 7일 # 피처 유효 기간
features:
- vibration_x_mean, vibration_x_std, vibration_x_rms
- temperature_mean, pressure_mean
source: sensor_features.parquet
frequency_features:
entity: machine_id
features:
- peak_frequency, spectral_energy
- energy_low, energy_mid, energy_high
source: frequency_features.parquet
# 3. Feature Store 사용
class FeastFeatureManager:
# 피처 저장 (Offline + Online)
ingest_features(df, feature_view_name):
store.write_to_offline_store(df) # 학습용
store.materialize() # 추론용 동기화
# 학습용: 과거 시점 피처 조회
get_historical_features(entity_df, features):
return store.get_historical_features(entity_df, features)
# 추론용: 최신 피처 조회 (실시간)
get_online_features(entity_rows, features):
return store.get_online_features(entity_rows, features)
1) 피처 재사용: 한 번 정의한 피처를 여러 모델에서 사용 | 2) 일관성 보장: 학습과 추론 환경에서 동일한 피처 사용 | 3) 버전 관리: 피처 변경 이력 추적 | 4) 성능 최적화: Online Store로 실시간 추론 가속화