好的问题定义是成功的一半。不要急于动手写代码,先花时间理解业务需求。
6.2 机器学习工作流程
端到端ML项目实践
🎯 学习目标
- 理解机器学习项目完整流程
- 掌握各阶段的关键任务
- 学会识别和避免常见陷阱
- 了解最佳实践
🔄 完整工作流程
图:机器学习项目是一个迭代过程
📊 第一阶段:问题定义
明确业务问题
- 业务目标:要解决什么业务问题?
- 成功指标:如何衡量成功?
- 数据可用性:有什么数据可用?
- 约束条件:时间、资源、合规等限制
💡
🗃️ 第二阶段:数据收集与探索
import pandas as pd
import numpy as np
# 加载数据
df = pd.read_csv('data.csv')
# 数据概览
print(df.head())
print(df.info())
print(df.describe())
# 检查缺失值
print(df.isnull().sum())
# 检查数据分布
print(df['target'].value_counts())
# 可视化探索
import matplotlib.pyplot as plt
import seaborn as sns
# 相关性分析
plt.figure(figsize=(12, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.show()
🔧 第三阶段:特征工程
特征选择
from sklearn.feature_selection import (
SelectKBest,
f_classif,
mutual_info_classif
)
# 选择最相关的K个特征
selector = SelectKBest(
score_func=f_classif,
k=10
)
X_selected = selector.fit_transform(X, y)
# 查看选中的特征
selected_features = X.columns[
selector.get_support()
]
特征构建
# 创建新特征
df['feature_ratio'] = df['A'] / df['B']
df['feature_sum'] = df['A'] + df['B'] + df['C']
# 时间特征
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day_of_week'] = df['date'].dt.dayofweek
# 文本特征
df['text_length'] = df['text'].str.len()
df['word_count'] = df['text'].str.split().str.len()
🤖 第四阶段:模型选择与训练
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
# 候选模型
models = {
'Logistic Regression': LogisticRegression(),
'Random Forest': RandomForestClassifier(),
'SVM': SVC()
}
# 交叉验证比较
for name, model in models.items():
scores = cross_val_score(model, X_train, y_train, cv=5)
print(f"{name}: {scores.mean():.3f} (+/- {scores.std():.3f})")
📈 第五阶段:模型评估
分类指标
from sklearn.metrics import (
accuracy_score,
precision_score,
recall_score,
f1_score,
classification_report,
confusion_matrix
)
# 计算各项指标
print(f"准确率: {accuracy_score(y_test, y_pred)}")
print(f"精确率: {precision_score(y_test, y_pred)}")
print(f"召回率: {recall_score(y_test, y_pred)}")
print(f"F1分数: {f1_score(y_test, y_pred)}")
# 详细报告
print(classification_report(y_test, y_pred))
# 混淆矩阵
print(confusion_matrix(y_test, y_pred))
回归指标
from sklearn.metrics import (
mean_squared_error,
mean_absolute_error,
r2_score
)
# 计算各项指标
print(f"MSE: {mean_squared_error(y_test, y_pred)}")
print(f"RMSE: {np.sqrt(mean_squared_error(y_test, y_pred))}")
print(f"MAE: {mean_absolute_error(y_test, y_pred)}")
print(f"R²: {r2_score(y_test, y_pred)}")
🚀 第六阶段:模型部署
import joblib
# 保存模型
joblib.dump(model, 'model.joblib')
joblib.dump(scaler, 'scaler.joblib')
# 加载模型
loaded_model = joblib.load('model.joblib')
loaded_scaler = joblib.load('scaler.joblib')
# 预测新数据
def predict_new(data):
scaled = loaded_scaler.transform(data)
return loaded_model.predict(scaled)
📝 本节小结
✅
- • 机器学习项目有标准工作流程
- • 问题定义是最重要但常被忽视的环节
- • 数据质量和特征工程决定模型上限
- • 持续监控和迭代是生产环境的关键