Python 머신러닝 모델 학습 – Scikit-learn을 활용한 완벽 가이드

지금 이 순간에도 수많은 데이터가 생성되고 분석되고 있습니다. 그 중심에는 데이터를 바탕으로 스스로 학습하는 인공지능, 즉 머신러닝이 있습니다. 본 포스팅에서는 Python을 기반으로 Scikit-learn을 활용하여 머신러닝 모델을 개발하고 학습시키는 전 과정을 다룹니다.


Python으로 머신러닝 모델 학습

📚 목차


1. 서론: 데이터의 시대, 머신러닝은 선택이 아닌 필수

기술이 진보하면서 우리는 방대한 양의 데이터를 매일 마주하게 됩니다. 기업은 고객 행동을 예측하고, 의료기관은 진단을 보조하며, 금융업계는 사기를 탐지합니다. 이 모든 곳에서 중심이 되는 기술이 바로 머신러닝입니다.

이러한 머신러닝을 가장 효율적으로 시작할 수 있는 방법이 있다면, 그것은 단연코 Python과 Scikit-learn의 조합일 것입니다. Python은 문법이 간결하고 다양한 데이터 과학 라이브러리를 지원하며, Scikit-learn은 이 중에서도 머신러닝 모델을 빠르게 개발하고 실험할 수 있는 도구로 널리 사용되고 있습니다.

이 글에서는 머신러닝의 기본 개념부터 Python 개발 환경 설정, 데이터 전처리, 분류와 회귀 모델 구현, 하이퍼파라미터 튜닝, 파이프라인 구성, 그리고 실전 프로젝트 예시까지 다룰 것입니다. 모든 내용은 실제 코드와 함께 설명되며, 초보자도 따라할 수 있는 단계별 흐름으로 구성되어 있습니다.

당신이 데이터 분석가든, 개발자든, 또는 머신러닝에 입문하고자 하는 열정적인 학습자든, 이 글을 통해 머신러닝의 세계로 한 걸음 더 다가설 수 있을 것입니다. 그럼 지금부터 Python과 Scikit-learn을 통해 실전 중심의 머신러닝 학습을 시작해봅시다.


2. 머신러닝의 개념과 Scikit-learn 소개

머신러닝(Machine Learning)은 데이터를 기반으로 스스로 학습하고 예측하거나 분류하는 인공지능 기술의 핵심 분야입니다. 사람이 직접 일일이 규칙을 정의하지 않아도, 머신러닝 알고리즘은 데이터 속 패턴을 스스로 발견하여 다양한 작업을 수행할 수 있습니다.

머신러닝의 기본 개념

머신러닝의 핵심은 ‘경험을 통한 성능 향상’에 있습니다. 시스템이 특정 작업을 수행하면서, 경험(데이터)이 쌓일수록 그 작업의 성능이 향상된다면 우리는 이를 머신러닝이라고 부를 수 있습니다.

머신러닝은 일반적으로 다음과 같이 분류됩니다:

유형 설명 예시
지도학습 (Supervised Learning) 입력과 정답(label)이 있는 데이터를 학습하여 새로운 데이터를 예측 스팸 이메일 분류, 집값 예측
비지도학습 (Unsupervised Learning) 정답이 없는 데이터로부터 구조나 패턴을 학습 고객 세분화, 이상 탐지
강화학습 (Reinforcement Learning) 행동에 따른 보상을 통해 최적의 정책을 학습 게임 AI, 자율주행

Scikit-learn이란?

Scikit-learn은 Python 기반의 머신러닝 라이브러리로, 간결하고 일관된 API를 통해 다양한 알고리즘을 손쉽게 사용할 수 있도록 도와줍니다. 다음과 같은 특징이 있어 많은 개발자와 연구자들에게 사랑받고 있습니다:

  • 분류, 회귀, 군집화 등 다양한 머신러닝 알고리즘 제공
  • 데이터 전처리, 모델 선택, 평가까지 통합된 워크플로우 지원
  • Pandas, NumPy, Matplotlib 등과의 뛰어난 호환성
  • 학습 → 예측 → 평가의 일관된 흐름

