1. 数据处理:构建机器学习的基础

数据是机器学习的基石,就像盖房子需要坚固的地基一样。我见过太多项目因为数据问题而失败,所以这一步绝对不能马虎。首先得搞清楚数据从哪来,常见的数据源包括企业内部数据库、公开数据集(比如Kaggle)、甚至是从网页爬取的结构化数据。

处理数据的第一步是清洗。我习惯用Pandas来做这件事,它就像数据科学的瑞士军刀。举个例子,遇到缺失值时,简单的做法是用均值或中位数填充,但更专业的做法是建立一个小模型来预测缺失值。异常值处理也很关键,上周我刚处理过一个电商数据,发现有人用1块钱买了价值1万的商品,这明显是测试数据,必须剔除。

数据分割是另一个重点。我一般按7:2:1的比例划分训练集、验证集和测试集。这里有个坑要注意:一定要确保测试集的数据分布和真实场景一致。曾经有个项目,我们随机划分数据后发现测试集效果很好,上线后却一塌糊涂,就是因为测试集不能代表真实情况。

import pandas as pd
from sklearn.model_selection import train_test_split

# 读取数据
data = pd.read_csv('dataset.csv')

# 处理缺失值
data.fillna(data.mean(), inplace=True)

# 划分数据集
train, test = train_test_split(data, test_size=0.3)
val, test = train_test_split(test, test_size=0.33)

2. 特征工程:让数据开口说话

如果说数据是原材料,那特征工程就是把这些原材料加工成美味佳肴的过程。我常说,好的特征工程师能让普通算法表现惊人,而差的特征会让最强算法也束手无策。

特征选择是第一步。我常用的方法有相关系数分析和随机森林特征重要性。最近处理一个金融风控项目时,发现有些特征看似重要但实际上会引入噪声,用L1正则化帮我们筛选出了真正有用的20个特征。

特征构造更有意思。比如处理时间序列数据时,我会构造滑动窗口统计量;处理文本时,除了常规的TF-IDF,现在更倾向于用预训练的词向量。上个月做用户画像项目,我们把用户行为序列转换成图结构,再用图神经网络提取特征,效果提升了15%。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.ensemble import RandomForestClassifier

# 文本特征提取
tfidf = TfidfVectorizer(max_features=5000)
X_train = tfidf.fit_transform(train_text)

# 特征重要性分析
model = RandomForestClassifier()
model.fit(X_train, y_train)
importances = model.feature_importances_

3. 模型建立:选择合适的武器

模型选择就像选工具,不同的问题需要不同的解决方案。我建议新手从简单的模型开始,比如线性回归或决策树,先建立baseline。等流程跑通后,再尝试更复杂的模型。

在实践中,我发现集成方法通常表现最好。XGBoost是我的最爱,它在结构化数据比赛中屡试不爽。对于图像和文本数据,深度学习模型是必然选择。不过要注意,Transformer这类大模型需要大量数据和计算资源,小数据集上可能适得其反。

模型训练时,学习率设置特别关键。我习惯用学习率warmup和衰减策略。另一个经验是早停机制,可以防止过拟合。记得有次训练CNN时没设置早停,模型在训练集上准确率99%,测试集却只有60%,这就是典型的过拟合。

import xgboost as xgb
from sklearn.metrics import accuracy_score

# 训练XGBoost模型
params = {'max_depth':6, 'learning_rate':0.1, 'n_estimators':100}
model = xgb.XGBClassifier(**params)
model.fit(X_train, y_train)

# 预测
preds = model.predict(X_test)
print(f"准确率: {accuracy_score(y_test, preds):.2f}")

4. 模型评估:不仅仅是准确率

评估模型不能只看准确率,特别是数据不平衡时。上周评估一个医疗诊断模型,虽然准确率有95%,但查了一下混淆矩阵,发现对少数类的识别率只有30%,这种模型根本不能用。

对于分类问题,我必看ROC曲线和PR曲线。回归问题则关注MAE和R²。交叉验证也很重要,我一般用5折或10折交叉验证,这样评估结果更可靠。

调参是个技术活。网格搜索太耗时,我更喜欢用随机搜索或贝叶斯优化。最近发现Optuna这个库特别好用,可以自动寻找最优超参数。不过要注意,不要在测试集上调参,否则会导致数据泄漏。

from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score

# 详细评估报告
print(classification_report(y_test, preds))

# 交叉验证
scores = cross_val_score(model, X, y, cv=5)
print(f"交叉验证平均分: {scores.mean():.2f}")

5. 模型部署:从实验室到生产线

模型部署是很多人的盲区。我见过太多漂亮的模型死在部署环节。最简单的部署方式是用Flask或FastAPI封装成REST API。但要注意生产环境的性能要求,可能需要用异步框架或模型优化技术。

容器化是必须的,Docker让部署变得简单。对于高并发场景,可以考虑专门的模型服务框架,比如TensorFlow Serving。云平台也是个不错的选择,AWS SageMaker就提供了完整的ML生命周期管理。

上线后要持续监控。数据漂移是常见问题,我建议设置自动化的监控和重训练流程。去年我们有个推荐系统,上线3个月后效果逐渐变差,就是因为用户行为模式发生了变化。后来建立了周级别的自动重训练机制,问题才解决。

from flask import Flask, request, jsonify
import pickle

app = Flask(__name__)
model = pickle.load(open('model.pkl','rb'))

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json
    prediction = model.predict([data['features']])
    return jsonify({'prediction': prediction[0]})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

6. 实战案例:电商用户购买预测

去年我做过一个电商用户购买预测项目,很能说明整个流程。数据来自用户行为日志,首先用Spark处理了上亿条记录,清洗了缺失值和异常行为。然后构造了用户画像特征,包括购买频率、浏览深度、品类偏好等。

我们尝试了多种模型,最终XGBoost效果最好,但部署后发现实时预测速度不够快。于是改用LightGBM,速度快了3倍,准确率只下降了1%。上线后通过A/B测试验证,模型组比规则组的转化率提升了8%。

这个案例让我深刻体会到,机器学习项目不是一蹴而就的,需要不断迭代优化。从数据收集到最终上线,我们花了3个月时间,中间经历了无数次调整和优化。

更多推荐