AI训练师三级 - 实操知识卡片

代码题分类总结 · 模板速查 · 高频考点

40总题数
20代码题
4代码类别
6代码模板
01
考试全景图
4大模块 · 8个小节 · 40道题
代码题 · 30分钟

1.1 业务数据处理流程设计

  • 1.1.1 智能医疗 - 风险等级标记 + BMI/年龄分箱
  • 1.1.2 智能农业 - 传感器分组统计 + 异常标记
  • 1.1.3 金融信用 - 数据完整性审核 + 范围验证
  • 1.1.4 电商平台 - 全流程: 读取→清洗→标准化→统计
  • 1.1.5 智能交通 - 多维度统计 + 年龄分箱
文档题

1.2 业务模块效果优化

  • 1.2.1 顾客评价情感识别优化
  • 1.2.2 老年人健康监测优化
  • 1.2.3 智慧金融服务优化
  • 1.2.4 智能卖点生成系统优化
  • 1.2.5 腾讯云数智人系统优化
代码题 · 20分钟

2.1 数据清洗和标注流程设计

  • 2.1.1 燃油效率 - 基础清洗 + StandardScaler
  • 2.1.2 低碳生活 - Excel读取 + 特征选择
  • 2.1.3 信用评分 - IQR异常检测 + MinMaxScaler
  • 2.1.4 医疗研究 - 日期处理 + 派生特征
  • 2.1.5 健康营养 - 文本清洗 + 饼图可视化
代码题 · 20分钟

2.2 模型开发与测试

  • 2.2.1 信用评分 - LogisticRegression + SMOTE
  • 2.2.2 燃油效率 - LinearRegression + RandomForest
  • 2.2.3 运动量 - RandomForest + XGBoost
  • 2.2.4 低碳行为 - LinearRegression + XGBoost
  • 2.2.5 步数预测 - DecisionTree + 优化
文档题 · Excel

3.1 数据分析与优化

  • 3.1.1 智能音箱 - 数据分析报告
  • 3.1.2 智能照明 - 数据分析报告
  • 3.1.3 智能手环 - 数据分析报告
  • 3.1.4 健康监测 - 数据分析报告
  • 3.1.5 智能家居 - 数据分析报告
代码题 · 20分钟

3.2 系统交互流程设计

  • 3.2.1 图像识别 - ResNet ONNX推理
  • 3.2.2 手写数字 - MNIST ONNX推理
  • 3.2.3 面部表情 - ONNX推理
  • 3.2.4 花朵识别 - ONNX推理
  • 3.2.5 人脸检测 - ONNX推理
文档题

4.1 培训大纲编写

  • 4.1.1 Label Studio培训
  • 4.1.2 爬虫培训
  • 4.1.3 数据清洗培训
  • 4.1.4 Pandas数据清洗培训
  • 4.1.5 Python数据可视化培训
填空题

4.2 数据采集和处理指导

  • 4.2.1 智能零售分析
  • 4.2.2 医疗影像诊断
  • 4.2.3 智能安防监控
  • 4.2.4 自动驾驶感知
  • 4.2.5 文化遗产数字化
A
类别 A:数据读取与统计分析
1.1.1 ~ 1.1.5 · 30分钟 · Pandas核心操作
read_csv
读取数据
isnull/dropna
缺失值处理
astype
类型转换
between/filter
异常过滤
np.where
条件标记
pd.cut
数据分箱
groupby
分组统计
to_csv
保存
A1

数据读取 & 基础检查

pd.read_csv + isnull + duplicated
Python
import pandas as pd
import numpy as np

# 读取数据
data = pd.read_csv('数据文件.csv')
print(data.head())
print(data.info())

# 缺失值检查
print("缺失值:\n", data.isnull().sum())

# 重复值检查
print("重复值:", data.duplicated().sum())
💡
几乎每道题第一步都是 read_csv + head(),必拿分项!
A2

类型转换 & 异常值过滤

astype + between + 范围筛选
Python
# 类型转换
data['Age'] = data['Age'].astype(int)
data['Amount'] = data['Amount'].astype(float)

# 安全转换(处理非数值)
data['hp'] = pd.to_numeric(data['hp'], errors='coerce')
data = data.dropna()