Scikit-learn의 대표적 알고리즘

Scikit-learn에서는 다음과 같은 핵심 알고리즘을 제공하며, 대부분은 간단한 코드 한 줄로 구현이 가능합니다.

from sklearn.linear_model import LinearRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.cluster import KMeans

Scikit-learn을 제대로 이해하기 위해서는 모델의 작동 원리와 함께, 해당 모델을 어떻게 학습시키고 평가하는지 흐름을 체계적으로 이해하는 것이 중요합니다. 이제 다음 장에서는 머신러닝을 시작하기 위한 Python 환경을 어떻게 설정하는지 알아보겠습니다.


3. Python 개발 환경 설정

머신러닝을 효과적으로 학습하고 실습하기 위해서는 안정적이고 효율적인 개발 환경이 반드시 필요합니다. 특히 Python 언어를 기반으로 하는 Scikit-learn은 오픈소스 생태계가 잘 갖추어져 있어, 간단한 환경 설정만으로도 곧바로 강력한 분석 환경을 구축할 수 있습니다.

Python 설치 및 가상환경 구성

가장 먼저 해야 할 일은 Python의 설치입니다. 공식 웹사이트(python.org)에서 최신 버전을 다운로드하여 설치할 수 있습니다. 그 다음, 프로젝트별로 독립적인 라이브러리 환경을 구성하기 위해 가상환경을 사용하는 것이 좋습니다.

다음은 가상환경 생성 및 활성화 예시입니다:

python -m venv ml-env
source ml-env/bin/activate  # Windows는 ml-env\Scripts\activate

이후, 환경이 활성화된 상태에서 필요한 라이브러리들을 설치하면 다른 프로젝트에 영향을 주지 않고 안전하게 실험할 수 있습니다.

Jupyter Notebook: 머신러닝 실습의 동반자

머신러닝 학습과 실험에는 Jupyter Notebook이 가장 널리 사용됩니다. 코드 실행과 동시에 시각화 결과를 바로 확인할 수 있어 데이터 분석과 반복적인 테스트에 매우 적합합니다.

다음 명령어로 설치할 수 있습니다:

pip install notebook
jupyter notebook

위 명령어를 실행하면 웹 브라우저에서 노트북 환경이 열리며, Python 코드를 셀 단위로 작성하고 실행할 수 있습니다.

Scikit-learn 및 필수 라이브러리 설치

머신러닝 프로젝트에 자주 사용되는 Python 라이브러리는 다음과 같습니다:

  • scikit-learn: 머신러닝 알고리즘과 툴킷 제공
  • numpy: 수치 계산을 위한 다차원 배열 처리
  • pandas: 데이터 조작 및 분석
  • matplotlib, seaborn: 데이터 시각화 도구

아래 명령어로 필요한 패키지를 한 번에 설치할 수 있습니다:

pip install scikit-learn numpy pandas matplotlib seaborn

이제 개발 환경이 모두 준비되었습니다. 다음 단계에서는 실제 데이터를 불러오고 머신러닝에 맞게 전처리하는 과정을 실습해보겠습니다.


4. 데이터 준비 및 전처리

머신러닝 모델의 성능은 주어진 데이터의 품질에 크게 좌우됩니다. 데이터를 올바르게 이해하고 정제하는 과정은 모델링만큼이나 중요합니다. Scikit-learn은 다양한 전처리 도구를 제공하여 이 과정을 효율적으로 처리할 수 있도록 지원합니다.

데이터셋 불러오기: 내장 데이터와 외부 파일

Scikit-learn은 학습용으로 적합한 여러 내장 데이터셋을 제공합니다. 가장 대표적인 것이 iris, boston, digits 등이 있으며, 초보자가 실습하기에 매우 적합합니다.

다음은 Iris 데이터셋을 불러오는 예제입니다:

from sklearn.datasets import load_iris
import pandas as pd

iris = load_iris()
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['target'] = iris.target
df.head()

또한 CSV 파일 형식의 외부 데이터도 pandasread_csv() 함수를 통해 손쉽게 불러올 수 있습니다.

결측치 처리

