在Python生态里,实现机器学习模型并不要求从零推导数学公式,借助成熟的第三方库可以把重心放在业务数据和效果优化上。最常见的组合是pandas做数据处理、scikit-learn(简称sklearn)完成建模与评估,必要时用joblib把模型持久化,再通过轻量服务框架对外提供预测能力。

一、环境准备与数据加载
开始之前需要安装基础库,通常使用pip即可完成。scikit-learn依赖numpy和scipy,pandas则方便做表格类数据的读取与清洗。建议创建独立的虚拟环境,避免不同项目的包版本互相冲突。
下面以经典的鸢尾花数据集为例,该数据集包含花萼长度、花萼宽度、花瓣长度、花瓣宽度四个数值特征,以及对应的三个品种标签。我们可以直接用sklearn内置的loader,也可以从csv文件读取。使用内置数据能快速验证流程,实际业务中更多是用pandas读取数据库导出或接口返回的表格。
import pandas as pd from sklearn.datasets import load_iris # 加载内置鸢尾花数据 raw = load_iris() df = pd.DataFrame(raw.data, columns=raw.feature_names) df['target'] = raw.target print(df.head()) print(df.isnull().sum())
二、数据预处理与特征工程
原始数据往往不能直接训练。数值量纲不一致会导致距离类算法(如KNN、SVM)被数值大的特征主导,因此需要标准化。sklearn的StandardScaler会把每列处理为均值0、方差1的分布,且应当先用训练集拟合,再转换验证集,防止数据泄露。
如果数据存在类别型变量,还需用OneHotEncoder做哑变量编码;若有缺失值,可用SimpleImputer按列均值或中位数填补。下面示例展示如何将数据集拆分为训练集与测试集,并应用标准化。注意splitter和scaler都只在训练阶段fit,这是很多初学者容易写错的地方。
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
三、模型选择与训练
sklearn提供统一的estimator接口:几乎所有模型都有fit用于训练、predict用于推理。对于分类任务,随机森林通常作为基线模型,它集成了多棵决策树,抗过拟合能力较强,对特征尺度也不敏感。我们在这里用标准化后的数据训练一个RandomForestClassifier。
模型初始化时可以指定n_estimators控制树的数量,max_depth限制单棵树的深度。训练完成后,用测试集评估准确率与混淆矩阵,判断各类别是否被均衡识别。如果测试准确率远低于训练准确率,说明模型过拟合,可尝试降低树深或增加数据量。
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
clf = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=42)
clf.fit(X_train_scaled, y_train)
y_pred = clf.predict(X_test_scaled)
print('准确率:', accuracy_score(y_test, y_pred))
print('混淆矩阵:')
print(confusion_matrix(y_test, y_pred))
四、交叉验证与调参
单次切分可能受随机种子影响,不能稳定反映模型能力。cross_val_score可以在多折划分下给出平均分数。结合GridSearchCV还能遍历超参数组合,自动选出验证集上表现最好的配置。
下面的代码演示用五折交叉验证评估随机森林,并用网格搜索尝试不同的树数量与最大深度。搜索结束后,best_estimator_就是调优后的模型,可继续用于预测或保存。
from sklearn.model_selection import cross_val_score, GridSearchCV
scores = cross_val_score(clf, X_train_scaled, y_train, cv=5)
print('交叉验证分数:', scores.mean())
param_grid = {
'n_estimators': [50, 100],
'max_depth': [3, 5, None]
}
grid = GridSearchCV(clf, param_grid, cv=5)
grid.fit(X_train_scaled, y_train)
print('最佳参数:', grid.best_params_)
五、模型保存与简单部署
训练好的模型可以用joblib序列化到磁盘,避免每次重启都重新训练。部署时加载模型与之前拟合的scaler,对新数据做同样的标准化后再预测,才能保证结果一致。
最轻量的部署方式是用Flask包装一个HTTP接口:接收JSON格式的特征列表,转成数组后调用predict返回类别。生产环境还需加上鉴权、日志和批量预测能力,但本地验证流程已经足够清晰。以下示例展示保存与加载的关键代码。
import joblib
joblib.dump(clf, 'rf_model.pkl')
joblib.dump(scaler, 'scaler.pkl')
# 部署时加载
loaded_clf = joblib.load('rf_model.pkl')
loaded_scaler = joblib.load('scaler.pkl')
new_data = [[5.1, 3.5, 1.4, 0.2]]
new_scaled = loaded_scaler.transform(new_data)
print('预测类别:', loaded_clf.predict(new_scaled))
六、常见误区与规避
第一个常见错误是在全量数据上做标准化再切分,这会让测试集信息混入训练过程,评估指标虚高。正确做法如上文所示,只在训练集fit。第二个误区是忽视类别不平衡,若某类样本极少却直接用准确率评判,模型全猜多数类也能得分很高,此时应改用F1或ROC-AUC。
另外,不要把模型当黑盒无脑堆叠。先理解特征含义与业务目标,用特征重要性或SHAP值检查模型是否利用了合理信号,才能在上线后保持稳定效果。Python机器学习落地的关键,始终是严谨的数据处理和可复现的评估流程。