跳转至

AutoML 自动机器学习


一句话说明

AutoML 自动完成机器学习中繁琐的工作(选模型、调超参、做特征工程),让生信研究人员不用精通 ML 也能快速搭建高性能预测模型。


核心知识点

AutoML 覆盖的流程

原始数据 → [自动预处理] → [自动特征工程] → [自动模型选择] → [自动超参调优] → 最优模型

主流 AutoML 框架对比

框架特点适合场景
AutoSklearn基于 scikit-learn,学术界常用表格数据,中小规模
TPOT遗传算法搜索管道小数据集,可导出代码
H2O AutoML工业级,支持大数据生产环境
PyCaret低代码,比较简单快速原型
AutoGluonAmazon,多模态,强大各类任务
Optuna超参优化专用库手动 AutoML
Ray Tune分布式超参搜索大规模搜索

超参优化策略

策略原理优缺点
网格搜索枚举所有组合全面但指数级慢
随机搜索随机采样快,效果接近网格
贝叶斯优化用历史结果建代理模型样本效率最高
进化算法遗传算法搜索适合复杂搜索空间
Hyperband早停低效配置速度快

生信应用

  • 自动化基因特征选择 + 癌症分型
  • 药物响应预测(小样本高维数据)
  • 蛋白质功能预测流程自动化
  • 生物标志物发现

实战代码

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import roc_auc_score

# ===== 1. 用 Optuna 做超参优化(最灵活的 AutoML 工具)=====
# pip install optuna
import optuna
optuna.logging.set_verbosity(optuna.logging.WARNING)  # 减少日志输出

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.svm import SVC

# 模拟癌症分类数据(基因表达 + 标签)
X, y = make_classification(
    n_samples=300,
    n_features=100,    # 100 个基因特征
    n_informative=20,  # 20 个真正重要的基因
    n_redundant=10,
    random_state=42
)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

def objective(trial):
    """
    Optuna 目标函数:定义搜索空间,返回要优化的指标
    trial 对象自动管理超参采样和历史记录
    """
    # 选择模型类型(离散选择)
    classifier_name = trial.suggest_categorical(
        'classifier', ['RandomForest', 'GradientBoosting', 'SVM']
    )

    if classifier_name == 'RandomForest':
        # 随机森林超参
        n_estimators = trial.suggest_int('n_estimators', 50, 300)   # 树的数量
        max_depth = trial.suggest_int('max_depth', 3, 15)            # 最大深度
        min_samples_split = trial.suggest_int('min_samples_split', 2, 10)
        clf = RandomForestClassifier(
            n_estimators=n_estimators,
            max_depth=max_depth,
            min_samples_split=min_samples_split,
            random_state=42
        )

    elif classifier_name == 'GradientBoosting':
        # 梯度提升超参
        n_estimators = trial.suggest_int('gb_n_estimators', 50, 200)
        learning_rate = trial.suggest_float('learning_rate', 0.01, 0.3, log=True)  # 对数采样
        max_depth = trial.suggest_int('gb_max_depth', 2, 8)
        clf = GradientBoostingClassifier(
            n_estimators=n_estimators,
            learning_rate=learning_rate,
            max_depth=max_depth,
            random_state=42
        )

    else:  # SVM
        C = trial.suggest_float('C', 0.1, 100, log=True)       # 正则化参数
        kernel = trial.suggest_categorical('kernel', ['rbf', 'linear'])
        clf = SVC(C=C, kernel=kernel, probability=True, random_state=42)

    # 用 5 折交叉验证评估(防止过拟合)
    scores = cross_val_score(clf, X_train, y_train, cv=5, scoring='roc_auc')
    return scores.mean()  # 返回平均 AUC(Optuna 默认最大化)

# 创建 Optuna 学习计划(study)
study = optuna.create_study(direction='maximize')  # 最大化 AUC
study.optimize(objective, n_trials=50)             # 尝试 50 种超参组合

print(f'最佳 AUC: {study.best_value:.4f}')
print(f'最佳超参: {study.best_params}')

# 用最佳超参重新训练并评估
best_params = study.best_params
classifier_name = best_params.pop('classifier')

if classifier_name == 'RandomForest':
    # 移除其他模型的参数
    rf_params = {k: v for k, v in best_params.items()
                 if k in ['n_estimators', 'max_depth', 'min_samples_split']}
    best_model = RandomForestClassifier(**rf_params, random_state=42)
else:
    best_model = RandomForestClassifier(random_state=42)  # 简化处理

best_model.fit(X_train, y_train)
y_pred_proba = best_model.predict_proba(X_test)[:, 1]
test_auc = roc_auc_score(y_test, y_pred_proba)
print(f'测试集 AUC: {test_auc:.4f}')

# ===== 2. PyCaret 低代码 AutoML 示例 =====
# pip install pycaret
try:
    from pycaret.classification import setup, compare_models, pull, finalize_model

    # PyCaret 的工作流(只需几行代码)
    df = pd.DataFrame(X_train, columns=[f'gene_{i}' for i in range(100)])
    df['label'] = y_train

    # 初始化实验(自动预处理、交叉验证设置)
    exp = setup(
        data=df,
        target='label',         # 目标列名
        session_id=42,           # 随机种子
        verbose=False
    )

    # 比较所有可用模型,选出最佳
    best_models = compare_models(n_select=3, sort='AUC', verbose=False)
    results = pull()  # 获取比较结果表格
    print('\nPyCaret 模型比较结果(前5):')
    print(results[['Model', 'AUC', 'F1']].head())

except ImportError:
    print("PyCaret 未安装。运行: pip install pycaret")

# ===== 3. 贝叶斯优化可视化 =====
import optuna.visualization as vis
try:
    # 优化历史图
    fig = vis.plot_optimization_history(study)
    print('\n贝叶斯优化收敛情况:可通过 fig.show() 查看')

    # 特征重要性(超参对结果的影响)
    fig2 = vis.plot_param_importances(study)
    print('超参重要性:可通过 fig2.show() 查看')
except Exception as e:
    print(f'可视化需要 plotly: {e}')

面试常问点

Q: AutoML 会取代机器学习工程师吗? A: 不会。AutoML 自动化的是标准化的超参调优,但特征工程的领域知识(如生信数据的特殊处理)、问题定义、结果解释、模型部署仍需人工。AutoML 是工具,不是替代品。

Q: 贝叶斯优化比随机搜索好在哪? A: 贝叶斯优化用历史评估结果建代理模型(如高斯过程),智能地选择下一个尝试点,比随机搜索更高效——达到同等性能所需的评估次数更少。

Q: 生信数据用 AutoML 有什么要注意的? A: ①高维小样本(需要特殊防过拟合策略);②类别不平衡(罕见疾病数据);③特征含义重要(不能盲目用黑盒 AutoML,需要可解释性);④防止数据泄露(预处理必须在 CV 内部完成)。

Q: Optuna 和 GridSearchCV 的区别? A: GridSearchCV 枚举所有组合,效率低;Optuna 用贝叶斯优化智能搜索,支持提前终止(Pruner),适合大搜索空间和计算昂贵的模型。


速查表

术语解释
NAS神经架构搜索,自动设计网络结构
HPO超参数优化
代理模型贝叶斯优化中拟合超参→性能的模型
TrialOptuna 中一次超参评估
Pruner提前终止差表现的 trial
SMAC贝叶斯优化的经典实现
EfficientNetNAS 搜索出的高效图像模型
元学习用历史任务经验加速新任务学习