현실 세계의 데이터는 완전하지 않습니다. 누락된 값은 학습에 악영향을 미치므로 반드시 처리해야 합니다. Scikit-learn의 SimpleImputer를 사용하면 결측치를 평균, 중앙값, 최빈값 등으로 대체할 수 있습니다.

from sklearn.impute import SimpleImputer
import numpy as np

imputer = SimpleImputer(strategy='mean')
df_imputed = pd.DataFrame(imputer.fit_transform(df.drop(columns=['target'])), columns=iris.feature_names)

특성 스케일링 (Feature Scaling)

특정 알고리즘(예: SVM, KNN, 로지스틱 회귀)은 특성 간 스케일 차이에 민감합니다. 따라서 모든 특성 값을 동일한 범위로 정규화(normalization) 또는 표준화(standardization)하는 것이 필요합니다.

다음은 StandardScaler를 이용한 표준화 예제입니다:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(df_imputed)

범주형 변수 인코딩

머신러닝 알고리즘은 숫자 데이터를 입력으로 받기 때문에, 문자열로 된 범주형 변수는 OneHotEncoderLabelEncoder를 통해 숫자로 변환해야 합니다.

from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder(sparse=False)
encoded = encoder.fit_transform(df[['categorical_column']])

이처럼 데이터 전처리는 단순한 형식 변경이 아니라, 모델의 성능과 정확도에 직접적인 영향을 주는 중요한 단계입니다. 준비가 끝났다면, 이제 전처리된 데이터를 기반으로 첫 번째 머신러닝 모델을 학습시켜 볼 차례입니다.


5. 기본 분류 모델 개발: 의사결정나무 (Decision Tree)

머신러닝 분류 문제의 입문 모델로 가장 많이 활용되는 알고리즘 중 하나가 바로 의사결정나무(Decision Tree)입니다. 이 모델은 데이터를 트리 구조로 나누며 조건에 따라 예측을 수행합니다. 구조가 직관적이고 시각화가 가능해 초보자에게 특히 적합합니다.

의사결정나무 개요

의사결정나무는 데이터를 분할하면서 예측에 필요한 결정 규칙을 만들어 나갑니다. 각 노드는 하나의 질문(특성에 대한 임계값 조건)으로 구성되며, 답에 따라 다음 분기로 나아갑니다. 이러한 트리 구조는 사람의 사고방식과 유사해 매우 해석하기 쉽습니다.

Scikit-learn으로 의사결정나무 학습하기

이번 실습에서는 앞에서 불러온 Iris 데이터셋을 사용하여 꽃의 특성에 따라 품종을 분류하는 모델을 학습시켜보겠습니다.

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

# 입력과 정답 데이터 분리
X = df.drop(columns=['target'])
y = df['target']

# 학습/테스트 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 모델 생성 및 학습
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train)

# 예측 수행
y_pred = clf.predict(X_test)

모델 평가: 정확도와 리포트

모델을 평가하는 가장 기본적인 지표는 정확도(accuracy)입니다. 이외에도 각 클래스별 정밀도, 재현율, F1-score 등을 포함한 classification_report혼동 행렬(confusion matrix)도 함께 확인해보겠습니다.

print("정확도:", accuracy_score(y_test, y_pred))
print("\n[분류 리포트]")
print(classification_report(y_test, y_pred))

print("\n[혼동 행렬]")
print(confusion_matrix(y_test, y_pred))

모델 시각화

Scikit-learn은 plot_tree 기능을 통해 학습된 트리를 시각화할 수 있습니다. 이를 통해 모델이 어떤 기준으로 분기를 결정했는지를 명확하게 이해할 수 있습니다.

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