# 范围过滤 — 常见阈值
data = data[
    (data['Age'].between(18, 70)) &
    (data['Amount'] > 0) &
    (data['Score'].between(1, 5))
]
常见字段范围速记
Age: 18~70 Speed: 0~200 CreditScore: 300~850 Temperature: -10~50 Humidity: 0~100 Income: >2000
A3

条件标记(np.where)

根据条件新增标记列
Python
# 单条件标记(1.1.1 风险等级)
data['RiskLevel'] = np.where(
    data['DaysInHospital'] > 7,
    '高风险', '低风险'
)

# 多条件异常标记(1.1.2 温度异常)
data['IsAbnormal'] = np.where(
    (data['Temperature'] < -10) | (data['Temperature'] > 50),
    '异常', '正常'
)

# 统计标记结果
print(data['RiskLevel'].value_counts())

# 计算比例
high = (data['RiskLevel'] == '高风险').sum()
total = len(data)
ratio = high / total
A4

数据分箱(pd.cut)

BMI分箱、年龄分箱 — 必考重点
Python - BMI分箱
# BMI分箱(1.1.1)
bins = [0, 18.5, 24, 28, float('inf')]
labels = ['偏瘦', '正常', '超重', '肥胖']
data['BMIRange'] = pd.cut(
    data['BMI'], bins=bins, labels=labels
)
Python - 年龄分箱
# 年龄分箱(1.1.1 / 1.1.5)
age_bins = [0, 26, 36, 46, 56, 66, float('inf')]
age_labels = ['≤25岁', '26-35岁', '36-45岁',
              '46-55岁', '56-65岁', '>65岁']
data['AgeRange'] = pd.cut(
    data['Age'], bins=age_bins, labels=age_labels
)
⚠️
注意:bins 数量 = labels 数量 + 1,float('inf') 代表无穷大
A5

分组统计(groupby + agg)

value_counts / groupby.mean / groupby.agg
Python
# 频次统计
print(data['Category'].value_counts())

# 单列分组均值
result = data.groupby('Gender')['Amount'].mean()

# 多列分组聚合
result = data.groupby('Gender').agg({
    'Speed': 'mean',
    'Distance': 'mean',
    'Time': 'mean'
})

# 分箱后统计(count + mean)
result = data.groupby('SensorType').agg({
    'Value': ['count', 'mean']
})

# 分箱后统计风险比例
risk = data.groupby('BMIRange')['RiskLevel'].apply(
    lambda x: (x == '高风险').sum() / len(x)
)
Python - Z-score 标准化 & 保存
# Z-score 标准化
mean_val = data['Amount'].mean()
std_val = data['Amount'].std()
data['Amount_std'] = (data['Amount'] - mean_val) / std_val

# 缺失值填充(前向 + 后向)
data['Value'] = data['Value'].fillna(method='ffill')
data['Value'] = data['Value'].fillna(method='bfill')

# 保存结果
data.to_csv('cleaned_data.csv', index=False)
B
类别 B:数据清洗与预处理
2.1.1 ~ 2.1.5 · 20分钟 · 为建模做准备
读取数据
缺失值
dropna/fillna
重复值
drop_duplicates
类型转换
to_numeric
标准化/归一化
Scaler
特征/目标
X, y
train_test
_split
to_csv
保存
B1

标准化 & 归一化

StandardScaler vs MinMaxScaler
Python
from sklearn.preprocessing import StandardScaler, MinMaxScaler

# StandardScaler: 均值0, 标准差1(2.1.1, 2.1.2)
scaler = StandardScaler()
numerical = ['displacement', 'horsepower', 'weight']
data[numerical] = scaler.fit_transform(data[numerical])

# MinMaxScaler: 缩放到 [0, 1](2.1.3)
scaler = MinMaxScaler()
data[numerical] = scaler.fit_transform(data[numerical])
B2

IQR 异常值检测

2.1.3 信用评分 · 箱线图 + IQR
Python
# 四分位距 (IQR) 法去除异常值
Q1 = data.quantile(0.25)
Q3 = data.quantile(0.75)
IQR = Q3 - Q1

# 删除超出 1.5倍IQR 的数据
data = data[~(
    (data < (Q1 - 1.5 * IQR)) |
    (data > (Q3 + 1.5 * IQR))
).any(axis=1)]
📊
IQR 三步走:Q1/Q3IQR = Q3 - Q1过滤 < Q1-1.5*IQR 或 > Q3+1.5*IQR
B3

