AutoML 指的是自动为给定数据集发现最佳性能模型的技术。
当应用于神经网络时,这涉及到发现模型架构和训练模型所用的超参数,通常称为神经架构搜索。
AutoKeras 是一个用于对深度学习模型执行 AutoML 的开源库。搜索是通过所谓的 Keras 模型,使用 TensorFlow 的 tf.keras API 来进行的。
它提供了一种简单有效的方法,可以自动为各种预测建模任务找到表现最佳的模型,包括表格数据或所谓的结构化分类和回归数据集。
在本教程中,您将了解如何使用 AutoKeras 为分类和回归任务找到优秀的神经网络模型。
完成本教程后,您将了解:
- AutoKeras 是 AutoML 在深度学习中的一种实现,它使用神经架构搜索。
- 如何使用 AutoKeras 为二分类数据集找到表现最佳的模型。
- 如何使用 AutoKeras 为回归数据集找到表现最佳的模型。
让我们开始吧。
- 更新于 2020 年 9 月:更新了 AutoKeras 版本和安装说明。

如何使用 AutoKeras 进行分类和回归
图片由 kanu101 提供,保留部分权利。
教程概述
本教程分为三个部分;它们是:
- AutoKeras 用于深度学习
- AutoKeras 用于分类
- AutoKeras 用于回归
AutoKeras 用于深度学习
自动化机器学习(简称 AutoML)是指为预测建模问题自动寻找数据准备、模型和模型超参数的最佳组合。
AutoML 的好处在于,它能让机器学习从业者以极少的输入快速有效地解决预测建模任务,例如“即插即用”。
自动化机器学习(AutoML)已成为一个非常重要的研究课题,机器学习技术得到了广泛应用。AutoML 的目标是让机器学习背景知识有限的人能够轻松使用机器学习模型。
— Auto-keras:一个高效的神经架构搜索系统,2019。
AutoKeras 是 AutoML 在深度学习模型中的一种实现,它使用了 Keras API,特别是 TensorFlow 2 提供的 tf.keras API。
它通过搜索神经网络架构的过程来最好地解决建模任务,这通常被称为 神经架构搜索,简称 NAS。
…我们开发了一个广泛采用的开源 AutoML 系统,基于我们提出的方法,名为 Auto-Keras。它是一个开源的 AutoML 系统,可以本地下载和安装。
— Auto-keras:一个高效的神经架构搜索系统,2019。
秉承 Keras 的精神,AutoKeras 为不同任务(如图像分类、结构化数据分类或回归等)提供了易于使用的接口。用户只需指定数据位置和要尝试的模型数量,即可获得在数据集上表现最佳(在配置的约束下)的模型。
注意:AutoKeras 提供的是 TensorFlow 2 Keras 模型(例如 tf.keras),而不是独立的 Keras 模型。因此,该库假定您已安装 Python 3 和 TensorFlow 2.3.0 或更高版本。
在撰写本文时,您需要一个名为 keras-tuner 的先决库,需要手动安装。您可以按如下方式安装此库:
1 |
sudo pip install git+https://github.com/keras-team/keras-tuner.git@1.0.2rc1 |
如果情况再次发生变化,正如快速发展的开源项目经常发生的那样,请在此处查看官方安装说明。
现在我们可以安装 AutoKeras。
要安装 AutoKeras,您可以使用 Pip,如下所示:
1 |
sudo pip install autokeras |
您可以按如下方式确认安装成功并查看版本号:
1 |
sudo pip show autokeras |
您应该会看到类似以下的输出:
1 2 3 4 5 6 7 8 9 10 |
名称:autokeras 版本:1.0.8 摘要:用于深度学习的 AutoML 主页:http://autokeras.com 作者:德克萨斯农工大学数据分析(DATA)实验室,Keras 团队 作者邮箱:jhfjhfj1@gmail.com 许可证:MIT 位置:... 需要:tensorflow, packaging, pandas, scikit-learn 所需通过 |
安装完成后,您就可以应用 AutoKeras 为您的预测建模任务找到一个好的或优秀神经网络模型。
我们将研究两个您可能希望使用 AutoKeras 的常见示例:分类和表格数据上的回归,即所谓的结构化数据。
AutoKeras 用于分类
AutoKeras 可用于为表格数据上的分类任务发现一个好的或优秀模型。
回顾一下,表格数据是指那些由行和列组成的数据集,例如您在电子表格中看到的表格或数据。
在本节中,我们将为海滩分类数据集开发一个模型,用于将海滩声呐返回分类为岩石或水雷。该数据集包含 208 行数据,60 个输入特征,以及目标类别标签 0(岩石)或 1(水雷)。
通过重复 10 折交叉验证,一个朴素模型可以达到约 53.4% 的分类准确率,这提供了一个下限。一个好的模型可以达到约 88.2% 的准确率,这提供了一个上限。
你可以在此处了解更多关于此数据集的信息:
无需下载数据集;我们将在示例中自动下载。
首先,我们可以下载数据集并将其划分为随机选择的训练集和测试集,其中 33% 用于测试,67% 用于训练。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 加载海滩数据集 from pandas import read_csv from sklearn.model_selection import train_test_split 从 sklearn.preprocessing 导入 LabelEncoder # 加载数据集 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv' dataframe = read_csv(url, header=None) print(dataframe.shape) # 分割输入和输出元素 data = dataframe.values X, y = data[:, :-1], data[:, -1] print(X.shape, y.shape) # 基本数据准备 X = X.astype('float32') y = LabelEncoder().fit_transform(y) # 分割为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1) print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) |
运行示例后,会先下载数据集并汇总形状,显示预期的行数和列数。
数据集随后被分割为输入和输出元素,然后这些元素被进一步分割为训练集和测试集。
1 2 3 |
(208, 61) (208, 60) (208,) (139, 60) (69, 60) (139,) (69,) |
我们可以使用 AutoKeras 为此数据集自动发现一个有效的神经网络模型。
这可以通过使用 StructuredDataClassifier 类并指定要搜索的模型数量来实现。这定义了要执行的搜索。
1 2 3 |
... # 定义搜索 search = StructuredDataClassifier(max_trials=15) |
然后,我们可以使用加载的数据集执行搜索。
1 2 3 |
... # 执行搜索 search.fit(x=X_train, y=y_train, verbose=0) |
这可能需要几分钟,并会报告搜索进度。
接下来,我们可以在测试数据集上评估模型,以了解它在新数据上的表现。
1 2 3 4 |
... # 评估模型 loss, acc = search.evaluate(X_test, y_test, verbose=0) print('Accuracy: %.3f' % acc) |
然后,我们使用该模型对新行数据进行预测。
1 2 3 4 5 6 |
... # 使用模型进行预测 row = [0.0200,0.0371,0.0428,0.0207,0.0954,0.0986,0.1539,0.1601,0.3109,0.2111,0.1609,0.1582,0.2238,0.0645,0.0660,0.2273,0.3100,0.2999,0.5078,0.4797,0.5783,0.5071,0.4328,0.5550,0.6711,0.6415,0.7104,0.8080,0.6791,0.3857,0.1307,0.2604,0.5121,0.7547,0.8537,0.8507,0.6692,0.6097,0.4943,0.2744,0.0510,0.2834,0.2825,0.4256,0.2641,0.1386,0.1051,0.1343,0.0383,0.0324,0.0232,0.0027,0.0065,0.0159,0.0072,0.0167,0.0180,0.0084,0.0090,0.0032] X_new = asarray([row]).astype('float32') yhat = search.predict(X_new) print('Predicted: %.3f' % yhat[0]) |
我们可以检索最终模型,该模型是 TensorFlow Keras 模型的实例。
1 2 3 |
... # 获取表现最佳的模型 model = search.export_model() |
然后,我们可以总结模型的结构,看看选择了什么。
1 2 3 |
... # 总结加载的模型 model.summary() |
最后,我们可以将模型保存到文件中以供将来使用,该模型可以使用 TensorFlow 的 load_model() 函数进行加载。
1 2 3 |
... # 将表现最佳的模型保存到文件 model.save('model_sonar.h5') |
总而言之,下面列出了使用 AutoKeras 为海滩数据集找到有效神经网络模型的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
# 使用 autokeras 为海滩数据集找到模型 from numpy import asarray from pandas import read_csv from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from autokeras import StructuredDataClassifier # 加载数据集 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/sonar.csv' dataframe = read_csv(url, header=None) print(dataframe.shape) # 分割输入和输出元素 data = dataframe.values X, y = data[:, :-1], data[:, -1] print(X.shape, y.shape) # 基本数据准备 X = X.astype('float32') y = LabelEncoder().fit_transform(y) # 分割为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1) print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) # 定义搜索 search = StructuredDataClassifier(max_trials=15) # 执行搜索 search.fit(x=X_train, y=y_train, verbose=0) # 评估模型 loss, acc = search.evaluate(X_test, y_test, verbose=0) print('Accuracy: %.3f' % acc) # 使用模型进行预测 row = [0.0200,0.0371,0.0428,0.0207,0.0954,0.0986,0.1539,0.1601,0.3109,0.2111,0.1609,0.1582,0.2238,0.0645,0.0660,0.2273,0.3100,0.2999,0.5078,0.4797,0.5783,0.5071,0.4328,0.5550,0.6711,0.6415,0.7104,0.8080,0.6791,0.3857,0.1307,0.2604,0.5121,0.7547,0.8537,0.8507,0.6692,0.6097,0.4943,0.2744,0.0510,0.2834,0.2825,0.4256,0.2641,0.1386,0.1051,0.1343,0.0383,0.0324,0.0232,0.0027,0.0065,0.0159,0.0072,0.0167,0.0180,0.0084,0.0090,0.0032] X_new = asarray([row]).astype('float32') yhat = search.predict(X_new) print('Predicted: %.3f' % yhat[0]) # 获取表现最佳的模型 model = search.export_model() # 总结加载的模型 model.summary() # 将表现最佳的模型保存到文件 model.save('model_sonar.h5') |
运行示例将报告大量关于搜索进度的调试信息。
模型和结果都保存在您当前工作目录中的一个名为“structured_data_classifier”的文件夹中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
... [Trial complete] [Trial summary] |-Trial ID: e8265ad768619fc3b69a85b026f70db6 |-Score: 0.9259259104728699 |-Best step: 0 > Hyperparameters |-classification_head_1/dropout_rate: 0 |-optimizer: adam |-structured_data_block_1/dense_block_1/dropout_rate: 0.0 |-structured_data_block_1/dense_block_1/num_layers: 2 |-structured_data_block_1/dense_block_1/units_0: 32 |-structured_data_block_1/dense_block_1/units_1: 16 |-structured_data_block_1/dense_block_1/units_2: 512 |-structured_data_block_1/dense_block_1/use_batchnorm: False |-structured_data_block_1/dense_block_2/dropout_rate: 0.25 |-structured_data_block_1/dense_block_2/num_layers: 3 |-structured_data_block_1/dense_block_2/units_0: 32 |-structured_data_block_1/dense_block_2/units_1: 16 |-structured_data_block_1/dense_block_2/units_2: 16 |-structured_data_block_1/dense_block_2/use_batchnorm: False |
表现最佳的模型随后在保留的测试数据集上进行评估。
注意:由于算法或评估程序的随机性,或数值精度的差异,您的结果可能会有所不同。请考虑运行示例几次并比较平均结果。
在这种情况下,我们可以看到该模型实现了约 82.6% 的分类准确率。
1 |
Accuracy: 0.826 |
接下来,将报告表现最佳模型的架构。
我们可以看到一个带有两个隐藏层、dropout 和 ReLU 激活的模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Model: "model" _________________________________________________________________ 层(类型) 输出形状 参数数量 ================================================================= input_1 (InputLayer) [(None, 60)] 0 _________________________________________________________________ categorical_encoding (Catego (None, 60) 0 _________________________________________________________________ dense (Dense) (None, 256) 15616 _________________________________________________________________ re_lu (ReLU) (None, 256) 0 _________________________________________________________________ dropout (Dropout) (None, 256) 0 _________________________________________________________________ dense_1 (Dense) (None, 512) 131584 _________________________________________________________________ re_lu_1 (ReLU) (None, 512) 0 _________________________________________________________________ dropout_1 (Dropout) (None, 512) 0 _________________________________________________________________ dense_2 (Dense) (None, 1) 513 _________________________________________________________________ classification_head_1 (Sigmo (None, 1) 0 ================================================================= Total params: 147,713 Trainable params: 147,713 不可训练参数: 0 _________________________________________________________________ |
AutoKeras 用于回归
AutoKeras 也可以用于回归任务,即预测数值的预测建模问题。
我们将使用汽车保险数据集,该数据集涉及根据索赔总数预测索赔总付款。该数据集有 63 行,一个输入变量和一个输出变量。
通过重复 10 折交叉验证,一个朴素模型可以达到约 66 的平均绝对误差 (MAE),这为预期性能提供了一个下限。一个好的模型可以达到约 28 的 MAE,这为性能提供了一个上限。
您可以在此处了解有关此数据集的更多信息:
我们可以加载数据集并将其分割为输入和输出元素,然后是训练集和测试集。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 加载海滩数据集 from pandas import read_csv from sklearn.model_selection import train_test_split # 加载数据集 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv' dataframe = read_csv(url, header=None) print(dataframe.shape) # 分割输入和输出元素 data = dataframe.values data = data.astype('float32') X, y = data[:, :-1], data[:, -1] print(X.shape, y.shape) # 分割为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1) print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) |
运行示例后,将加载数据集,确认行数和列数,然后将数据集分割为训练集和测试集。
1 2 3 |
(63, 2) (63, 1) (63,) (42, 1) (21, 1) (42,) (21,) |
可以使用 StructuredDataRegressor 类将 AutoKeras 应用于回归任务,并配置要试验的模型数量。
1 2 3 |
... # 定义搜索 search = StructuredDataRegressor(max_trials=15, loss='mean_absolute_error') |
然后可以像在分类情况下一样运行搜索并保存最佳模型。
1 2 3 4 5 |
... # 定义搜索 search = StructuredDataRegressor(max_trials=15, loss='mean_absolute_error') # 执行搜索 search.fit(x=X_train, y=y_train, verbose=0) |
然后,我们可以使用表现最佳的模型,在保留的数据集上对其进行评估,对新数据进行预测,并总结其结构。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
... # 评估模型 mae, _ = search.evaluate(X_test, y_test, verbose=0) print('MAE: %.3f' % mae) # 使用模型进行预测 X_new = asarray([[108]]).astype('float32') yhat = search.predict(X_new) print('Predicted: %.3f' % yhat[0]) # 获取表现最佳的模型 model = search.export_model() # 总结加载的模型 model.summary() # 将表现最佳的模型保存到文件 model.save('model_insurance.h5') |
总而言之,下面列出了使用 AutoKeras 为汽车保险数据集发现有效神经网络模型的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# 使用 autokeras 为保险数据集找到模型 from numpy import asarray from pandas import read_csv from sklearn.model_selection import train_test_split from autokeras import StructuredDataRegressor # 加载数据集 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/auto-insurance.csv' dataframe = read_csv(url, header=None) print(dataframe.shape) # 分割输入和输出元素 data = dataframe.values data = data.astype('float32') X, y = data[:, :-1], data[:, -1] print(X.shape, y.shape) # 分割为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1) print(X_train.shape, X_test.shape, y_train.shape, y_test.shape) # 定义搜索 search = StructuredDataRegressor(max_trials=15, loss='mean_absolute_error') # 执行搜索 search.fit(x=X_train, y=y_train, verbose=0) # 评估模型 mae, _ = search.evaluate(X_test, y_test, verbose=0) print('MAE: %.3f' % mae) # 使用模型进行预测 X_new = asarray([[108]]).astype('float32') yhat = search.predict(X_new) print('Predicted: %.3f' % yhat[0]) # 获取表现最佳的模型 model = search.export_model() # 总结加载的模型 model.summary() # 将表现最佳的模型保存到文件 model.save('model_insurance.h5') |
运行示例将报告大量关于搜索进度的调试信息。
模型和结果都保存在您当前工作目录中的一个名为“structured_data_regressor”的文件夹中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
... [Trial summary] |-Trial ID: ea28b767d13e958c3ace7e54e7cb5a14 |-Score: 108.62509155273438 |-Best step: 0 > Hyperparameters |-optimizer: adam |-regression_head_1/dropout_rate: 0 |-structured_data_block_1/dense_block_1/dropout_rate: 0.0 |-structured_data_block_1/dense_block_1/num_layers: 2 |-structured_data_block_1/dense_block_1/units_0: 16 |-structured_data_block_1/dense_block_1/units_1: 1024 |-structured_data_block_1/dense_block_1/units_2: 128 |-structured_data_block_1/dense_block_1/use_batchnorm: True |-structured_data_block_1/dense_block_2/dropout_rate: 0.5 |-structured_data_block_1/dense_block_2/num_layers: 2 |-structured_data_block_1/dense_block_2/units_0: 256 |-structured_data_block_1/dense_block_2/units_1: 64 |-structured_data_block_1/dense_block_2/units_2: 1024 |-structured_data_block_1/dense_block_2/use_batchnorm: True |
表现最佳的模型随后在保留的测试数据集上进行评估。
注意:由于算法或评估程序的随机性,或数值精度的差异,您的结果可能会有所不同。请考虑运行示例几次并比较平均结果。
在这种情况下,我们可以看到该模型实现了约 24 的 MAE。
1 |
MAE: 24.916 |
接下来,将报告表现最佳模型的架构。
我们可以看到一个带有两个隐藏层和 ReLU 激活的模型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Model: "model" _________________________________________________________________ 层(类型) 输出形状 参数数量 ================================================================= input_1 (InputLayer) [(None, 1)] 0 _________________________________________________________________ categorical_encoding (Catego (None, 1) 0 _________________________________________________________________ dense (Dense) (None, 64) 128 _________________________________________________________________ re_lu (ReLU) (None, 64) 0 _________________________________________________________________ dense_1 (Dense) (None, 512) 33280 _________________________________________________________________ re_lu_1 (ReLU) (None, 512) 0 _________________________________________________________________ dense_2 (Dense) (None, 128) 65664 _________________________________________________________________ re_lu_2 (ReLU) (None, 128) 0 _________________________________________________________________ regression_head_1 (Dense) (None, 1) 129 ================================================================= Total params: 99,201 Trainable params: 99,201 不可训练参数: 0 _________________________________________________________________ |
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- 自动化机器学习,维基百科.
- 神经架构搜索,维基百科.
- AutoKeras 主页.
- AutoKeras GitHub 项目.
- Auto-keras:一个高效的神经架构搜索系统, 2019.
- 标准分类和回归机器学习数据集的结果
总结
在本教程中,您了解了如何使用 AutoKeras 为分类和回归任务找到优秀的神经网络模型。
具体来说,你学到了:
- AutoKeras 是 AutoML 在深度学习中的一种实现,它使用神经架构搜索。
- 如何使用 AutoKeras 为二分类数据集找到表现最佳的模型。
- 如何使用 AutoKeras 为回归数据集找到表现最佳的模型。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
AutoKeras/AutoML 是否会告诉您它选择了哪个神经网络算法?上面的示例没有说明它找到了哪个算法来获得最佳结果。
是的,它会报告模型架构。我们在上面的教程中展示了这一点。
亲爱的 Jason。
我们可以在 1D CNN 中使用 autokeras 进行时间序列分类吗?
或许可以试试看?
您知道如何在 autokeras 中使用 1d cnn 层吗?有这样的参数吗?
默认情况下,autokeras 不使用 1d cnn 层来构建模型,对吗?
谢谢你
1D CNN 适用于序列预测问题,而不是简单的分类和回归。
也许您可以在序列预测问题中使用 autokeras,我不确定——我建议您查看文档。
它是否应用了网格搜索技术,一个接一个地应用模型并找到最佳结果?
不,它正在使用架构搜索。
在使用 Anaconda 安装 autokeras 时遇到问题?
很遗憾听到这个消息,具体是什么问题?
pip install git+https://github.com/keras-team/keras-tuner.git@1.0.2rc1
需要在安装 autokeras 之前安装。
感谢分享。
你好,杰森,
您是否考虑过写一篇关于 autokeras 和 rnnblock 的文章?
https://autokeras.com/block/#rnnblock
感谢您的建议!
Jason,
您可能需要更新上面的 autokeras 安装示例。当前的 autokeras 1.0.8 需要 keras-tuner 1.0.2rc1 才能成功安装。
pip install git+https://github.com/keras-team/keras-tuner.git@1.0.2rc1
pip install autokeras
这直接来自 https://autokeras.com/install/。
谢谢 Jeff。
谢谢 Jason 和 Jeff,我按照官方 Autokeras 教程安装时也遇到了麻烦。您的代码很有帮助。
嗨,Jason,
AutoKeras for Classification 脚本(海滩数据集示例)出现错误。
看起来是 TensorFlow 的问题。我有
NotFoundError: Failed to create a NewWriteableFile: .\structured_data_classifier\trial_4d05b06e9169e134eb46fa62f3778824\checkpoints\ep… : The system cannot find the path specified.
; No such process [Op:SaveV2]
我该如何解决这个问题?
谢谢您的帮助,
祝好,
马丁
听到这个消息很遗憾,也许这些提示会有帮助
https://machinelearning.org.cn/faq/single-faq/why-does-the-code-in-the-tutorial-not-work-for-me
这没什么大不了的。只需指定用于存储搜索输出的目录即可。
search = StructuredDataClassifier(max_trials=15,directory=my_directory)
谢谢您出色的教程。
诚挚的问候
干得好!
我也遇到了autokeras的一个问题。
安装看起来没问题,并且我得到了与您“sudo pip show autokeras”完全相同的信息。
我还尝试了按照上面的建议(keras-tuner.git@1.0.2rc1)卸载并重新安装,但无效。
我的错误信息是:
ImportError: cannot import name ‘StructuredDataClassifier’ from partially initialized module ‘autokeras’ (most likely due to a circular import) ….
错误出现在脚本的第5行:“from autokeras import StructuredDataClassifier”
”
有什么办法可以解决这个问题吗?
我的配置是Windows 10。Python 3.8.3。以及像tensorflow、keras、theano等所有库在其他脚本中都能正常工作。
谢谢 Gilles
听到这个消息我很难过。
确保您不是在使用IDE或笔记本,而是从命令行运行。
https://machinelearning.org.cn/faq/single-faq/how-do-i-run-a-script-from-the-command-line
尊敬的 Jason 博士
* 我已经通过从源码安装来安装这些包。OK
* 我特别遵循了安装建议 https://autokeras.com/install/,并使用了git bash命令进行安装。
* 我遵循了评论者的建议,将输出定向到特定目录。
背景信息 – 请跳过至此评论底部查看问题。谢谢。
结果 – 两个程序都花费了“很长”的时间来完成。我不知道这是算法的随机性导致了不同的结果。
第一个程序 – 将我的结果与您的结果进行比较
我的准确率为0.783,您的准确率为0.826
我运行了两次这个程序,准确率都低于您的模型。
参数数量:我的3162,您的147313
第二个程序
我也运行了第二个程序,并比较了我的运行结果和您的运行结果。
MAE – 我的运行结果和您的运行结果非常相似,24.663 对比 24.496
但是参数数量差异很大。
结论
第一个程序,我运行了几次,准确率大约是0.77,而您的是0.8+
在第一个程序中,参数数量的量级差异很大。
第二个程序结果非常相似,但参数数量差异很大。
此外
我在命令行而不是IDE上运行了第二个程序。我注意到有CUDA信息。是的,我的GPU是NVIDIA,我没有安装CUDA软件和Python封装——我的机器将近10年了。
此外,我只安装了不带GPU的Tensorflow。
**问题:**
* 第一个程序,为什么我的准确率只有 0.77+ 而你的有 0.8+?
* 为什么我的参数数量差异如此之大?
* 第二个程序的结果与你的相似。但参数数量差异很大。
* 是否安装 CUDA 软件和用于 CUDA 的 TensorFlow 会使程序运行得更快?
谢谢你,
悉尼的Anthony
我们可以预期模型和性能会有差异
https://machinelearning.org.cn/faq/single-faq/why-do-i-get-different-results-each-time-i-run-the-code
至于具体差异,我不知道。
是的,在 GPU 上运行会加快运行速度。
尊敬的Jason博士,
谢谢你,
悉尼的Anthony
尊敬的Jason博士,
我对第一个涉及 StructuredDataClassifier 的程序进行了一些进一步的实验。
在第一个示例中,你使用变量“row”进行了预测。
我想看看使用 X_test 进行预测会发生什么。
总而言之,无论 yhat 是浮点数还是整数,y_test 和 yhat 之间的相关性(无论是小数还是浮点数)都不算强,只有 0.62。这与模型的准确率为 0.811 形成对比。
然而,当我们使用 X_train 进行预测时
训练 Y 和拟合的 yhat5 之间的相关性为 0.879
尽管 y_test 的长度是 y 的 0.33 倍,但为什么与训练集 y_train 的相关性为 0.88,而与测试集 y_test 的相关性却只有 0.62?
谢谢你,
悉尼的Anthony
干得不错。
在 09/19/20,Anthony The Koala 指出他的准确率为 0.783(参数为 3162 个)。
我认为以下行将有助于为结构化数据分类器提供数据
search.fit(x=X_train, y=y_train, epochs=10)(见我下面的输出)。
祝好,
Slava
我的输出
Trial 10 Complete [00h 00m 02s]
val_accuracy: 1.0
Best val_accuracy So Far: 1.0
Total elapsed time: 00h 00m 29s
INFO:tensorflow:Oracle triggered exit
第 1/10 纪元
5/5 [==============================] – 1s 4ms/step – loss: 0.6745 – accuracy: 0.5618
第 2/10 纪元
5/5 [==============================] – 0s 4ms/step – loss: 0.6105 – accuracy: 0.7298
第 3/10 纪元
5/5 [==============================] – 0s 4ms/step – loss: 0.5654 – accuracy: 0.7744
第 4/10 纪元
5/5 [==============================] – 0s 5ms/step – loss: 0.5285 – accuracy: 0.8148
第 5/10 纪元
5/5 [==============================] – 0s 5ms/step – loss: 0.4966 – accuracy: 0.8148
第 6/10 纪元
5/5 [==============================] – 0s 3ms/step – loss: 0.4677 – accuracy: 0.8044
第 7/10 纪元
5/5 [==============================] – 0s 3ms/step – loss: 0.4411 – accuracy: 0.8296
第 8/10 纪元
5/5 [==============================] – 0s 3ms/step – loss: 0.4159 – accuracy: 0.8405
第 9/10 纪元
5/5 [==============================] – 0s 4ms/step – loss: 0.3914 – accuracy: 0.8611
第 10/10 纪元
5/5 [==============================] – 0s 3ms/step – loss: 0.3673 – accuracy: 0.8798
INFO:tensorflow:Assets written to: ./structured_data_classifier/best_model/assets
太棒了!
很棒的 API,非常感谢您引起我们对这一点的关注。
不幸的是,作者似乎排除了在此框架中使用样本权重(而 Keras 则平滑地集成了它们)的可能性。我尝试通过 **kwargs 传递权重矩阵,或者通过 TF Datasets 对象输入加权数据,但都没有成功。仔细查看 Autokeras 源代码后发现,它是故意写成不考虑样本权重的。我希望作者能在未来的版本中考虑添加此功能。或者是我遗漏了什么?
听到这个消息我很难过。
也许可以在 github 项目上发布问题,让作者知道?
布朗利博士,您好,
我正在尝试使用 Autokeras 对数据框执行回归。我想知道在分割训练集和测试集后是否需要对它们进行缩放?
谢谢,
Keyvan
可以尝试一下,然后比较结果。
感谢您关于 autokeras 的精彩解释。我有一个关于 autokeras 搜索的模型的问题。我通过 autokeras 进行了 300 次尝试,找到了性能最佳的模型。我是否需要用我的数据集重新训练这个模型?我不知道这个模型是否可以直接用于解决我的问题。对于我的问题,我应该如何使用这个模型进行后续步骤?我在这方面是新手,所以可能问一些基础问题。期待您的回复。谢谢!
不客气。
是的,用您可用的数据训练选定的模型,并开始进行预测。
这将是开始训练最终模型并进行预测的好地方。
https://machinelearning.org.cn/how-to-make-classification-and-regression-predictions-for-deep-learning-models-in-keras/
嗨,Jason,
我想知道如何从 Hdf5 文件中获取网络配置,因为 Autokeras 提出了一个带有自定义层的架构,那么是否可以手动重构 autokeras 提出的最佳架构?如果它使用了内置层,我们可以从 get_config() 函数中获取它,但这里是自定义层。你对此有什么想法吗?
感谢您的精彩文章。
我不确定,也许可以自己尝试并找出解决方案。
嗨,Jason,
AutoKeras 不支持 predict_proba 吗?有什么变通方法吗?
谢谢
调用 predict(),因为它会直接返回概率。
嗨 Jason,实际上 AutoKeras 返回的是
[0.],
[0.],
[0.],
[1.],
[1.],
[1.],
[0.]
predict() 函数返回的不是概率
谢谢
有意思。
是的,实际上如果我们导出模型后再进行预测,它会返回概率。
model1.fit(x,y)
model1.predict -> 返回类别
model_export = model1..export_model()
model_export.predict -> 返回概率
谢谢
太棒了!
Jason,您好,感谢您的教程。
能否请您帮忙解释一下,为什么我的损失值会出现 NaN?
我尝试了所有我能在网上找到的方法,包括检查数据中的零值、对数据进行归一化、更改激活函数、更改损失函数类型,但仍然没有结果。
谢谢你的回复。
对数据进行缩放,并确认在拟合模型之前数据确实已经缩放。
同时确认原始数据中没有 NaN。
Jason,您好,我一直是您许多帖子的默默受益者。
我有几个疑问,您能否帮我解答?
1. 在使用 AutoKeras 之前是否需要对特征进行归一化,或者 AutoKeras 会自动处理?如果我在将其输入 AutoKeras 之前自己进行归一化,会对结果产生影响吗?
2. 我有一个用例,需要预测两个目标变量(都是分类变量)。通过您的文章,我能够预测一个变量。如何使用 StructuredDataClassifier 或 AutoKeras 的任何其他方法,同时从相同的输入数据中预测两个分类变量?
提前感谢
谢谢。
是的,这是一个好主意。
也许可以为每个变量尝试一个模型?
也许可以尝试一个多输出模型?
也许可以尝试一个模型,其中每个输出都有一个子模型头。
Jason,您好,我正在进行一个使用 Autokeras 的项目,并生成了一些很好的权重。然后,由于某种原因,我的 Ubuntu 系统崩溃了,现在,完全相同的训练权重不再产生相同的结果。结果要差得多,有什么建议吗?
非常感谢您的所有工作,我从您那里学到了很多!
这很令人惊讶,相同的权重应该产生相同的预测。
也许您的测试中存在 bug 或错误的假设?
在崩溃之前,我已保存了所有文件和代码,因此所有代码行和权重都相同。我还保存了每个文件的预测结果副本,当前的所有结果都与我保存的有所不同。我查阅了互联网,有些人说不同的 Python 版本或某些操作系统相关的内部工作方式可能导致此问题,但没有解决方案或确切的解释。顺便说一句,我不知道这是否有帮助,但我将模型保存为 tf 模型。不过,如果您没有想法,不必回复此评论,我不想占用您的时间,再次感谢您的所有工作!
感谢分享这些细节。
嗨!
感谢您的文章,但您知道如何从贝叶斯搜索中保存最佳训练模型(估计器)吗?
此致
模型都已保存,作为搜索的一部分。
这在教程中有讨论。
你好,
我们可以使用这种方法专门设计堆叠式自动编码器吗?您能否建议一种方法来为给定的数据集找到最佳自动编码器(超参数、隐藏层神经元、隐藏层数量等)?
也许,您可能需要进行实验。
AutoKeras AutoModels 是否有等效的 History 回调?
抱歉,我不知道。
您好,能否请您在图中总结损失历史?我尝试了以下方法,但没有成功
# 总结损失历史
plt.title(‘Keras model loss’)
plt.plot(clf[‘loss’])
plt.plot(clf[‘val_loss’])
plt.ylabel(‘loss’)
plt.xlabel('epoch')
plt.legend([‘training’, ‘validation’], loc=’upper right’)
plt.show()
请帮忙?
请看这个例子
https://machinelearning.org.cn/display-deep-learning-model-training-history-in-keras/
Jason,您好,感谢您的帖子,它给了我很大的帮助。
但是当我尝试将模型保存为 h5 格式时,出现了错误。
NotImplementedError: Save or restore weights that is not an instance of
tf.Variable
is not supported in h5, usesave_format='tf'
instead.但我尝试使用 save_format=’tf' 时,它会保存一个 tf 文件夹而不是一个文件。
而且我不知道如何加载 tf 文件夹的模型。它和 h5 文件一样吗?
不,格式不同。但你为什么要保存 tf.Variable?它们不应该被保存。
嗨,Jason,
首先,感谢您出色的教程!!!
我只是想知道,为什么 AutoKeras 不支持对象检测任务(我在当前版本 1.0.16 中已检查过)。它也没有实现用于该任务的 HEAD?如果需要朝这个方向发展,我们需要在 AutoKeras 中实现哪些功能才能使其适用于对象检测?(例如自定义层、头、块等)。
提前感谢。
你好 Pallavi… 你可能会发现以下内容很有趣
https://machinelearning.org.cn/how-to-train-an-object-detection-model-with-keras/
一如既往的精彩文章,谢谢。
我试图理解在这里可训练和不可训练参数的含义?我总共有 19532 个参数,但其中 11 个是不可训练的。这可能意味着什么?
模型的不可训练参数是指在训练期间不会更新和优化的参数,必须预先定义或作为输入传递。例如:隐藏层的数量,每个隐藏层上的节点数。
你好,
感谢提供宝贵的信息。我对“不可训练参数”感到好奇。我将上面的代码应用于我的示例,它显示我有 11 个不可训练的参数。这意味着什么?
大家好,我在回归问题上遇到一个奇怪的 autokeras 问题
将我的训练数据第二次通过 predict 输入模型,我得到了非常糟糕的结果。即使在您这里的示例中也显而易见。我只是添加了它以解决绘图问题
predictions = search.predict(X)
miny = float(y.min())
maxy = float(y.max())
minp = float(min(predictions))
maxp = float(max(predictions))
plt.figure(figsize=(15,15))
plt.scatter(y, predictions, c=’crimson’,s=5)
p1 = max(maxp, maxy)
p2 = min(minp, miny)
plt.plot([p1, 0], [p1, 0], ‘b-‘)
plt.xlabel(‘True Values’, fontsize=15)
plt.ylabel(‘Predictions’, fontsize=15)
plt.axis(‘equal’)
plt.show()
这似乎导致预测值在 0 到 1 之间,而真实值在 0 到 400 之间。我是否遗漏了标准化过程?
这可以应用于多输入和多输出神经网络吗?
你好 Arch… 你可能会发现以下内容很有趣
https://machinelearning.org.cn/multi-output-regression-models-with-python/
我一拟合模型就遇到这个错误
module ‘numpy’ has no attribute ‘object’.
np.object
是一个已弃用的别名,用于内置的object
。为了避免在现有代码中出现此错误,请单独使用object
。这样做不会修改任何行为,并且是安全的。这些别名最初在 NumPy 1.20 中被弃用;有关更多详细信息和指导,请参阅原始发布说明,网址为:
https://numpy.com.cn/devdocs/release/1.20.0-notes.html#deprecations
任何帮助都会很棒,谢谢!
你好 Trevin… 请提供您遇到错误的代码。这将更好地帮助我们为您提供协助。