plt.figure(figsize=(12,8))
plot_tree(clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

이와 같은 시각화를 통해 트리 모델의 결정 과정을 한눈에 파악할 수 있습니다. 단, 의사결정나무는 과적합(overfitting)에 취약하므로 깊이나 리프 개수를 제한하는 것이 중요합니다.

Tip: 하이퍼파라미터로 과적합 방지

예를 들어, max_depth, min_samples_split 등의 파라미터를 조정해 모델의 복잡도를 조절할 수 있습니다.

clf = DecisionTreeClassifier(max_depth=3, min_samples_split=4, random_state=42)
clf.fit(X_train, y_train)

이제 분류 문제의 기초를 익혔다면, 다음 장에서는 연속적인 값을 예측하는 회귀(Regression) 모델에 대해 알아보겠습니다. 머신러닝의 또 다른 주요 분야로, 가격 예측, 수요 예측 등에서 많이 활용됩니다.


6. 회귀 모델 개발: 선형 회귀 (Linear Regression)

분류 모델이 목표 변수를 ‘카테고리’로 예측하는 것이라면, 회귀 모델은 연속적인 ‘숫자’ 값을 예측합니다. 대표적인 회귀 알고리즘 중 하나인 선형 회귀(Linear Regression)는 두 변수 간의 관계를 직선으로 모델링하여 예측하는 가장 기본적인 회귀 방법입니다.

선형 회귀의 개념

선형 회귀는 입력 변수 X와 출력 변수 y 사이의 선형 관계를 찾습니다. 즉, y = aX + b와 같은 직선 방정식을 기반으로 예측합니다. 이 모델은 예측 결과를 직관적으로 해석할 수 있기 때문에 데이터 과학 입문자에게 매우 적합합니다.

보스턴 주택 가격 예측 실습

Scikit-learn은 회귀 실습을 위해 보스턴 주택 가격(Boston Housing) 데이터셋을 제공합니다. 다만, 이 데이터는 Scikit-learn 1.2 이후로 비활성화되었으므로, 그 대체로 널리 사용되는 fetch_california_housing() 함수를 이용합니다.

from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

# 데이터 불러오기
data = fetch_california_housing()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target

# 학습/테스트 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 학습
lr = LinearRegression()
lr.fit(X_train, y_train)

# 예측
y_pred = lr.predict(X_test)

모델 평가: MSE, MAE, R²

회귀 모델의 성능 평가는 다음과 같은 지표를 활용합니다:

  • MAE (Mean Absolute Error): 평균 절대 오차
  • MSE (Mean Squared Error): 평균 제곱 오차
  • R² Score: 결정 계수, 1에 가까울수록 성능이 좋음
print("MAE:", mean_absolute_error(y_test, y_pred))
print("MSE:", mean_squared_error(y_test, y_pred))
print("R² Score:", r2_score(y_test, y_pred))

회귀 계수 해석

선형 회귀 모델은 각 특성(feature)에 대한 계수(coefficient)를 제공합니다. 이 값은 해당 특성이 목표 변수에 어떤 영향을 주는지를 수치적으로 보여줍니다.

coef_df = pd.DataFrame({
    "Feature": X.columns,
    "Coefficient": lr.coef_
}).sort_values(by="Coefficient", ascending=False)
print(coef_df)

이러한 계수 분석을 통해 우리는 단순히 예측을 넘어서, 어떤 요인이 결과에 영향을 주는지를 파악할 수 있습니다. 이는 비즈니스 인사이트 도출에도 매우 유용합니다.

시각화로 회귀 예측 이해하기

예측값과 실제값의 분포를 시각화하면 회귀 모델의 적합도를 직관적으로 파악할 수 있습니다.

import matplotlib.pyplot as plt

plt.figure(figsize=(6,6))
plt.scatter(y_test, y_pred, alpha=0.3)
plt.xlabel("Actual Prices")
plt.ylabel("Predicted Prices")
plt.title("Actual vs Predicted Prices")
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--')
plt.grid(True)
plt.show()

선형 회귀는 간단하면서도 강력한 예측 도구로, 데이터의 관계를 해석하고 모델링하는 데에 훌륭한 출발점이 됩니다. 이제 다음 단계에서는 다양한 모델을 비교하고 성능을 향상시키기 위한 모델 튜닝 및 교차검증에 대해 다루겠습니다.


7. 모델 튜닝 및 교차검증

기본 모델을 학습시킨 후, 더 나은 성능을 얻기 위해 반드시 필요한 과정이 모델 튜닝(Model Tuning)입니다. 머신러닝 알고리즘은 다양한 하이퍼파라미터를 가지고 있으며, 이를 적절히 조정하면 모델의 성능을 극적으로 향상시킬 수 있습니다.

하이퍼파라미터란?

하이퍼파라미터는 모델이 학습을 시작하기 전에 설정하는 값으로, 학습 과정에 직접적인 영향을 미칩니다. 예를 들어, DecisionTreeClassifiermax_depthRandomForestClassifiern_estimators 등이 여기에 해당합니다.

이러한 하이퍼파라미터는 데이터셋마다 성능에 미치는 영향이 다르기 때문에, 다양한 조합을 실험해보는 것이 중요합니다.

GridSearchCV: 하이퍼파라미터 최적화

GridSearchCV는 주어진 파라미터 조합을 모두 실험하여 최적의 성능을 내는 조합을 찾아주는 도구입니다. 내부적으로 교차검증(Cross-validation)을 함께 수행하여 더 일반화된 결과를 제공합니다.

from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier

# 파라미터 후보군 정의
param_grid = {
    'n_estimators': [50, 100, 150],
    'max_depth': [None, 5, 10],
    'min_samples_split': [2, 5, 10]
}

# 모델 객체
rfc = RandomForestClassifier(random_state=42)

# 그리드서치 적용
grid_search = GridSearchCV(estimator=rfc, param_grid=param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

print("최적 파라미터:", grid_search.best_params_)
print("최고 정확도:", grid_search.best_score_)

RandomizedSearchCV: 효율적인 탐색

RandomizedSearchCV는 지정된 횟수만큼 무작위로 파라미터 조합을 선택하여 실험하기 때문에, 빠른 시간 내에 좋은 성능을 찾고자 할 때 유용합니다.

from sklearn.model_selection import RandomizedSearchCV

random_search = RandomizedSearchCV(estimator=rfc, param_distributions=param_grid,
                                   n_iter=10, cv=5, random_state=42, scoring='accuracy')
random_search.fit(X_train, y_train)

print("최적 파라미터:", random_search.best_params_)

K-Fold 교차검증이란?

K-Fold Cross Validation은 데이터를 K개의 구간으로 나누고, 각 구간을 번갈아가며 테스트셋으로 사용하여 전체 평균 성능을 측정합니다. 일반적으로 K는 5 또는 10으로 설정되며, 이는 모델이 특정 데이터에 과도하게 적합(overfitting)되는 것을 방지하는 데 큰 도움이 됩니다.

from sklearn.model_selection import cross_val_score

scores = cross_val_score(rfc, X, y, cv=5, scoring='accuracy')
print("각 폴드의 정확도:", scores)
print("평균 정확도:", scores.mean())

전처리와 모델을 묶는 Pipeline 구성

실제 프로젝트에서는 전처리 → 모델 학습 → 평가의 과정을 매번 반복하지 않고, Pipeline을 구성하여 한 번에 처리하는 방식이 효율적입니다. 이렇게 하면 전처리된 데이터와 모델 간의 일관성을 유지할 수 있으며, 하이퍼파라미터 탐색과도 결합할 수 있습니다.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', RandomForestClassifier())
])

