12월 21, 2025
40 분 읽기

시니어 데이터 사이언티스트 면접 질문: ML, 제품, MLOps

interview
career-advice
job-search
시니어 데이터 사이언티스트 면접 질문: ML, 제품, MLOps
Milad Bonakdar

Milad Bonakdar

작성자

ML 트레이드오프, 특징 엔지니어링, 모델 배포, 모니터링, A/B 테스트, 비즈니스 의사결정을 다루는 실전 질문으로 시니어 면접을 준비하세요.


소개

고급 데이터 과학자는 엔드 투 엔드 머신러닝 솔루션을 설계하고, 모델 성능을 최적화하며, 모델을 프로덕션에 배포하고, 이해 관계자에게 통찰력을 전달할 수 있어야 합니다. 이 역할은 고급 알고리즘, 특징 엔지니어링, 모델 배포에 대한 깊은 전문 지식과 데이터를 사용하여 복잡한 비즈니스 문제를 해결하는 능력을 요구합니다.

이 종합 가이드는 고급 머신러닝, 딥러닝, 특징 엔지니어링, 모델 배포, A/B 테스트 및 빅 데이터 기술을 아우르는 고급 데이터 과학자에게 필요한 필수 면접 질문을 다룹니다. 각 질문에는 자세한 답변, 희소성 평가 및 난이도 등급이 포함되어 있습니다.


고급 머신러닝 (6개의 질문)

1. 편향-분산 트레이드오프를 설명하세요.

답변: 편향-분산 트레이드오프는 모델 복잡성과 예측 오류 간의 관계를 설명합니다.

  • 편향(Bias): 과도하게 단순화된 가정으로 인한 오류 (과소적합)
  • 분산(Variance): 훈련 데이터의 변동에 민감한 오류 (과대적합)
  • 트레이드오프(Tradeoff): 편향을 줄이면 분산이 증가하고 그 반대도 마찬가지입니다.
  • 목표(Goal): 총 오류를 최소화하는 최적의 균형을 찾습니다.
Loading diagram...
import numpy as np
from sklearn.model_selection import learning_curve
from sklearn.tree import DecisionTreeRegressor
import matplotlib.pyplot as plt

# 데이터 생성
X = np.random.rand(100, 1) * 10
y = 2 * X + 3 + np.random.randn(100, 1) * 2

# 높은 편향 모델 (max_depth=1)
high_bias = DecisionTreeRegressor(max_depth=1)

# 높은 분산 모델 (max_depth=20)
high_variance = DecisionTreeRegressor(max_depth=20)

# 최적 모델 (max_depth=3)
optimal = DecisionTreeRegressor(max_depth=3)

# 학습 곡선은 편향-분산 트레이드오프를 보여줍니다.
train_sizes, train_scores, val_scores = learning_curve(
    optimal, X, y.ravel(), cv=5, train_sizes=np.linspace(0.1, 1.0, 10)
)

print(f"훈련 점수: {train_scores.mean():.2f}")
print(f"검증 점수: {val_scores.mean():.2f}")

희소성: 매우 흔함 난이도: 어려움


2. 정규화가 무엇이며 L1과 L2 정규화를 설명하세요.

답변: 정규화는 과대적합을 방지하기 위해 손실 함수에 페널티 항을 추가합니다.

  • L1 (Lasso):
    • 페널티: 계수의 절대값의 합
    • 효과: 희소 모델 (일부 계수가 정확히 0이 됨)
    • 용도: 특징 선택
  • L2 (Ridge):
    • 페널티: 계수의 제곱의 합
    • 효과: 계수를 0으로 축소 (정확히 0은 아님)
    • 용도: 모든 특징이 잠재적으로 관련이 있을 때
  • Elastic Net: L1과 L2를 결합
from sklearn.linear_model import Lasso, Ridge, ElasticNet
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
import numpy as np

