经典算法选择指南
算法不是越复杂越好。选对算法的关键在于理解数据特征与业务约束,再对照算法的强项弱项做匹配。这篇用「地图」的形式帮你快速定位。
算法全景
按结构分四族:
- 线性模型:假设目标与特征是线性关系,计算快、可解释、需特征工程。
- 树模型:把空间切割成矩形区域,能捕捉非线性,不怕特征量级。
- 集成模型:多个弱学习器投票/加权,通常是竞赛默认首选。
- 基于距离的模型:看样本间距离做决策,对特征缩放敏感。
常见算法速查
| 算法 | 类型 | 一句话特点 | 首选场景 |
|---|---|---|---|
| 逻辑回归 | 线性/分类 | 快、可解释、输出概率 | 基线、特征可线性分开 |
| 线性回归 / Ridge / Lasso | 线性/回归 | Ridge 防共线性;Lasso 能做特征选择 | 数值预测、特征较多时 |
| 决策树 | 树/分类+回归 | 高可解释,易过拟合 | 需要解释给业务方 |
| 随机森林 | 集成/分类+回归 | 抗过拟合,较鲁棒 | 数据不大、特征混杂 |
| XGBoost / LightGBM | 集成/分类+回归 | 竞赛标配,速度快 | 结构化数据首选 |
| SVM | 基于距离/分类 | 高维有效;核技巧处理非线性 | 文本分类、小数据集 |
| KNN | 基于距离/分类+回归 | 无参数,理解简单 | 小数据集原型验证 |
| K-Means | 无监督/聚类 | 简单快速,需指定 K | 数据分群探索 |
选择决策树
数据量 > 100K,且实时预测要求低?
└→ LightGBM(速度/内存最优)
数据量中等(1K–100K),需要可解释性?
├→ 逻辑回归或线性 SVM(线性可分时)
└→ 随机森林(非线性、混杂特征)
只是快速跑一个基线?
└→ 逻辑回归(分类)或 Ridge(回归)
没有标签,想探索数据结构?
└→ K-Means 或 DBSCAN(不规则形状)快速上手示例
用 sklearn 可以用同一接口切换算法,非常适合对比实验:
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split
import pandas as pd
df = pd.read_csv("data.csv")
X, y = df.drop("label", axis=1), df["label"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 只需切换这一行,接口完全一致
model = RandomForestClassifier(n_estimators=200, random_state=42)
# model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
print(classification_report(y_test, model.predict(X_test)))XGBoost / LightGBM 的结构化数据优势
对于表格数据(结构化数据),梯度提升树在精度和速度上通常压过深度学习。原因:
- 不需要大量数据就能收敛(神经网络依赖大数据)。
- 不怕混合数值 + 类别特征。
- 训练结果可解释(SHAP 值)。
import lightgbm as lgb
train_data = lgb.Dataset(X_train, label=y_train)
params = {
"objective": "binary",
"metric": "auc",
"num_leaves": 63,
"learning_rate": 0.05,
}
model = lgb.train(params, train_data, num_boost_round=300,
valid_sets=[lgb.Dataset(X_test, label=y_test)],
callbacks=[lgb.early_stopping(20)])early_stopping 很重要——它用验证集自动找最优轮数,防止过拟合,省去手动调 num_boost_round。超参数调优
不要一开始就调参,先用默认参数跑通全流程并建立基线,再优化:
- 随机搜索(
RandomizedSearchCV):比网格搜索快,适合大参数空间。 - Optuna:贝叶斯优化,收敛更快,是当前调参主流。
import optuna
def objective(trial):
params = {
"num_leaves": trial.suggest_int("num_leaves", 20, 150),
"learning_rate": trial.suggest_float("learning_rate", 0.01, 0.3, log=True),
}
# ... 训练并返回验证集 AUC
return val_auc
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=50)
print(study.best_params)一句话小结
结构化数据先试 LightGBM;需要可解释先试逻辑回归;快速基线用随机森林;图像/序列/语言才轮到深度学习。别一上来就用最复杂的模型。
最后更新于