pipe.fit(X_train, y_train)

이제 우리는 단순한 모델 훈련을 넘어서 성능을 최적화하는 방법까지 습득했습니다. 다음 장에서는 이렇게 학습된 모델을 실제 서비스에 적용하기 위한 모델 저장 및 배포에 대해 알아보겠습니다.


8. Pipeline과 모델 저장

머신러닝 프로젝트를 반복적이고 안정적으로 운영하기 위해서는 전처리와 학습 과정을 하나로 묶고, 학습된 모델을 저장하여 재활용하는 기능이 필수입니다. Scikit-learn은 Pipelinejoblib을 통해 이를 간편하게 구현할 수 있도록 지원합니다.

Pipeline의 필요성

Pipeline은 전처리와 모델 학습 과정을 하나의 객체로 결합한 구조입니다. 이를 사용하면 코드의 재사용성과 가독성이 크게 향상되며, 하이퍼파라미터 튜닝 시 전처리와 모델을 함께 최적화할 수 있습니다.

Pipeline 구성 예제

앞서 배운 StandardScalerRandomForestClassifier를 하나의 파이프라인으로 묶어보겠습니다.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('rf', RandomForestClassifier(n_estimators=100, random_state=42))
])

pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)

이제 이 파이프라인은 fit() 한 번으로 스케일링과 모델 학습을 동시에 처리하며, predict()로 바로 예측도 할 수 있습니다.

