【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型

AutoML 是机器学习中一个相对较新的领域,它主要将机器学习中所有耗时过程自动化,如数据预处理、最佳算法选择、超参数调整等,这样可节约大量时间在建立机器学习模型过程中。

今天我将用一个简单的示例来全面讲解 AutoML 工具:Auto-Sklearn,相信你会爱上这个这么省心的工具。

Auto-Sklearn 简介

熟悉机器学习的人都知道 scikit-learn,这是著名的 python 包,由不同的分类和回归算法组成,用于构建机器学习模型。

Auto-Sklearn 是一个基于 Python 的开源工具包,用于执行 AutoML,它采用著名的 Scikit-Learn 机器学习包进行数据处理和机器学习算法。在本文中,我们将了解如何利用 Auto-Sklearn 进行分类和回归任务。

让我们先安装 Auto-Sklearn 包

pip install auto-sklearn

现在我们已经安装了 AutoML 工具,我们将导入用于预处理数据集和可视化的基本包。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split

分类任务

我们将使用 UCI 存储库中提供的心脏病预测数据集。为方便起见,让我们使用来自 Kaggle 的数据的.csv 版本。你还可以使用其他分类数据集。

数据集详细信息:该数据集包含 303 个样本和 14 个属性(原始数据集有76个特征,而.csv 版本有原始数据集的14个子集)。

导入数据集

df=pd.read_csv('/content/heart.csv')
df.head()

【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型_第1张图片让我们检查数据集中的目标变量"target"

df['target'].value_counts()

004de3e7aab06b38bc7b9cb2594cd95b.png只有两类(0=健康,1=心脏病),所以这是一个二元分类问题。此外,还表明这是一个不平衡的数据集。因此,该模型的准确度得分将不太可靠。

但是,我们将首先通过将不平衡数据集直接馈送到 autosklearn 分类器来测试它。稍后我们将调整这两个类的样本数量并测试准确率,看看分类器的表现如何。

#creating X and y 
X=df.drop(['target'],axis=1)
y=df['target']
#split into train and test sets
X_train, X_test, y_train, y_test= train_test_split(X,y, test_size=0.2, random_state=42)
X_train.shape, X_test.shape,y_train.shape, y_test.shape
34257cca85a9aec5a6eb5f1d3dd515a0.png

接下来,我们将使用以下命令从 autosklearn 导入分类模型。

import autosklearn.classification

然后我们将为分类任务创建一个 AutoSklearnClassifier 的实例。

automl = autosklearn.classification.AutoSklearnClassifier( time_left_for_this_task=5*60,per_run_time_limit=30,tmp_folder='/temp/autosklearn_classification_example_tmp')

说明一下,在这里我们使用time_left_for_this_task参数设置此任务的最长时间,并为其分配5分钟。如果没有为此参数指定任何内容,则该过程将运行一个小时,即60分钟。使用per_run_time_limit参数将分配给每个模型评估的时间设置为 30 秒。

此外,还有其他参数,如n_jobs(并行作业数)、ensemble_sizeinitial_configurations_via_metalearning,可用于微调分类器。默认情况下,上述搜索命令会创建一组表现最佳的模型。为了避免过度拟合,我们可以通过更改设置ensemble_size = 1initial_configurations_via_metalearning = 0来禁用它。我们在设置分类器时排除了这些以保持方法的简单。

我们还将提供一个临时的日志保存路径,我们可以在以后使用它来打印运行详细信息。

现在,我们将拟合分类器

automl.fit(X_train, y_train)

sprint_statistics()函数总结了上述搜索和选择的最佳模型的性能。

pprint(automl.sprint_statistics())

33fd947a10042b58ef391968db7d46ad.png我们还可以使用以下命令为搜索考虑的所有模型打印排行榜

print(automl.leaderboard())
【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型_第2张图片

分类器选择的前两个模型分别是随机森林和 Passive_aggressive。

此外,我们可以使用以下命令打印有关所考虑模型的信息:

pprint(automl.show_models())

我们还可以打印集成的最终分数和混淆矩阵。

# Score of the final ensemble
from sklearn.metrics import accuracy_score
m1_acc_score= accuracy_score(y_test, y_pred)
m1_acc_score
from sklearn.metrics import confusion_matrix, accuracy_score
y_pred= automl.predict(X_test)
conf_matrix= confusion_matrix(y_pred, y_test)
sns.heatmap(conf_matrix, annot=True)

【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型_第3张图片我们可以使用以下命令来分离数据集中的健康和不健康样本

from sklearn.utils import resample
healthy= df[df["target"]==0]
unhealthy=df[df["target"]==1]

随着不健康样本的数量越来越多,我们将使用重采样技术(过采样)并增加数据集中健康个体的样本。要调整偏斜,我们可以使用以下命令

up_sampled=resample(healthy, replace=True, n_samples=len(unhealthy), random_state=42)
up_sampled=pd.concat([unhealthy, up_sampled])
#check updated class counts
up_sampled['target'].value_counts()

我们还可以使用SMOTE、集成学习(bagging、boosting)、NearMiss 算法等技术来解决数据集中的不平衡问题。此外,我们可以使用 F1-score、精度和召回等指标来评估模型的性能。

现在我们已经调整了倾斜,我们将再次创建 X 和 y 集进行分类。让我们将它们命名为 X1 和 y1 以避免混淆。

