본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 07. 05:00

더 나은 데이터가 더 나은 알고리즘을 이긴다: 모델을 바꾸기 전에 데이터를 바꿔라

요약

모델의 성능 향상을 위해 알고리즘을 교체하기보다 데이터 품질을 개선하는 것이 더 효과적임을 강조합니다. 결측치 처리와 이상치 대응 등 특성 공학(Feature Engineering)의 중요성을 실제 실험 사례를 통해 설명합니다.

핵심 포인트

  • 알고리즘 변경보다 데이터 품질 개선이 성능 향상에 더 결정적임
  • 결측치 처리 시 단순 삭제보다 KNN Imputation 등이 효과적임
  • 이상치는 모델의 분포 왜곡을 초래하므로 적절한 처리가 필요함
  • 데이터 전처리는 머신러닝 프로젝트의 핵심 단계임

특성 공학 (Feature Engineering)을 통해 배운, 더 나은 데이터가 종종 더 나은 알고리즘을 이기는 방법

내가 처음 머신러닝 (Machine Learning)을 배우기 시작했을 때, 나는 많은 초보자가 믿는 것을 믿었다:

내 모델의 성능이 좋지 않다면, 더 나은 알고리즘이 필요하다.

그래서 나는 계속해서 모델을 교체했다.

로지스틱 회귀 (Logistic Regression)에서 결정 트리 (Decision Trees)로, 그다음에는 랜덤 포레스트 (Random Forest)로 옮겨갔고, 나중에는 XGBoost와 신경망 (Neural Networks)에 대해서도 읽기 시작했다.

결과는 약간 개선되었지만, 극적으로 변하지는 않았다.

나를 놀라게 했던 것은 가장 큰 개선이 알고리즘을 바꾸는 것에서 오지 않았다는 점이다.

그것은 데이터를 바꾸는 것에서 왔다.

문제 (The Problem)

나는 결측치 (missing values), 이상치 (outliers), 그리고 범주형 변수 (categorical variables)를 포함하는 데이터셋을 작업하고 있었다.

많은 초보자처럼, 나의 첫 본능은 단순했다:

model.fit(X_train, y_train)
pred = model.predict(X_test)

모델은 성공적으로 학습되었다.

정확도 (accuracy)는 수용 가능한 수준으로 보였다.

하지만 무언가 잘못된 느낌이 들었다.

데이터 자체가 지저분했다.

어떤 열 (columns)들은 결측치를 포함하고 있었다.

일부 수치형 특성 (numerical features)에는 극단적인 이상치가 있었다.

여러 범주형 열 (categorical columns)은 텍스트로 표현되어 있었다.

그럼에도 불구하고 나는 모델이 마법처럼 모든 것을 학습하기를 기대했다.

나의 첫 번째 실험

나는 가공되지 않은 원시 데이터셋 (raw dataset)으로 로지스틱 회귀 (Logistic Regression) 모델을 학습시켰다.

결과:

Accuracy : 72%

나쁘지는 않았다.

그렇다고 인상적이지도 않았다.

모델을 바꾸는 대신, 나는 데이터를 조사하기로 결정했다.

이것은 프로젝트 전체에서 가장 중요한 결정이 되었다.

1단계: 결측치 처리 (Handling Missing Values)

데이터셋에는 여러 결측치가 포함되어 있었다.

처음에는 단순히 행 (rows)을 삭제하는 것을 고려했다.

df.dropna(inplace=True)

문제는 무엇이었을까?

데이터의 상당 부분을 잃어버렸다는 것이다.

그래서 나는 여러 가지 접근 방식을 실험했다:

평균 대치 (Mean Imputation)

from sklearn.impute import SimpleImputer

imputer = SimpleImputer(strategy='mean')
...

중앙값 대치 (Median Imputation)

imputer = SimpleImputer(strategy='median')

KNN 대치 (KNN Imputation)

from sklearn.impute import KNNImputer

imputer = KNNImputer(n_neighbors=5)
...

KNN은 단순 평균 (simple averaging)보다 레코드 간의 관계를 훨씬 더 잘 보존했습니다.

이것만으로도 성능이 향상되었습니다.

2단계: 이상치 (Outliers) 대응하기

그 다음 수치형 컬럼들을 시각화했습니다.

박스 플롯 (Boxplots)의 상태가 매우 좋지 않았습니다.

몇몇 극단적인 값들이 전체 분포를 왜곡하고 있었습니다.

sns.boxplot(df["experience"])

모델은 소수의 특이한 관측치 (observations)에 맞추기 위해 너무 많은 노력을 기울이고 있었습니다.

저는 IQR (Interquartile Range) 기반 처리를 사용했습니다.

Q1 = df["experience"].quantile(0.25)
Q3 = df["experience"].quantile(0.75)

...