모델 저장: joblib 사용

학습된 모델을 디스크에 저장하면 이후에 다시 학습할 필요 없이 바로 불러와 사용할 수 있습니다. Scikit-learn은 joblib 또는 pickle 모듈을 통해 모델 저장 기능을 제공합니다. 대규모 numpy 배열을 포함한 모델이라면 joblib을 사용하는 것이 효율적입니다.

import joblib

# 모델 저장
joblib.dump(pipeline, 'model_pipeline.pkl')

# 모델 불러오기
loaded_model = joblib.load('model_pipeline.pkl')
y_loaded_pred = loaded_model.predict(X_test)

이렇게 저장된 모델은 웹 애플리케이션, REST API 서버, 스케줄링 파이프라인 등 다양한 형태로 재사용할 수 있습니다. 특히 Flask, FastAPI와 같은 Python 웹 프레임워크를 통해 예측 결과를 서비스화할 수 있으며, 이는 실제 머신러닝 제품화 단계의 핵심입니다.

Tip: 모델과 데이터 전처리를 하나의 패키지처럼 관리

Pipeline에 포함된 전처리 단계를 그대로 유지한 상태로 저장하면, 나중에 동일한 입력 형식으로 안정적인 예측을 할 수 있습니다. 따라서 모델 배포 시에는 전처리 + 학습모델 통합 파이프라인 저장이 가장 권장되는 방식입니다.

이제 우리는 전처리부터 예측, 모델 저장 및 재사용까지 머신러닝 전체 흐름을 실무 수준으로 구축해볼 수 있는 역량을 갖추게 되었습니다. 마지막으로 실전 예제를 통해 지금까지 배운 내용을 종합해 보겠습니다.


9. 실전 프로젝트 예시: 고객 이탈 예측

실제 비즈니스 환경에서는 데이터 분석의 궁극적인 목적이 명확한 문제 해결에 있습니다. 이번 예시에서는 텔레콤 회사의 고객 이탈 데이터를 바탕으로 고객 이탈 예측 모델을 만들어보겠습니다. 이 문제는 비즈니스에서 가장 자주 접하게 되는 분류 문제 중 하나입니다.

문제 정의

고객 이탈(Churn)이란 일정 기간 내에 서비스를 해지하거나 사용을 중단하는 현상을 의미합니다. 고객 이탈을 예측할 수 있다면, 이탈 가능성이 높은 고객에게 조기 대응하여 기업의 손실을 최소화할 수 있습니다.

데이터셋 설명

이번 프로젝트에는 공개된 Telco Customer Churn 데이터셋을 사용합니다. 이 데이터에는 고객의 계약 기간, 서비스 이용 패턴, 결제 정보 등이 포함되어 있으며, 이탈 여부는 Churn이라는 이진 클래스(Yes/No)로 표시됩니다.

1) 데이터 불러오기 및 기본 전처리

import pandas as pd

# 데이터 로드
df = pd.read_csv('Telco-Customer-Churn.csv')

# 간단한 전처리
df.dropna(inplace=True)
df['Churn'] = df['Churn'].map({'Yes': 1, 'No': 0})
df = df.drop(['customerID'], axis=1)

범주형 변수는 OneHotEncoder를 사용하여 처리합니다. 또한 수치형 변수는 StandardScaler로 정규화합니다.

2) 전처리 + 모델링 파이프라인 구성

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# 범주형/수치형 변수 분리
categorical_cols = df.select_dtypes(include=['object']).columns
numerical_cols = df.select_dtypes(include=['int64', 'float64']).drop('Churn', axis=1).columns

# ColumnTransformer 정의
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numerical_cols),
        ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_cols)
    ])