# 많은 특징을 가진 데이터 생성
X, y = make_regression(n_samples=100, n_features=20, n_informative=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# L1 정규화 (Lasso)
lasso = Lasso(alpha=1.0)
lasso.fit(X_train, y_train)
print(f"Lasso 계수: {np.sum(lasso.coef_ != 0)} 개의 0이 아닌 값 / {len(lasso.coef_)} 개")

# L2 정규화 (Ridge)
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
print(f"Ridge 계수: {np.sum(ridge.coef_ != 0)} 개의 0이 아닌 값 / {len(ridge.coef_)} 개")

# Elastic Net (L1 + L2)
elastic = ElasticNet(alpha=1.0, l1_ratio=0.5)
elastic.fit(X_train, y_train)

print(f"\nLasso 점수: {lasso.score(X_test, y_test):.3f}")
print(f"Ridge 점수: {ridge.score(X_test, y_test):.3f}")
print(f"Elastic Net 점수: {elastic.score(X_test, y_test):.3f}")

희소성: 매우 흔함 난이도: 중간


3. 앙상블 방법: 배깅과 부스팅을 설명하세요.

답변: 앙상블 방법은 여러 모델을 결합하여 성능을 향상시킵니다.

  • 배깅(Bagging, Bootstrap Aggregating):
    • 무작위 하위 집합에서 병렬로 모델 훈련
    • 분산 감소
    • 예시: Random Forest
  • 부스팅(Boosting):
    • 이전 오류를 수정하면서 순차적으로 모델 훈련
    • 편향 감소
    • 예시: AdaBoost, Gradient Boosting, XGBoost
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, cross_val_score

# 데이터 로드
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# 배깅 - Random Forest
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
rf_score = rf.score(X_test, y_test)

# 부스팅 - Gradient Boosting
gb = GradientBoostingClassifier(n_estimators=100, random_state=42)
gb.fit(X_train, y_train)
gb_score = gb.score(X_test, y_test)

print(f"Random Forest (배깅) 정확도: {rf_score:.3f}")
print(f"Gradient Boosting 정확도: {gb_score:.3f}")

# 교차 검증
rf_cv = cross_val_score(rf, data.data, data.target, cv=5)
gb_cv = cross_val_score(gb, data.data, data.target, cv=5)

print(f"\nRF CV 점수: {rf_cv.mean():.3f} (+/- {rf_cv.std():.3f})")
print(f"GB CV 점수: {gb_cv.mean():.3f} (+/- {gb_cv.std():.3f})")

희소성: 매우 흔함 난이도: 어려움


4. 교차 검증이 무엇이며 K-폴드가 훈련-테스트 분할보다 나은 이유는 무엇입니까?

답변: 교차 검증은 단일 훈련-테스트 분할보다 모델 성능을 더 강력하게 평가합니다.

  • K-폴드 CV:
    • 데이터를 k개의 폴드로 분할
    • 각 폴드를 검증으로 사용하여 k번 훈련
    • 결과 평균
  • 장점:
    • 더 신뢰할 수 있는 성능 추정
    • 훈련 및 검증에 모든 데이터 사용
    • 성능 추정의 분산 감소
  • 변형: 계층화된 K-폴드, Leave-One-Out, 시계열 분할
from sklearn.model_selection import cross_val_score, KFold, StratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

data = load_iris()
X, y = data.data, data.target

model = LogisticRegression(max_iter=200)

# 표준 K-폴드
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kfold)
print(f"K-폴드 CV 점수: {scores}")
print(f"평균: {scores.mean():.3f} (+/- {scores.std():.3f})")

# 계층화된 K-폴드 (클래스 분포 유지)
stratified_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
stratified_scores = cross_val_score(model, X, y, cv=stratified_kfold)
print(f"\n계층화된 K-폴드 점수: {stratified_scores}")
print(f"평균: {stratified_scores.mean():.3f} (+/- {stratified_scores.std():.3f})")