特征选择 & 数据集划分

X/y分离 + train_test_split(test_size=0.2)
Python
from sklearn.model_selection import train_test_split

# 方式一:指定特征列
feature_columns = ['feat1', 'feat2', 'feat3']
X = data[feature_columns]
y = data['target']

# 方式二:排除目标列
X = data.drop(columns=['target'])
y = data['target']

# 80/20 划分 — 固定参数!
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 保存
cleaned = pd.concat([X, y], axis=1)
cleaned.to_csv('cleaned_data.csv', index=False)
⚠️
固定参数必背:test_size=0.2random_state=42
C
类别 C:机器学习建模
2.2.1 ~ 2.2.5 · 20分钟 · 训练→预测→评估→纠错
读取数据
X/y 分离
train_test
_split
model.fit()
pickle.dump
保存模型
predict()
评估指标
纠错模型
SMOTE/XGB
C1

分类模型:逻辑回归 + SMOTE

2.2.1 信用评分 · 唯一的分类题
Python - 逻辑回归 + SMOTE纠错
import pickle
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report
from imblearn.over_sampling import SMOTE

# 训练逻辑回归
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)

# 保存模型
with open('model.pkl', 'wb') as f:
    pickle.dump(model, f)

# 预测 & 评估
y_pred = model.predict(X_test)
accuracy = model.score(X_test, y_test)
print(classification_report(y_test, y_pred))

# ===== SMOTE 纠错 =====
smote = SMOTE(random_state=42)
X_res, y_res = smote.fit_resample(X_train, y_train)
model.fit(X_res, y_res)
y_pred_new = model.predict(X_test)
accuracy_new = model.score(X_test, y_test)
SMOTE = 对少数类过采样,解决类别不平衡。纠错后重新 fit + predict + score
C2

回归模型:LR / RF / DT / XGBoost

2.2.2~2.2.5 · 4道回归题的通用模板
Python - 回归模型全家桶
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
from xgboost import XGBRegressor

# ---- 线性回归 (Pipeline) ----
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('linreg', LinearRegression())
])
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)

# ---- 随机森林 ----
rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)

# ---- 决策树 ----
dt = DecisionTreeRegressor(random_state=42)
dt.fit(X_train, y_train)

# ---- XGBoost 纠错 ----
xgb = XGBRegressor(n_estimators=100, random_state=42)
xgb.fit(X_train, y_train)
y_pred_xgb = xgb.predict(X_test)
评估指标(四大件)
Python
# 训练集得分
train_score = model.score(X_train, y_train)
# 测试集得分
test_score = model.score(X_test, y_test)
# 均方误差
mse = mean_squared_error(y_test, y_pred)
# R² 决定系数
r2 = r2_score(y_test, y_pred)

# 保存模型
with open('model.pkl', 'wb') as f:
    pickle.dump(model, f)

# 保存预测结果
results = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
results.to_csv('results.txt', index=False)
各题对应算法速查
2.2.1 LogisticRegression + SMOTE 2.2.2 Pipeline(LR) + RandomForest 2.2.3 RandomForest + XGBoost 2.2.4 LinearRegression + XGBoost 2.2.5 DecisionTree + 优化
D
类别 D:ONNX 模型推理
3.2.1 ~ 3.2.5 · 20分钟 · 图像识别系统
InferenceSession
加载模型
读取标签
labels.txt
PIL加载图像
预处理
session.run()
推理
softmax
概率计算
argsort
Top-5输出
D1

ResNet 图像分类推理

3.2.1 / 3.2.3 / 3.2.4 / 3.2.5
Python - 完整 ONNX 推理流程
import numpy as np
import onnxruntime as ort
from PIL import Image
from scipy.special import softmax

# 1. 加载模型
session = ort.InferenceSession('onnx/resnet.onnx')
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name

# 2. 加载标签
with open('onnx/labels.txt', 'r') as f:
    labels = [line.strip() for line in f.readlines()]

