十二月 21, 2025
40 分钟阅读

高级数据科学家面试题:机器学习、产品与 MLOps

interview
career-advice
job-search
高级数据科学家面试题:机器学习、产品与 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):
    • 惩罚(Penalty):系数绝对值之和
    • 效果(Effect):稀疏模型(某些系数变为 0)
    • 用途(Use):特征选择
  • L2 (Ridge):
    • 惩罚(Penalty):系数平方和
    • 效果(Effect):将系数向 0 缩小(但不是完全为 0)
    • 用途(Use):当所有特征都可能相关时
  • 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)} 个非零系数,共 {len(lasso.coef_)} 个")

# L2 正则化 (Ridge)
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)
print(f"Ridge 系数: {np.sum(ridge.coef_ != 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 vs Boosting。

答案: 集成方法结合多个模型以提高性能。

  • Bagging (Bootstrap Aggregating):
    • 在随机子集上并行训练模型
    • 降低方差
    • 示例:随机森林
  • Boosting:
    • 顺序训练模型,每个模型纠正之前的错误
    • 降低偏差
    • 示例:AdaBoost、梯度提升、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
)

# Bagging - 随机森林
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
rf_score = rf.score(X_test, y_test)

# 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"随机森林 (Bagging) 准确率: {rf_score:.3f}")
print(f"梯度提升准确率: {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 折交叉验证:
    • 将数据分成 k 份
    • 训练 k 次,每次使用不同的份作为验证集
    • 对结果取平均
  • 优点:
    • 更可靠的性能估计
    • 所有数据都用于训练和验证
    • 减少性能估计的方差
  • 变体: 分层 K 折交叉验证、留一法、时间序列分割
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 折交叉验证得分: {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 (主成分分析):
    • 线性变换
    • 找到最大方差的方向
    • 保留全局结构
    • 快速、可解释
  • t-SNE (t-分布随机邻域嵌入):
    • 非线性变换
    • 保留局部结构
    • 适合可视化
    • 较慢,不适用于特征提取
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"\n保留 95% 方差的成分数量: {pca_95.n_components_}")
print(f"降维后的形状: {X_reduced.shape}")

稀有度: 常见 难度: 困难


6. 什么是 ROC 曲线和 AUC?何时使用它们?

答案: ROC(受试者工作特征)曲线绘制了在不同阈值下的真阳性率与假阳性率。

  • AUC (曲线下面积): 总结 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)
      • 欠采样多数类
    • 类别权重: 惩罚少数类的错误分类
    • 集成方法: 平衡随机森林
    • 评估: 使用精确率、召回率、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 (合成少数类过采样技术)
smote = SMOTE(random_state=42)
X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)
print(f"\n使用 SMOTE 后: {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("\n使用 SMOTE:")
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)
    • 嵌入方法: 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"选择的特征数量 (卡方): {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 测试比较两个版本(对照组 vs 实验组)以确定哪个表现更好。

  • 流程:
    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(机器学习运维)将 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_train)
    
    # 评估
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    
    # 记录指标
    mlflow.log_metric("accuracy", accuracy)
    
    # 记录模型
    mlflow.sklearn.log_model(model, "random_forest_model")
    
    print(f"准确率: {accuracy:.3f}")
    print(f"运行 ID: {mlflow.active_run().info.run_id}")

# 使用 DVC 进行版本控制
"""
# 初始化 DVC
dvc init

# 跟踪数据
dvc add data/train.csv
git add data/train.csv.dvc .gitignore
git commit -m "添加训练数据"

# 跟踪模型
dvc add models/model.pkl
git add models/model.pkl.dvc
git commit -m "添加训练好的模型"
"""

稀有度: 常见 难度: 困难


深度学习与高级主题(4 个问题)

15. 解释神经网络的架构。

答案: 神经网络由相互连接的神经元层组成。

  • 组成部分:
    • 输入层: 接收特征
    • 隐藏层: 学习表示
    • 输出层: 产生预测
    • 激活函数: ReLU、Sigmoid、Tanh
    • 权重和偏置: 学习的参数
import tensorflow as tf
from tensorflow import keras
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 加载数据
digits = load_digits()
X, y = digits.data, digits.target

# 预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_train, X_test, y_train, y_test = train_test_split(
    X_scaled, y, test_size=0.3, random_state=42
)

# 构建神经网络
model = keras.Sequential
Newsletter subscription

真正有效的每周职业建议

将最新见解直接发送到您的收件箱

创建一份让您被录用速度提高60%的简历

在几分钟内,创建一份量身定制的、ATS友好的简历,已证明可以获得6倍以上的面试机会。

创建更好的简历

分享这篇文章

快50%获得工作

使用专业AI增强简历的求职者平均在5周内找到工作,而标准时间是10周。停止等待,开始面试。