# 사용자 정의 교차 검증
from sklearn.model_selection import cross_validate

cv_results = cross_validate(
    model, X, y, cv=5,
    scoring=['accuracy', 'precision_macro', 'recall_macro'],
    return_train_score=True
)

print(f"\n테스트 정확도: {cv_results['test_accuracy'].mean():.3f}")
print(f"테스트 정밀도: {cv_results['test_precision_macro'].mean():.3f}")
print(f"테스트 재현율: {cv_results['test_recall_macro'].mean():.3f}")

희소성: 매우 흔함 난이도: 중간


5. 차원 축소 기술 (PCA, t-SNE)을 설명하세요.

답변: 차원 축소는 정보를 보존하면서 특징의 수를 줄입니다.

  • PCA(Principal Component Analysis, 주성분 분석):
    • 선형 변환
    • 최대 분산 방향 찾기
    • 전역 구조 보존
    • 빠르고 해석 가능
  • t-SNE(t-Distributed Stochastic Neighbor Embedding):
    • 비선형 변환
    • 로컬 구조 보존
    • 시각화에 적합
    • 느리고 특징 추출에는 적합하지 않음
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# 고차원 데이터 로드
digits = load_digits()
X, y = digits.data, digits.target

print(f"원래 모양: {X.shape}")

# PCA - 2차원으로 축소
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
print(f"PCA 모양: {X_pca.shape}")
print(f"설명된 분산 비율: {pca.explained_variance_ratio_}")
print(f"총 설명된 분산: {pca.explained_variance_ratio_.sum():.3f}")

# t-SNE - 2차원으로 축소
tsne = TSNE(n_components=2, random_state=42)
X_tsne = tsne.fit_transform(X)
print(f"t-SNE 모양: {X_tsne.shape}")

# 특징 추출을 위한 PCA (95% 분산 유지)
pca_95 = PCA(n_components=0.95)
X_reduced = pca_95.fit_transform(X)
print(f"\n95% 분산에 필요한 구성 요소 수: {pca_95.n_components_}")
print(f"축소된 모양: {X_reduced.shape}")

희소성: 흔함 난이도: 어려움


6. ROC 곡선과 AUC가 무엇입니까? 언제 사용하시겠습니까?

답변: ROC(Receiver Operating Characteristic, 수신자 조작 특성) 곡선은 다양한 임계값에서 참 양성 비율 대 거짓 양성 비율을 나타냅니다.

  • AUC(Area Under Curve, 곡선 아래 면적): ROC를 요약하는 단일 메트릭
    • AUC = 1.0: 완벽한 분류기
    • AUC = 0.5: 무작위 분류기
    • AUC < 0.5: 무작위보다 나쁨
  • 사용 사례:
    • 모델 비교
    • 불균형 데이터 세트
    • 임계값을 선택해야 할 때
from sklearn.metrics import roc_curve, roc_auc_score, auc
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
import matplotlib.pyplot as plt

# 데이터 로드
data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# 모델 훈련
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)

# 확률 예측 가져오기
y_pred_proba = model.predict_proba(X_test)[:, 1]

# ROC 곡선 계산
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)

print(f"AUC: {roc_auc:.3f}")

# 대안: 직접 AUC 계산
auc_score = roc_auc_score(y_test, y_pred_proba)
print(f"AUC (직접): {auc_score:.3f}")

# 최적 임계값 찾기 (Youden's J 통계)
optimal_idx = np.argmax(tpr - fpr)
optimal_threshold = thresholds[optimal_idx]
print(f"최적 임계값: {optimal_threshold:.3f}")

희소성: 매우 흔함 난이도: 중간


특징 엔지니어링 (4개의 질문)

7. 특징 엔지니어링에 어떤 기술을 사용하십니까?