# 3. 图像预处理
def preprocess_image(path, size=224):
    img = Image.open(path).convert('RGB')
    img = img.resize((size, size))
    arr = np.array(img).astype(np.float32) / 255.0
    # ImageNet 标准化
    mean = np.array([0.485, 0.456, 0.406])
    std = np.array([0.229, 0.224, 0.225])
    arr = (arr - mean) / std
    # HWC → CHW → NCHW
    arr = arr.transpose(2, 0, 1)
    arr = np.expand_dims(arr, axis=0).astype(np.float32)
    return arr

# 4. 推理
processed = preprocess_image('img_test.jpg')
output = session.run(
    [output_name], {input_name: processed}
)[0]

# 5. Top-5 结果
probs = softmax(output, axis=-1)
top5 = np.argsort(probs[0])[-5:][::-1]
for i, idx in enumerate(top5):
    print(f"  {i+1}. {labels[idx]}: {probs[0][idx]:.4f}")
📸
预处理核心:resize(224)/255减均值除标准差HWC转CHWexpand_dims加batch维
D2

MNIST 手写数字识别

3.2.2 · 灰度图 28x28 变体
Python - MNIST变体
# MNIST: 灰度图, 28x28, 不需要 ImageNet 标准化
def preprocess_mnist(path):
    img = Image.open(path).convert('L')      # 灰度!
    img = img.resize((28, 28))              # 28x28!
    arr = np.array(img).astype(np.float32) / 255.0
    arr = np.expand_dims(arr, axis=(0, 1)) # (1,1,28,28)
    return arr

processed = preprocess_mnist('img_test.png')
output = session.run([output_name], {input_name: processed})[0]
digit = np.argmax(output)
print(f"识别结果: {digit}")
⚠️
MNIST与ResNet区别:灰度('L') vs RGB,28x28 vs 224x224,无需ImageNet均值/标准差
高频考点速查表
按出现频率排序 · 星级越高越重要
考点 频率 涉及题目
pd.read_csv() ★★★★★ 几乎所有代码题
data.head() ★★★★★ 几乎所有代码题
to_csv(index=False) ★★★★★ 几乎所有代码题
data.dropna() ★★★★★ 1.1.x, 2.1.x 全部
train_test_split() ★★★★ 2.1.x, 2.2.x 全部
model.fit() / predict() ★★★★ 2.2.x 全部
groupby() + agg() ★★★★ 1.1.1, 1.1.2, 1.1.4, 1.1.5
duplicated() / drop_duplicates() ★★★★ 1.1.3, 2.1.x
pd.cut() 数据分箱 ★★★★ 1.1.1, 1.1.4, 1.1.5
pickle.dump() 保存模型 ★★★ 2.2.x 全部
StandardScaler / MinMaxScaler ★★★ 2.1.1, 2.1.2, 2.1.3
np.where() 条件标记 ★★★ 1.1.1, 1.1.2
value_counts() ★★★ 1.1.1, 1.1.4, 1.1.5
r2_score / MSE ★★★ 2.2.2, 2.2.3, 2.2.4, 2.2.5
ort.InferenceSession() ★★★ 3.2.x 全部
astype() 类型转换 ★★★ 1.1.4, 1.1.5
between() 范围检查 ★★ 1.1.3
softmax + argsort ★★ 3.2.x
!
必背固定参数
考试填空中反复出现的固定值

数据划分

  • test_size=0.2 (80/20)
  • random_state=42

模型参数

  • max_iter=1000 (LogisticRegression)
  • n_estimators=100 (RF/XGBoost)
  • random_state=42

保存参数

  • index=False (to_csv)
  • 'wb' (pickle写入模式)
  • errors='coerce' (to_numeric)

ImageNet标准化

  • mean=[0.485, 0.456, 0.406]
  • std=[0.229, 0.224, 0.225]
  • resize = 224x224
答题策略
考场实战建议
📚

先识别模板

看到题目先判断属于 A/B/C/D 哪个类别,对号入座填代码

🔒

固定参数死记

test_size=0.2, random_state=42, n_estimators=100, max_iter=1000

💾

文件名精确

保存的文件名严格按题目要求,一个字不差

时间分配

1.1.x 30分钟中等 | 2.1.x 20分钟简单 | 2.2.x 20分钟中等 | 3.2.x 20分钟需熟ONNX

🎯

先拿必得分

read_csv + head() 每题都有,import 语句必写对,to_csv 别忘 index=False

🔄

纠错模式固定

分类用 SMOTE → 回归用 XGBoost / RandomForest 替换原模型