12월 21, 2025
40 분 읽기

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

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

Milad Bonakdar

작성자

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


소개

시니어 데이터 사이언티스트 면접에서는 모델의 원리뿐 아니라 어떤 모델을 선택하고, 어떻게 프로덕션에 배포하며, 어떻게 모니터링하고 설명하는지도 보여줘야 합니다. 좋은 답변은 통계적 트레이드오프를 제품 지표, 데이터 품질, 배포 제약, 이해관계자의 의사결정과 연결합니다.

이 가이드는 시니어 후보자와 미드레벨 후보자를 가르는 주제를 연습하도록 구성되어 있습니다. 편향과 분산, 특징 설계, 불균형 데이터, 모델 모니터링, A/B 테스트, MLOps, 딥러닝 기초를 다룹니다. 답변할 때는 실제 프로젝트 예시, 통제한 리스크, 출시 후 볼 지표를 함께 말하세요.


고급 머신러닝 (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%까지 높여 채용 담당자가 실제로 당신의 잠재력을 볼 수 있도록 합니다.