답변: 특징 엔지니어링은 모델 성능을 향상시키기 위해 기존 데이터에서 새로운 특징을 만듭니다.

  • 기술:
    • 인코딩: 원-핫, 레이블, 대상 인코딩
    • 스케일링: StandardScaler, MinMaxScaler
    • 구간화: 연속 변수 이산화
    • 다항 특징: 상호 작용 항
    • 도메인 특정: 날짜 특징, 텍스트 특징
    • 집계: 그룹 통계
from sklearn.preprocessing import StandardScaler, OneHotEncoder, PolynomialFeatures
import pandas as pd
import numpy as np

# 샘플 데이터
df = pd.DataFrame({
    'age': [25, 30, 35, 40, 45],
    'salary': [50000, 60000, 75000, 80000, 90000],
    'department': ['IT', 'HR', 'IT', 'Finance', 'HR'],
    'date': pd.date_range('2023-01-01', periods=5)
})

# 원-핫 인코딩
df_encoded = pd.get_dummies(df, columns=['department'], prefix='dept')

# 스케일링
scaler = StandardScaler()
df_encoded[['age_scaled', 'salary_scaled']] = scaler.fit_transform(
    df_encoded[['age', 'salary']]
)

# 구간화
df_encoded['age_group'] = pd.cut(df['age'], bins=[0, 30, 40, 100], labels=['young', 'mid', 'senior'])

# 날짜 특징
df_encoded['year'] = df['date'].dt.year
df_encoded['month'] = df['date'].dt.month
df_encoded['day_of_week'] = df['date'].dt.dayofweek

# 다항 특징
poly = PolynomialFeatures(degree=2, include_bias=False)
poly_features = poly.fit_transform(df[['age', 'salary']])

# 상호 작용 특징
df_encoded['age_salary_interaction'] = df['age'] * df['salary']

print(df_encoded.head())

희소성: 매우 흔함 난이도: 중간


8. 불균형 데이터 세트를 어떻게 처리합니까?

답변: 불균형 데이터 세트는 클래스 분포가 고르지 않아 모델을 편향시킬 수 있습니다.

  • 기술:
    • 재샘플링:
      • 소수 클래스 오버샘플링 (SMOTE)
      • 다수 클래스 언더샘플링
    • 클래스 가중치: 소수 클래스의 오분류에 페널티 부여
    • 앙상블 방법: 균형 잡힌 Random Forest
    • 평가: 정확도뿐만 아니라 정밀도, 재현율, F1 사용
    • 이상 감지: 소수를 이상으로 취급
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import RandomUnderSampler

# 불균형 데이터 세트 생성
X, y = make_classification(
    n_samples=1000, n_features=20, n_informative=15,
    n_classes=2, weights=[0.9, 0.1], random_state=42
)

print(f"클래스 분포: {np.bincount(y)}")

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 1. 불균형 처리 없이
model_baseline = LogisticRegression()
model_baseline.fit(X_train, y_train)
y_pred_baseline = model_baseline.predict(X_test)
print("\n기본 (처리 없음):")
print(classification_report(y_test, y_pred_baseline))

# 2. SMOTE (Synthetic Minority Over-sampling)
smote = SMOTE(random_state=42)
X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)
print(f"\nSMOTE 후: {np.bincount(y_train_smote)}")

model_smote = LogisticRegression()
model_smote.fit(X_train_smote, y_train_smote)
y_pred_smote = model_smote.predict(X_test)
print("\nSMOTE 사용:")
print(classification_report(y_test, y_pred_smote))

# 3. 클래스 가중치
model_weighted = LogisticRegression(class_weight='balanced')
model_weighted.fit(X_train, y_train)
y_pred_weighted = model_weighted.predict(X_test)
print("\n클래스 가중치 사용:")
print(classification_report(y_test, y_pred_weighted))

희소성: 매우 흔함 난이도: 중간


9. 특징 선택 기술을 설명하세요.

