1. 什么是自动机器学习?
自动机器学习(AutoML)是指使用机器学习算法构建机器学习模型的过程,其中所有程序和算法都可以自动运行而不需要人的特定输入。简而言之,它是一种自动化机器学习过程,其目的是降低构建机器学习模型的门槛,从而使更多的人可以使用机器学习技术。
1.1 自动化的内容
自动化过程中主要包含以下几个方面:
数据清洗和预处理
特征工程
模型选择
模型优化
模型部署与生产
1.2 自动机器学习框架
目前比较常用的自动机器学习框架包括Google的AutoML、Microsoft的Automated Machine Learning(AutoML)、H2O.ai等。
2. Python等效实现自动机器学习
Python是一种通用编程语言,与机器学习的结合非常紧密。Python有丰富的第三方机器学习库和框架,可以轻松地实现自动机器学习功能。
2.1 前置条件
在Python中实现自动机器学习需要使用到多个库,其中包括:
scikit-learn
numpy
pandas
tpot
这里我们使用TPOT进行自动机器学习的实现,它是一种开源Python库,可以自动选择合适的机器学习模型,其中TPOT代表Tree-based Pipeline Optimization Tool。它可以使用Genetic Programming(遗传程序)自动创建机器学习流水线,以提高模型的准确性。
2.2 TPOT的基本使用方法
以下是使用TPOT进行自动机器学习的基本代码,该代码使用iris数据集。
from tpot import TPOTClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import numpy as np
# 加载数据集
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data.astype(np.float64),
iris.target.astype(np.float64), train_size=0.75, test_size=0.25)
# 运行TPOT
tpot = TPOTClassifier(generations=5, population_size=20, verbosity=4, scoring='accuracy')
tpot.fit(X_train, y_train)
# 生成的机器学习模型评估
print(tpot.score(X_test, y_test))
该代码使用train_test_split()将数据分为训练集和测试集,然后使用TPOTClassifier训练数据集。TPOT默认的模型是将决策树和随机森林组合为一个管道,因此我们可以在TPOTClassifier构造函数中使用generations和population_size参数来改变我们生成模型的代数和种群大小。运行TPOT后,我们可以使用score()函数来评估生成的模型。
2.3 TPOT性能优化
TPOT是一种自动机器学习方法,因此需要在训练期间评估生成的模型。以下是提高TPOT性能的一些技巧。
2.3.1 配置TPOT运行环境
在使用TPOT进行自动机器学习时,需要指定多个参数,其中,产生性能瓶颈的主要是生成数和种群大小。一般来说,设置较小的数量可以加快TPOT的运行速度,但却可能会影响找到全局最优解的可能性。
示例代码:
tpot = TPOTClassifier(generations=5, population_size=20, verbosity=4, scoring='accuracy')
tpot.fit(X_train, y_train)
2.3.2 运行TPOT时使用并行化处理
可以在训练TPOT的时候启用多处理器并行化,从而缩短生成时间,并产生更好的结果。
示例代码:
tpot = TPOTClassifier(generations=5, population_size=20, verbosity=4, scoring='accuracy', n_jobs=-1)
tpot.fit(X_train, y_train)
2.3.3 调整TPOT生成器参数
可以通过更改生成器参数来提高TPOT的性能并生成更好的结构。这些参数包括:mutation_rate、crossover_rate、subsample等。
示例代码:
from tpot.config import classifiers
classifiers['sklearn.svm.SVC'] = {
'C': [1, 10, 100, 1000],
'kernel': ['linear', 'rbf'],
'gamma': ['scale', 'auto'],
'class_weight': [None, 'balanced']
}
tpot = TPOTClassifier(generations=5, population_size=20, verbosity=4, scoring='accuracy',
config_dict={
'sklearn.ensemble.ExtraTreesRegressor': {
'n_estimators': [100, 250],
'max_features': np.arange(0.05, 1.01, 0.05),
'min_samples_split': range(2, 21),
'min_samples_leaf': range(1, 21),
'bootstrap': [True, False]
},
'sklearn.ensemble.RandomForestRegressor': {
'n_estimators': [100, 250],
'max_features': np.arange(0.05, 1.01, 0.05),
'min_samples_split': range(2, 21),
'min_samples_leaf': range(1, 21),
'bootstrap': [True, False]
},
'sklearn.linear_model.LinearRegression': {
'fit_intercept': [True, False]
},
'sklearn.linear_model.LassoLarsCV': {
'normalize': [True, False]
},
'sklearn.linear_model.ElasticNetCV': {
'normalize': [True, False]
},
'sklearn.linear_model.RidgeCV': {
'normalize': [True, False]
},
'sklearn.tree.DecisionTreeRegressor': {
'max_depth': range(1, 11),
'min_samples_split': range(2, 21),
'min_samples_leaf': range(1, 21)
},
'xgboost.XGBRegressor': {
'n_estimators': [100, 250],
'max_depth': range(1, 11),
'learning_rate': np.arange(0.05, 1.01, 0.05),
'subsample': np.arange(0.05, 1.01, 0.05),
'min_child_weight': range(1, 21),
'n_jobs': [-1]
}
},
cv=5, n_jobs=-1)
2.3.4 设定TPOT的模型
可以使用sklearn的Pipeline类创建自定义管道,然后将其传递给TPOT,以告诉TPOT使用哪些模型和预处理步骤。
示例代码:
from sklearn.pipeline import make_pipeline, make_union
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import PolynomialFeatures
from sklearn.decomposition import TruncatedSVD
from sklearn.model_selection import RepeatedStratifiedKFold
from xgboost import XGBClassifier
# 创建预处理步骤(降维的至少1/2
svd = TruncatedSVD(n_components=371, random_state=42)
poly = PolynomialFeatures(degree=2, include_bias=False)
# 创建模型
xgb = XGBClassifier(n_estimators=737, max_depth=6, learning_rate=0.073, subsample=0.7, colsample_bytree=0.76,
reg_alpha=0.0005, reg_lambda=0.35, n_jobs=-1, random_state=42)
imputer = SimpleImputer(strategy='median', verbose=0)
# 创建管道
imputed_poly_svd_union = make_union(imputer, poly, svd)
pipeline_with_model = make_pipeline(imputed_poly_svd_union, xgb)
tpot = TPOTClassifier(generations=10, population_size=100, verbosity=3, scoring='roc_auc', cv=RepeatedStratifiedKFold(),
config_dict={'tpot.builtins.FeatureUnion': {
'transformer_list': [
('imputed_poly', imputed_poly_svd_union),
]}}, warm_start=True)
tpot.fit(X_train, y_train)