X1=up_sampled.drop(['target'],axis=1)
y1=up_sampled['target']

我们需要重复从设置分类器到为这个新的 X1 和 y1 打印混淆矩阵的所有步骤。

最后,我们可以使用以下方法比较偏斜数据和调整数据的两种准确度

model_eval = pd.DataFrame({'Model': ['skewed','adjusted'], 'Accuracy': [m1_acc_score,m2_acc_score]})
model_eval = model_eval.set_index('Model').sort_values(by='Accuracy',ascending=False)
fig = plt.figure(figsize=(12, 4))
gs = fig.add_gridspec(1, 2)
gs.update(wspace=0.8, hspace=0.8)
ax0 = fig.add_subplot(gs[0, 0])
sns.heatmap(model_eval,cmap="PiYG",annot=True,fmt=".1%", linewidths=4,cbar=False,ax=ax0)
plt.show()
【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型_第4张图片

从上图中,模型精度在过采样后略有下降,我们可以看到模型现在优化得更好。尽管我们使用了很多额外的命令来预处理数据和评估结果,但运行 AutoSklearn 分类器只需要一行代码。即使有倾斜的数据,模型实现的准确性也非常好。

回归任务

现在我们将在本节中使用来自 AutoSklearn 的回归模型。

对于这项任务,让我们使用 seaborn 数据集库中的简单"航班"数据集。我们将使用以下命令加载数据集。

#loading the dataset
df = sns.load_dataset('flights')
df.head()
d4b54cea75f5063e58b2fbf67c2dd228.png

数据集详情:该数据集包含144行3列,分别为年、月、旅客人数。

这里的任务是使用其他两个特征来预测乘客数量。

X=df.drop(["passengers"],axis=1)
y=df["passengers"]
X.shape, y.shape
1273724d36fff335c1840575f03ab126.png
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train.shape, X_test.shape,y_train.shape, y_test.shape

7d08de04f37b5ca0d1e16c1edcc353f6.png我们现在使用 autosklearnregressor 来完成这个回归任务。

import autosklearn.regression
automl = autosklearn.regression.AutoSklearnRegressor(
time_left_for_this_task=5*60,per_run_time_limit=30,tmp_folder='/temp/autosklearn_regression_example_tmp')
automl.fit(X_train, y_train)
from sklearn.metrics import mean_absolute_error
from autosklearn.metrics import mean_absolute_error as auto_mean_absolute_error

现在,让我们看一下模型的统计数据

# summarize
print(automl.sprint_statistics())

【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型_第5张图片从上面总结中,我们了解到回归器一共跑了 59 个模型,最终回归模型的计算性能为 0.985 的 R2,相当不错。

由于回归器默认优化了 R2 指标,让我们打印平均绝对误差来更好地评估模型的性能。

# evaluate the best model
y_pred = automl.predict(X_test)
mae = mean_absolute_error(y_test, y_pred)
print("MAE: %.3f" % mae)
2a4ee484fafbeb1e8299ec444e8cacac.png

从模型实现的 R2 值和用于此任务的示例数据集的大小来看,平均绝对误差是可以接受的。

我们还可以使用 matplotlib 绘制预测值与实际值,如下所示

plt.figure(figsize=(8,6))
plt.scatter(y_test, y_pred, c='blue')
p1 = max(max(y_pred), max(y_test))
p2 = min(min(y_pred), min(y_test))
plt.plot([p1, p2], [p1, p2], 'r-')
plt.xlabel('Actual', fontsize=10)
plt.ylabel('Predicted', fontsize=10)
plt.legend(['Actual', 'Predicted'])
plt.axis('equal')
plt.show()
【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型_第6张图片

总的来说,可以说MAE值很小,模型取得了很高的验证分数,为0.985,说明模型性能不错。

保存训练好的模型。

上面训练的分类和回归模型可以使用 python 包 Pickle 和 JobLib 保存。然后可以使用这些保存的模型直接对新数据进行预测。我们可以将模型保存为:

1、Pickle

import pickle
# save the model 
filename = 'final_model.sav' 
pickle.dump(model, open(filename, 'wb'))

这里的"wb"参数意味着我们正在以二进制模式将文件写入磁盘。此外,我们可以将此保存的模型加载为:

#load the model
loaded_model = pickle.load(open(filename, 'rb'))
result = loaded_model.score(X_test, Y_test)
print(result)

这里的"rb"命令表示我们正在以二进制模式读取文件

2、JobLib 同样,我们可以使用以下命令将训练好的模型保存在 JobLib 中。

import joblib
# save the model 
filename = 'final_model.sav'
joblib.dump(model, filename)

我们还可以稍后重新加载这些保存的模型,以预测新数据。

# load the model from disk
load_model = joblib.load(filename)
result = load_model.score(X_test, Y_test)
print(result)

结论

在本文中,我们看到了Auto-Sklearn在分类和回归模型中的应用。对于这两个任务,我们不需要指定特定的算法。

相反,该工具本身迭代了几种内置算法并取得了良好的结果(分类模型的准确性更高,回归模型的平均绝对误差更低)。

因此,AutoSklearn 可以成为使用几行代码构建更好的机器学习模型的宝贵工具。

 
   
 
   
 
   
 
   
 
   
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

【机器学习】Auto-Sklearn:使用 AutoML 加速你的机器学习模型_第7张图片

你可能感兴趣的:(算法,人工智能,大数据,python,机器学习)