답변: 특징 선택은 모델링에 가장 적합한 특징을 식별합니다.

  • 방법:
    • 필터 방법: 통계 테스트 (상관 관계, 카이 제곱)
    • 래퍼 방법: RFE (Recursive Feature Elimination, 재귀적 특징 제거)
    • 임베디드 방법: Lasso, 트리 기반 특징 중요도
    • 차원 축소: PCA (선택과는 다름)
from sklearn.feature_selection import SelectKBest, chi2, RFE, SelectFromModel
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import MinMaxScaler

# 데이터 로드
data = load_breast_cancer()
X, y = data.data, data.target

# 1. 필터 방법 - 카이 제곱을 사용한 SelectKBest
X_scaled = MinMaxScaler().fit_transform(X)
selector_chi2 = SelectKBest(chi2, k=10)
X_chi2 = selector_chi2.fit_transform(X_scaled, y)
print(f"원래 특징 수: {X.shape[1]}")
print(f"선택된 특징 수 (chi2): {X_chi2.shape[1]}")

# 2. 래퍼 방법 - 재귀적 특징 제거
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rfe = RFE(estimator=rf, n_features_to_select=10)
X_rfe = rfe.fit_transform(X, y)
print(f"선택된 특징 수 (RFE): {X_rfe.shape[1]}")
print(f"특징 순위: {rfe.ranking_}")

# 3. 임베디드 방법 - 트리 기반 특징 중요도
rf.fit(X, y)
importances = rf.feature_importances_
indices = np.argsort(importances)[::-1]

print("\n중요도 기준 상위 10개 특징:")
for i in range(10):
    print(f"{i+1}. {data.feature_names[indices[i]]}: {importances[indices[i]]:.4f}")

# SelectFromModel
selector_model = SelectFromModel(rf, threshold='median', prefit=True)
X_selected = selector_model.transform(X)
print(f"\n선택된 특징 수 (중요도): {X_selected.shape[1]}")

희소성: 흔함 난이도: 중간


10. 카디널리티가 높은 범주형 변수를 어떻게 처리합니까?

답변: 카디널리티가 높은 범주형 변수는 고유한 값이 많습니다.

  • 기술:
    • 대상 인코딩: 대상 평균으로 대체
    • 빈도 인코딩: 빈도로 대체
    • 임베딩: 조밀한 표현 학습 (신경망)
    • 그룹화: 드문 범주를 "기타"로 결합
    • 해싱: 고정된 버킷 수로 해싱
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# 카디널리티가 높은 샘플 데이터
df = pd.DataFrame({
    'city': np.random.choice([f'City_{i}' for i in range(100)], 1000),
    'target': np.random.randint(0, 2, 1000)
})

print(f"고유한 도시 수: {df['city'].nunique()}")

# 1. 대상 인코딩
target_means = df.groupby('city')['target'].mean()
df['city_target_encoded'] = df['city'].map(target_means)

# 2. 빈도 인코딩
freq = df['city'].value_counts()
df['city_frequency'] = df['city'].map(freq)

# 3. 드문 범주 그룹화
freq_threshold = 10
rare_cities = freq[freq < freq_threshold].index
df['city_grouped'] = df['city'].apply(lambda x: 'Other' if x in rare_cities else x)

print(f"\n그룹화 후: {df['city_grouped'].nunique()} 개의 고유한 값")

# 4. 해시 인코딩 (category_encoders 라이브러리 사용)
# from category_encoders import HashingEncoder
# encoder = HashingEncoder(cols=['city'], n_components=10)
# df_hashed = encoder.fit_transform(df)

print(df[['city', 'city_target_encoded', 'city_frequency', 'city_grouped']].head())

희소성: 흔함 난이도: 어려움


모델 배포 및 프로덕션 (4개의 질문)

11. 머신러닝 모델을 프로덕션에 어떻게 배포합니까?

