跳至内容
经典算法选择指南

经典算法选择指南

算法不是越复杂越好。选对算法的关键在于理解数据特征与业务约束,再对照算法的强项弱项做匹配。这篇用「地图」的形式帮你快速定位。

算法全景

按结构分四族:

  • 线性模型:假设目标与特征是线性关系,计算快、可解释、需特征工程。
  • 树模型:把空间切割成矩形区域,能捕捉非线性,不怕特征量级。
  • 集成模型:多个弱学习器投票/加权,通常是竞赛默认首选。
  • 基于距离的模型:看样本间距离做决策,对特征缩放敏感。

常见算法速查

算法类型一句话特点首选场景
逻辑回归线性/分类快、可解释、输出概率基线、特征可线性分开
线性回归 / 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

超参数调优

不要一开始就调参,先用默认参数跑通全流程并建立基线,再优化:

  1. 随机搜索RandomizedSearchCV):比网格搜索快,适合大参数空间。
  2. 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;需要可解释先试逻辑回归;快速基线用随机森林;图像/序列/语言才轮到深度学习。别一上来就用最复杂的模型。

最后更新于