Python 自动化机器学习:Auto-sklearn 和 TPOT 的模型选择与特征工程应用
大家好!今天我们来聊聊 Python 中自动化机器学习 (AutoML) 的两个热门框架:Auto-sklearn 和 TPOT。自动化机器学习旨在降低机器学习的门槛,让非专家也能高效地构建模型。Auto-sklearn 和 TPOT 都专注于自动化模型选择和特征工程,但它们采用的方法和侧重点略有不同。 本次讲座将深入探讨这两个框架的核心原理、用法,并通过实例演示如何在实际项目中应用它们。
1. 自动化机器学习 (AutoML) 概述
机器学习流程通常涉及以下几个关键步骤:
- 数据预处理: 清洗、转换和准备数据。
- 特征工程: 从原始数据中提取有用的特征。
- 模型选择: 选择合适的机器学习算法。
- 超参数优化: 调整模型参数以获得最佳性能。
传统上,这些步骤需要大量的人工干预和领域知识。 AutoML 的目标就是自动化这些步骤,尽可能减少人工干预,并找到最佳的模型和配置。
AutoML 的优势:
- 提高效率: 节省时间和人力成本。
- 降低门槛: 让非专家也能应用机器学习。
- 发现更优模型: 探索更广泛的模型和配置空间,可能发现人工难以找到的更优解。
AutoML 的挑战:
- 计算成本高: 搜索最佳模型和配置需要大量的计算资源。
- 可解释性差: 自动选择的模型可能缺乏可解释性。
- 数据依赖性强: AutoML 的性能高度依赖于数据的质量和特征。
2. Auto-sklearn:贝叶斯优化的威力
Auto-sklearn 基于 scikit-learn 库,它采用贝叶斯优化 (Bayesian Optimization) 和元学习 (Meta-Learning) 来自动化模型选择和超参数优化。
2.1 Auto-sklearn 的核心原理
- 贝叶斯优化: Auto-sklearn 使用贝叶斯优化来搜索最佳的模型和超参数组合。贝叶斯优化是一种高效的全局优化算法,它使用先验知识(例如元学习的结果)来指导搜索方向,从而减少搜索空间,提高效率。
- 元学习: Auto-sklearn 维护一个包含先前训练模型的数据库。当一个新的数据集到来时,Auto-sklearn 会利用元学习来从数据库中找到相似的数据集和模型,并将这些模型作为贝叶斯优化的初始点。
- 自动特征预处理: Auto-sklearn 自动执行常见的特征预处理步骤,例如缺失值处理、特征缩放和编码。
- 集成学习: Auto-sklearn 使用集成学习 (Ensemble Learning) 来组合多个模型的预测结果,从而提高模型的鲁棒性和准确性。它通常会构建一个由表现最佳的单个模型组成的集成。
2.2 Auto-sklearn 的安装和使用
首先,安装 Auto-sklearn:
pip install auto-sklearn
接下来,我们演示一个简单的分类任务:
import autosklearn.classification
import sklearn.model_selection
import sklearn.datasets
import sklearn.metrics
# 加载示例数据集
X, y = sklearn.datasets.load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, random_state=1)
# 创建 Auto-sklearn 分类器
automl = autosklearn.classification.AutoSklearnClassifier(
time_left_for_this_task=120, # 运行时间限制为 120 秒
per_run_time_limit=30, # 每个模型的运行时间限制为 30 秒
tmp_folder='/tmp/autosklearn_classification_example_tmp',
output_folder='/tmp/autosklearn_classification_example_output',
delete_tmp_folder_after_terminate=False,
n_jobs=-1 # 使用所有可用的 CPU 核心
)
# 训练模型
automl.fit(X_train, y_train)
# 预测
y_pred = automl.predict(X_test)
# 评估模型
accuracy = sklearn.metrics.accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
# 查看模型信息
print(automl.show_models())
# 获取统计信息
print(automl.sprint_statistics())
代码解释:
time_left_for_this_task
: 设置 Auto-sklearn 运行的总时间限制(秒)。per_run_time_limit
: 设置每个模型运行的时间限制(秒)。tmp_folder
和output_folder
: 指定临时文件和输出文件的存储路径。delete_tmp_folder_after_terminate
: 指定在运行结束后是否删除临时文件夹。n_jobs
: 指定并行运行的作业数。-1
表示使用所有可用的 CPU 核心。automl.show_models()
: 显示 Auto-sklearn 选择的模型及其超参数。automl.sprint_statistics()
: 显示 Auto-sklearn 的统计信息,例如运行时间、模型数量等。
2.3 Auto-sklearn 的高级用法
- 指定模型类型: 可以通过
include
/exclude
参数来指定 Auto-sklearn 应该包含或排除的模型类型。 例如,只包含支持向量机 (SVM) 和随机森林 (Random Forest):
automl = autosklearn.classification.AutoSklearnClassifier(
time_left_for_this_task=120,
per_run_time_limit=30,
include={'classifier': ['svm', 'random_forest']},
)
- 自定义预处理器: 可以通过自定义预处理器来扩展 Auto-sklearn 的功能。 例如,添加一个自定义的特征选择器:
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.feature_selection import SelectKBest, f_classif
class CustomFeatureSelector(BaseEstimator, TransformerMixin):
def __init__(self, k=10):
self.k = k
self.selector = SelectKBest(score_func=f_classif, k=k)
def fit(self, X, y=None):
self.selector.fit(X, y)
return self
def transform(self, X):
return self.selector.transform(X)
# 将自定义预处理器添加到 Auto-sklearn
automl = autosklearn.classification.AutoSklearnClassifier(
time_left_for_this_task=120,
per_run_time_limit=30,
include={'feature_preprocessor': [CustomFeatureSelector]},
)
- 集成学习配置: 可以通过
ensemble_size
和ensemble_nbest
参数来控制集成学习的行为。ensemble_size
指定集成中模型的数量,ensemble_nbest
指定用于构建集成的最佳模型的数量。
automl = autosklearn.classification.AutoSklearnClassifier(
time_left_for_this_task=120,
per_run_time_limit=30,
ensemble_size=50, # 集成中包含 50 个模型
ensemble_nbest=25, # 从最佳的 25 个模型中选择
)
2.4 Auto-sklearn 的优点和缺点
优点:
- 自动化程度高: 几乎不需要人工干预。
- 性能优异: 在许多数据集上都取得了良好的性能。
- 易于使用: API 设计简洁易懂。
缺点:
- 计算成本高: 需要大量的计算资源和时间。
- 可解释性差: 自动选择的模型可能缺乏可解释性。
- 对数据质量敏感: 对噪声数据和缺失值比较敏感。
3. TPOT:遗传算法的探索之旅
TPOT (Tree-based Pipeline Optimization Tool) 使用遗传算法 (Genetic Algorithm) 来自动设计和优化机器学习管道 (Pipeline)。
3.1 TPOT 的核心原理
- 遗传算法: TPOT 将机器学习管道表示为树结构,并使用遗传算法来搜索最佳的管道结构。遗传算法模拟生物进化过程,通过选择、交叉和变异等操作来不断优化管道的性能。
- 机器学习管道: TPOT 构建的管道包含多个步骤,例如特征预处理、特征选择和模型选择。每个步骤都有多个可选的操作,TPOT 会自动搜索最佳的操作序列。
- 自动特征工程: TPOT 可以自动执行各种特征工程操作,例如多项式特征生成、特征缩放和非线性变换。
- 基于树的表示: TPOT 使用基于树的表示来描述机器学习管道。树的每个节点代表一个操作,例如特征选择或模型选择。树的结构代表操作的顺序。
3.2 TPOT 的安装和使用
首先,安装 TPOT:
pip install tpot
接下来,我们演示一个简单的分类任务:
from tpot import TPOTClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits
# 加载示例数据集
digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target,
train_size=0.75, test_size=0.25, random_state=42)
# 创建 TPOT 分类器
tpot = TPOTClassifier(generations=5, # 遗传算法的迭代次数
population_size=20, # 种群大小
random_state=42,
verbosity=2, # 显示训练过程
n_jobs=-1 # 使用所有可用的 CPU 核心
)
# 训练模型
tpot.fit(X_train, y_train)
# 评估模型
print(tpot.score(X_test, y_test))
# 导出最佳管道
tpot.export('tpot_digits_pipeline.py')
代码解释:
generations
: 指定遗传算法的迭代次数。population_size
: 指定种群大小。random_state
: 设置随机种子,以保证结果的可重复性。verbosity
: 控制训练过程的输出信息。n_jobs
: 指定并行运行的作业数。-1
表示使用所有可用的 CPU 核心。tpot.export()
: 将最佳管道导出为 Python 代码。
3.3 TPOT 的高级用法
- 自定义评估函数: 可以通过
scoring
参数来指定自定义的评估函数。例如,使用 F1-score 作为评估函数:
from sklearn.metrics import make_scorer, f1_score
f1_scorer = make_scorer(f1_score, average='weighted')
tpot = TPOTClassifier(generations=5,
population_size=20,
random_state=42,
scoring=f1_scorer,
verbosity=2)
- 限制管道组件: 可以通过
config_dict
参数来限制 TPOT 使用的管道组件。例如,只允许使用决策树和逻辑回归:
from tpot.config import classifier_config_dict
config_dict = {
'sklearn.tree.DecisionTreeClassifier': classifier_config_dict['sklearn.tree.DecisionTreeClassifier'],
'sklearn.linear_model.LogisticRegression': classifier_config_dict['sklearn.linear_model.LogisticRegression'],
}
tpot = TPOTClassifier(generations=5,
population_size=20,
random_state=42,
config_dict=config_dict,
verbosity=2)
- 早期停止: 可以通过
early_stop
参数来设置早期停止策略。当模型的性能在一定迭代次数内没有提升时,TPOT 会自动停止训练。
tpot = TPOTClassifier(generations=5,
population_size=20,
random_state=42,
early_stop=5, # 在 5 代内没有提升时停止
verbosity=2)
3.4 TPOT 的优点和缺点
优点:
- 自动化特征工程: 可以自动执行各种特征工程操作。
- 灵活性高: 可以自定义评估函数和管道组件。
- 可解释性较好: 导出的管道代码易于理解和修改。
缺点:
- 计算成本高: 遗传算法需要大量的计算资源。
- 结果不稳定: 遗传算法的结果可能因随机性而异。
- 收敛速度慢: 在某些情况下,遗传算法的收敛速度可能较慢。
4. Auto-sklearn vs. TPOT:选择哪一个?
Auto-sklearn 和 TPOT 都是强大的 AutoML 框架,但它们适用于不同的场景。
特性 | Auto-sklearn | TPOT |
---|---|---|
核心算法 | 贝叶斯优化,元学习 | 遗传算法 |
特征工程 | 自动特征预处理 | 自动特征工程 |
可解释性 | 较差 | 较好 |
计算成本 | 高 | 高 |
灵活性 | 较低 | 较高 |
适用场景 | 需要快速获得高性能模型,对可解释性要求不高 | 需要自动特征工程,需要理解和修改模型流程 |
选择建议:
- 如果需要快速获得高性能的模型,并且对可解释性要求不高,可以选择 Auto-sklearn。
- 如果需要自动执行特征工程,并且需要理解和修改模型流程,可以选择 TPOT。
- 在计算资源充足的情况下,可以尝试同时使用 Auto-sklearn 和 TPOT,并比较它们的结果。
5. 实例演示:使用 Auto-sklearn 和 TPOT 解决 Kaggle 竞赛问题
我们以 Kaggle 上的 Titanic 生存预测问题为例,演示如何使用 Auto-sklearn 和 TPOT。
5.1 数据准备
首先,加载 Titanic 数据集,并进行简单的数据清洗:
import pandas as pd
from sklearn.model_selection import train_test_split
# 加载数据集
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
# 数据清洗
train_data['Age'].fillna(train_data['Age'].median(), inplace=True)
test_data['Age'].fillna(test_data['Age'].median(), inplace=True)
train_data['Embarked'].fillna(train_data['Embarked'].mode()[0], inplace=True)
test_data['Fare'].fillna(test_data['Fare'].median(), inplace=True)
# 特征选择
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
X_train, X_test, y_train, y_test = train_test_split(train_data[features], train_data['Survived'], test_size=0.2, random_state=42)
# 对类别特征进行编码
X_train = pd.get_dummies(X_train, columns=['Sex', 'Embarked'])
X_test = pd.get_dummies(X_test, columns=['Sex', 'Embarked'])
5.2 使用 Auto-sklearn
import autosklearn.classification
import sklearn.metrics
# 创建 Auto-sklearn 分类器
automl = autosklearn.classification.AutoSklearnClassifier(
time_left_for_this_task=360, # 运行时间限制为 360 秒
per_run_time_limit=60, # 每个模型的运行时间限制为 60 秒
tmp_folder='/tmp/autosklearn_titanic_tmp',
output_folder='/tmp/autosklearn_titanic_output',
delete_tmp_folder_after_terminate=False,
n_jobs=-1
)
# 训练模型
automl.fit(X_train, y_train)
# 预测
y_pred = automl.predict(X_test)
# 评估模型
accuracy = sklearn.metrics.accuracy_score(y_test, y_pred)
print("Auto-sklearn Accuracy:", accuracy)
5.3 使用 TPOT
from tpot import TPOTClassifier
# 创建 TPOT 分类器
tpot = TPOTClassifier(generations=10, # 遗传算法的迭代次数
population_size=40, # 种群大小
random_state=42,
verbosity=2,
n_jobs=-1)
# 训练模型
tpot.fit(X_train, y_train)
# 评估模型
print("TPOT Accuracy:", tpot.score(X_test, y_test))
# 导出最佳管道
tpot.export('tpot_titanic_pipeline.py')
5.4 生成提交文件
使用训练好的模型对测试集进行预测,并生成 Kaggle 提交文件。
# Auto-sklearn 预测
test_data = pd.get_dummies(test_data, columns=['Sex', 'Embarked'])
test_data = test_data[X_train.columns] # 保证测试集和训练集特征列相同
predictions = automl.predict(test_data[features])
submission = pd.DataFrame({'PassengerId': test_data['PassengerId'], 'Survived': predictions})
submission.to_csv('autosklearn_submission.csv', index=False)
# TPOT 预测 (需要使用导出的 pipeline)
# 可以将 tpot_titanic_pipeline.py 文件中的代码复制到这里,并进行预测
# 这里省略了代码
6. 未来展望
AutoML 仍然是一个快速发展的领域,未来有许多值得期待的方向:
- 更强大的特征工程能力: 自动发现更复杂的特征交互和转换。
- 更高效的优化算法: 减少计算成本,提高搜索效率。
- 更强的可解释性: 提供更易于理解的模型解释和可视化。
- 更广泛的应用场景: 支持更多的数据类型和任务类型。
- 与深度学习的结合: 自动化深度学习模型的选择和优化。
7. 总结
Auto-sklearn 和 TPOT 是 Python 中两个强大的自动化机器学习框架,它们可以自动化模型选择和特征工程,从而提高机器学习的效率和降低门槛。Auto-sklearn 基于贝叶斯优化和元学习,适用于需要快速获得高性能模型的场景。TPOT 基于遗传算法,适用于需要自动特征工程和理解模型流程的场景。在实际应用中,可以根据具体的需求和数据特点选择合适的框架。两者各有特点,在实际应用中应根据需求和数据特点选择最合适的工具。未来AutoML将朝着更强大、更高效、更易解释的方向发展,从而推动机器学习技术的普及和应用。