답변: 모델 배포는 모델을 실제 사용에 사용할 수 있도록 합니다.

  • 단계:
    1. 모델 직렬화: 모델 저장 (pickle, joblib, ONNX)
    2. API 개발: REST API 생성 (Flask, FastAPI)
    3. 컨테이너화: 일관성을 위해 Docker 사용
    4. 배포: 클라우드 플랫폼 (AWS, GCP, Azure)
    5. 모니터링: 성능, 드리프트 추적
    6. CI/CD: 자동화된 테스트 및 배포
# 1. 모델 훈련 및 저장
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import joblib

# 모델 훈련
data = load_iris()
model = RandomForestClassifier()
model.fit(data.data, data.target)

# 모델 저장
joblib.dump(model, 'model.joblib')

# 2. FastAPI를 사용한 API 생성
from fastapi import FastAPI
import numpy as np

app = FastAPI()

# 모델 로드
model = joblib.load('model.joblib')

@app.post("/predict")
def predict(features: list):
    # numpy 배열로 변환
    X = np.array(features).reshape(1, -1)
    prediction = model.predict(X)
    probability = model.predict_proba(X)
    
    return {
        "prediction": int(prediction[0]),
        "probability": probability[0].tolist()
    }

# 3. Dockerfile
"""
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
"""

# 4. 사용법
# curl -X POST "http://localhost:8000/predict" \
#      -H "Content-Type: application/json" \
#      -d '{"features": [5.1, 3.5, 1.4, 0.2]}'

희소성: 매우 흔함 난이도: 어려움


12. 모델 모니터링이란 무엇이며 왜 중요합니까?

답변: 모델 모니터링은 프로덕션에서 모델 성능을 추적합니다.

  • 모니터링 대상:
    • 성능 메트릭: 정확도, 정밀도, 재현율
    • 데이터 드리프트: 입력 분포 변경
    • 개념 드리프트: 대상 관계 변경
    • 시스템 메트릭: 대기 시간, 처리량, 오류
  • 조치:
    • 성능 저하 시 알림
    • 새로운 데이터로 재훈련
    • 새로운 모델 A/B 테스트
import numpy as np
from scipy import stats

# 프로덕션 데이터 시뮬레이션
training_data = np.random.normal(0, 1, 1000)
production_data = np.random.normal(0.5, 1.2, 1000)  # 드리프트됨

# Kolmogorov-Smirnov 테스트를 사용하여 데이터 드리프트 감지
statistic, p_value = stats.ks_2samp(training_data, production_data)

print(f"KS 통계: {statistic:.4f}")
print(f"P-값: {p_value:.4f}")

if p_value < 0.05:
    print("데이터 드리프트가 감지되었습니다! 모델 재훈련을 고려하십시오.")
else:
    print("유의미한 드리프트가 감지되지 않았습니다.")

# 모델 성능 모니터링
class ModelMonitor:
    def __init__(self, model):
        self.model = model
        self.predictions = []
        self.actuals = []
        
    def log_prediction(self, X, y_pred, y_true=None):
        self.predictions.append(y_pred)
        if y_true is not None:
            self.actuals.append(y_true)
    
    def get_accuracy(self):
        if len(self.actuals) == 0:
            return None
        return np.mean(np.array(self.predictions) == np.array(self.actuals))
    
    def check_drift(self, new_data, reference_data):
        statistic, p_value = stats.ks_2samp(new_data, reference_data)
        return p_value < 0.05

# 사용법
monitor = ModelMonitor(model)
# monitor.log_prediction(X, y_pred, y_true)
# accuracy = monitor.get_accuracy()

희소성: 흔함 난이도: 중간


13. 머신러닝 컨텍스트에서 A/B 테스트를 설명하세요.

답변: A/B 테스트는 두 버전(제어 대 처리)을 비교하여 어떤 버전이 더 나은 성능을 보이는지 확인합니다.

  • 프로세스:
    1. 트래픽을 무작위로 분할
    2. 각 그룹에 다른 모델 제공
    3. 메트릭 수집
    4. 통계 테스트를 통해 승자 결정
  • 메트릭: 전환율, 수익, 참여도
  • 통계 테스트: t-테스트, 카이 제곱, 베이지안 방법