이상치를 제거한 후, 데이터 분포가 훨씬 깔끔해졌습니다.

더 중요한 점은, 모델이 노이즈 (noise) 대신 실제 패턴을 학습하기 시작했다는 것입니다.

3단계: 범주형 특성 (Categorical Features) 인코딩

머신러닝 (Machine Learning) 알고리즘은 텍스트를 이해할 수 없습니다.

그들은 오직 숫자만을 이해합니다.

따라서 다음과 같은 컬럼들은:

Male
Female

...

변환이 필요했습니다.

저는 원-핫 인코딩 (One-Hot Encoding)을 적용했습니다.

pd.get_dummies(df,
               columns=["gender",
                        "company_type"])

그리고 순서가 중요한 경우에는 서수 인코딩 (Ordinal Encoding)을 적용했습니다.

education_level

High School
...

이를 통해 사람이 읽을 수 있는 범주 (categories)를 기계가 읽을 수 있는 정보로 변환했습니다.

4단계: 특성 스케일링 (Feature Scaling)

어떤 컬럼들은 다음과 같은 범위에 있었습니다:

0 – 5

반면 다른 컬럼들은 다음과 같은 범위에 있었습니다:

0 – 100000

거리 기반 알고리즘 (Distance-based algorithms)은 더 큰 값에 편향될 수 있습니다.

저는 최소-최대 스케일링 (MinMax Scaling)을 적용했습니다.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
...

이제 모든 특성 (feature)이 공정하게 기여하게 되었습니다.

그 다음에 어떤 일이 일어났을까요?

저는 정확히 동일한 로지스틱 회귀 (Logistic Regression) 모델을 다시 학습시켰습니다.

데이터를 제외하고는 아무것도 바꾸지 않았습니다.

결과:

특성 공학 (Feature Engineering) 전 : 72%

특성 공학 (Feature Engineering) 후 : 86%

14 퍼센트 포인트 (percentage points)의 상승입니다.

알고리즘을 바꾸지 않고도.

딥러닝 (deep learning)을 사용하지 않고도.

복잡성을 추가하지 않고도.

단지 데이터를 개선함으로써 얻은 결과입니다.

가장 중요한 교훈

이 프로젝트는 머신러닝 (Machine Learning)에 대해 생각하는 저의 방식을 바꾸어 놓았습니다.

이전에는 다음과 같이 믿었습니다:

더 나은 알고리즘 (Better Algorithm)
       ↓
더 나은 결과 (Better Results)

이제 저는 다음과 같이 믿습니다:

더 나은 데이터 (Better Data)
       ↓
더 나은 특성 (Better Features)
...

대부분의 실제 머신러닝 (Machine Learning) 문제는 알고리즘 문제가 아닙니다.

그것은 데이터 문제입니다.

저품질 데이터로 학습된 강력한 모델은 여전히 어려움을 겪을 것입니다.

깨끗하고 의미 있는 데이터로 학습된 단순한 모델은 종종 훨씬 더 복잡한 대안 모델보다 더 나은 성능을 보여줄 수 있습니다.

내가 직면했던 도전 과제들

가장 힘들었던 부분은 모델을 학습시키는 것이 아니었습니다.

가장 힘들었던 부분은 데이터를 준비하는 것이었습니다.

몇 가지 어려움은 다음과 같았습니다:

  • 완전 사례 분석 (Complete Case Analysis) 과정에서의 행 (row) 손실
  • 평균 (Mean), 중앙값 (Median), 그리고 KNN 대치 (Imputation) 사이의 선택
  • 변환된 데이터셋 (transformed datasets)의 결합
  • 원-핫 인코딩 (One-Hot Encoding) 이후의 차원 (dimensionality) 처리
  • 진짜 이상치 (outliers)와 가치 있는 희귀 사례 (rare cases)를 식별하는 것

이러한 도전 과제들은 모델 학습이 가르쳐준 것보다 더 많은 것을 저에게 가르쳐 주었습니다.

마치며

특성 공학 (Feature Engineering)은 머신러닝 (Machine Learning)에서 가장 화려한 부분은 아닙니다.

아무도 소셜 미디어에 결측치 처리 (missing value treatment) 스크린샷을 올리지 않습니다.

아무도 특성 스케일링 (scaling features)을 축하하지 않습니다.

하지만 바로 이 지점에서 실질적인 개선의 상당 부분이 일어납니다.

이 프로젝트를 거친 후, 저는 다음과 같은 질문을 멈추었습니다:

어떤 모델을 사용해야 할까?

그리고 다음과 같이 질문하기 시작했습니다:

내 데이터가 나에게 말하려는 것이 무엇인가?

이러한 단 한 번의 사고방식 변화가 새로운 알고리즘을 배우는 것보다 저의 머신러닝 기술을 더 많이 향상시켜 주었습니다.

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0