# 전체 파이프라인 구성
pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('classifier', RandomForestClassifier(random_state=42))
])

# 학습/테스트 분할
X = df.drop('Churn', axis=1)
y = df['Churn']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 모델 학습
pipeline.fit(X_train, y_train)

3) 예측 및 평가

학습된 모델을 이용해 예측을 수행하고, 정확도뿐 아니라 정밀도, 재현율, F1 점수를 함께 평가합니다.

from sklearn.metrics import classification_report, confusion_matrix

y_pred = pipeline.predict(X_test)

print("Classification Report:\n", classification_report(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))

4) 비즈니스 인사이트 도출

모델의 성능뿐 아니라, 어떤 특성이 고객 이탈과 높은 상관관계를 갖는지 파악하는 것도 중요합니다. 예를 들어, 계약 유형, 월 납부 요금, 온라인 보안 서비스 여부 등은 이탈과 직접적인 관련이 있을 수 있습니다. 이 정보를 마케팅 또는 고객 관리 전략에 반영하면 이탈률을 줄일 수 있는 인사이트를 얻을 수 있습니다.

이처럼 머신러닝은 단순한 예측을 넘어 실질적인 전략 수립에까지 활용될 수 있습니다. 데이터를 기반으로 한 통찰은 조직의 의사결정을 보다 정교하게 만들어 줍니다.

Tip: 모델 성능이 부족하다면?

더 많은 특성 엔지니어링, 교차검증, 하이퍼파라미터 튜닝, 앙상블 기법(RandomForest, XGBoost 등)을 고려해보세요. 또한 SHAP 또는 LIME을 이용한 모델 해석도 실무에서는 중요한 요소입니다.

이제 우리는 처음부터 끝까지 하나의 실전 머신러닝 프로젝트를 구성하고 실행하는 방법을 익혔습니다. 마지막으로, 지금까지 배운 내용을 정리하고 앞으로의 학습 방향을 함께 제시하며 마무리하겠습니다.


10. 결론: Scikit-learn으로 시작하는 머신러닝 여정

머신러닝은 이제 더 이상 일부 전문가의 전유물이 아닙니다. 데이터가 곧 경쟁력이 되는 시대, Python과 Scikit-learn은 누구나 이 기술을 실전에서 활용할 수 있도록 문턱을 낮추고 있습니다. 이 글을 통해 우리는 데이터 전처리에서부터 모델 개발, 평가, 최적화, 저장, 그리고 실전 적용에 이르기까지 전체 머신러닝 워크플로우를 단계별로 경험했습니다.

특히 Scikit-learn은 다음과 같은 장점으로 입문자부터 실무자까지 모두에게 강력한 도구가 됩니다:

  • 일관된 API 설계로 빠르게 실습 가능
  • 다양한 알고리즘과 전처리 기능 내장
  • Pipeline, GridSearch, Cross-validation 등 실전 기능 제공
  • Pandas, Numpy, Matplotlib 등 Python 생태계와의 뛰어난 통합성

물론 Scikit-learn만으로 모든 문제를 해결할 수는 없습니다. 보다 복잡한 모델 학습이 필요한 경우, TensorFlow, PyTorch, XGBoost 등의 프레임워크로 확장하는 것도 좋은 선택입니다. 하지만 그 출발점은 항상 **탄탄한 기초**에 있습니다.

만약 지금 이 글을 읽고 있는 당신이 “내가 머신러닝을 할 수 있을까?”라고 고민하고 있다면, 그 답은 이미 정해져 있습니다. 당신은 지금 이미 첫걸음을 뗐고, 앞으로 나아갈 준비가 되어 있습니다.

데이터는 거짓말하지 않습니다. 문제는 항상 데이터 안에 있습니다. 그리고, 그 해답 또한 모델과 함께, 당신 안에 있습니다.

앞으로는 실제 데이터를 다루며 실전 프로젝트를 수행하고, 더 복잡한 알고리즘과 모델 해석 기법으로까지 나아가 보세요. 이 글이 당신의 머신러닝 여정에 든든한 이정표가 되길 바랍니다.

댓글 남기기

Table of Contents

Table of Contents