import numpy as np
from scipy import stats

# A/B 테스트 결과 시뮬레이션
# 제어 그룹 (모델 A)
control_conversions = 520
control_visitors = 10000

# 처리 그룹 (모델 B)
treatment_conversions = 580
treatment_visitors = 10000

# 전환율 계산
control_rate = control_conversions / control_visitors
treatment_rate = treatment_conversions / treatment_visitors

print(f"제어 그룹 전환율: {control_rate:.4f}")
print(f"처리 그룹 전환율: {treatment_rate:.4f}")
print(f"리프트: {((treatment_rate - control_rate) / control_rate * 100):.2f}%")

# 통계적 유의성 테스트 (두 비율 z-테스트)
pooled_rate = (control_conversions + treatment_conversions) / (control_visitors + treatment_visitors)
se = np.sqrt(pooled_rate * (1 - pooled_rate) * (1/control_visitors + 1/treatment_visitors))
z_score = (treatment_rate - control_rate) / se
p_value = 2 * (1 - stats.norm.cdf(abs(z_score)))

print(f"\nZ-점수: {z_score:.4f}")
print(f"P-값: {p_value:.4f}")

if p_value < 0.05:
    print("결과가 통계적으로 유의미합니다!")
    if treatment_rate > control_rate:
        print("처리 (모델 B)가 더 좋습니다.")
    else:
        print("제어 (모델 A)가 더 좋습니다.")
else:
    print("통계적으로 유의미한 차이가 없습니다.")

# 표본 크기 계산
from statsmodels.stats.power import zt_ind_solve_power

required_sample = zt_ind_solve_power(
    effect_size=0.02,  # 최소 감지 가능한 효과
    alpha=0.05,
    power=0.8,
    alternative='two-sided'
)
print(f"\n그룹당 필요한 표본 크기: {int(required_sample)}")

희소성: 흔함 난이도: 어려움


14. MLOps란 무엇이며 왜 중요합니까?

답변: MLOps(Machine Learning Operations, 머신러닝 운영)는 DevOps 원칙을 ML 시스템에 적용합니다.

  • 구성 요소:
    • 버전 관리: 코드, 데이터, 모델
    • 자동화된 테스트: 단위, 통합, 모델 테스트
    • CI/CD 파이프라인: 자동화된 배포
    • 모니터링: 성능, 드리프트 감지
    • 재현성: 실험 추적
  • 도구: MLflow, Kubeflow, DVC, Weights & Biases
# 예시: 실험 추적을 위한 MLflow
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 데이터 로드
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.3, random_state=42
)

# MLflow 실행 시작
with mlflow.start_run():
    # 매개변수 기록
    n_estimators = 100
    max_depth = 5
    mlflow.log_param("n_estimators", n_estimators)
    mlflow.log_param("max_depth", max_depth)
    
    # 모델 훈련
    model = RandomForestClassifier(
        n_estimators=n_estimators,
        max_depth=max_depth,
        random_state=42
    )
    model.fit(X_train, y_
Newsletter subscription

실제로 효과가 있는 주간 커리어 팁

최신 인사이트를 받은 편지함으로 직접 받아보세요

채용률을 60% 높이는 이력서 만들기

몇 분 만에 면접을 6배 더 많이 받는 것으로 입증된 맞춤형 ATS 친화적 이력서를 만드세요.

더 나은 이력서 만들기

이 게시물 공유

75% ATS 거부율을 극복하세요

4개 중 3개의 이력서는 사람의 눈에 닿지 않습니다. 우리의 키워드 최적화는 통과율을 최대 80%까지 높여 채용 담당자가 실제로 당신의 잠재력을 볼 수 있도록 합니다.