介绍
2020年7月8日在arXiv上发布了Auto-sklearn 2.0专论(https://arxiv.org/abs/2007.04074)。
我知道Auto-sklearn的存在,但是我从未使用过它,所以我借此机会尝试了一下。
论文舔
作者来自弗赖堡-汉诺威小组(https://www.automl.org/)。
根据该论文,Auto-sklearn 2.0的更新内容是对模型选择策略,投资组合构建,自动策略选择的改进,但是请参考该论文以获取详细信息。
(我了解我已经改善了总体配置的三个方面,包括模型选择,高级参数调整和预处理部分,但很抱歉我犯了一个错误,因为这只是一瞥。)
要做的事情
我想对某些数据执行Auto-sklearn1.0和Auto-sklearn2.0,并比较预测准确性。
另外,在Auto-sklearn中关闭也不是一件有趣的事情,因此我想使用Auto-Gluon预测相同的数据,然后看看精度如何。
环境
这次我将使用Google合作实验室(不使用GPU)。
做了什么
安装Auto-sklearn
https://automl.github.io/auto-sklearn/master/installation.html
按照此处所述执行以下操作:
截至2020年7月22日,安装过程中没有错误。
1 2 3 | !sudo apt-get install build-essential swig !curl https://raw.githubusercontent.com/automl/auto-sklearn/master/requirements.txt | xargs -n 1 -L 1 pip install !pip install auto-sklearn |
https://automl.github.io/auto-sklearn/master/
由于此处描述了Auto-sklearn 2.0的导入方法,因此请执行以下操作。
查看Github(https://github.com/automl/auto-sklearn)的内容,我找不到Auto-sklearn 2.0的Regressor。我期待将来的更新。
1 2 3 4 5 6 | import sklearn.model_selection import sklearn.datasets import sklearn.metrics from sklearn import preprocessing from autosklearn.experimental.askl2 import AutoSklearn2Classifier |
数据加载
Auto-sklearn2.0仅具有分类器,因此我提到了官方示例(https://automl.github.io/auto-sklearn/master/examples/example_feature_types.html)。
数据来自此处的任务,以确定您的收入是否超过一定金额。
1 2 3 4 5 6 7 8 9 10 11 | X, y = sklearn.datasets.fetch_openml(data_id=179, return_X_y=True) # y needs to be encoded, as fetch openml doesn't download a float y = preprocessing.LabelEncoder().fit_transform(y) X_train, X_test, y_train, y_test = \ sklearn.model_selection.train_test_split(X, y, random_state=1) # Create feature type list from openml.org indicator and run autosklearn data = sklearn.datasets.fetch_openml(data_id=179, as_frame=True) feat_type = ['Categorical' if x.name == 'category' else 'Numerical' for x in data['data'].dtypes] |
执行Auto-sklearn 2.0
由于这是一次试用,因此我将时间设置为5分钟并执行如下。
1 2 3 4 5 6 7 8 9 10 | %%time cls = AutoSklearn2Classifier( time_left_for_this_task=300, seed=1, metric=autosklearn.metrics.log_loss ) cls.fit(X_train, y_train, feat_type=feat_type) #CPU times: user 16.8 s, sys: 557 ms, total: 17.3 s #Wall time: 4min 56s |
但是,如果按原样执行,则以下警告将大量显示。
1 2 | /usr/local/lib/python3.6/dist-packages/sklearn/base.py:197: FutureWarning: From version 0.24, get_params will raise an AttributeError if a parameter cannot be retrieved as an instance attribute. Previously it would return None. FutureWarning) |
我不认为这是一个问题,但是如果您很好奇,可以使用
1 2 | import warnings warnings.simplefilter('ignore') |
当通过Accuracy和AUC计算预测精度时,可获得以下结果。
1 2 3 4 5 | predictions = cls.predict(X_test) print("Accuracy score ", sklearn.metrics.accuracy_score(y_test, predictions)) print("AUC ", sklearn.metrics.roc_auc_score(y_test, predictions)) #Accuracy score 0.8585701416755385 #AUC 0.7749035627902573 |
运行Auto-sklearn 1.0
如果要使用传统的Auto-sklearn,请使用
1 2 3 4 5 6 7 8 9 10 11 | %%time cls = autosklearn.classification.AutoSklearnClassifier( time_left_for_this_task=300, per_run_time_limit=30, seed=1, metric=autosklearn.metrics.log_loss ) cls.fit(X_train, y_train, feat_type=feat_type) #CPU times: user 5.77 s, sys: 1.08 s, total: 6.86 s #Wall time: 4min 55s |
1 2 3 4 5 | predictions = cls.predict(X_test) print("Accuracy score ", sklearn.metrics.accuracy_score(y_test, predictions)) print("AUC ", sklearn.metrics.roc_auc_score(y_test, predictions)) #Accuracy score 0.8490705101957252 #AUC 0.7580882714036629 |
这一次,在构建模型时未执行交叉验证,因此我们必须进行一些仔细的比较,但是如果仅比较数值,则Auto-sklearn 2.0会提供更好的结果。
运行自动胶水
有关Auto-Gluon的更多信息,请参见另一篇文章(https://qiita.com/dyamaguc/items/dded739f35e59a6491c8)。
在自动胶粘剂的情况下,由于无法为输入数据指定
除此之外,基本上是相同的。
1 2 3 4 5 6 7 8 9 10 11 | X, y = sklearn.datasets.fetch_openml(data_id=179, return_X_y=True) # y needs to be encoded, as fetch openml doesn't download a float y = preprocessing.LabelEncoder().fit_transform(y) X_train, X_test, y_train, y_test = \ sklearn.model_selection.train_test_split(X, y, random_state=1) X_train_ = pd.DataFrame( X_train ) y_train_ = pd.DataFrame(y_train, columns=['class']) train_data = pd.concat( [X_train_, y_train_ ], axis=1) |
作为设置执行以使用自动堆叠。
1 2 3 4 5 6 7 8 9 10 11 12 13 | %%time long_time = 5*60 # for quick demonstration only, you should set this to longest time you are willing to wait dir = 'agModels-predictClass-autostack' # specifies folder where to store trained models predictor = task.fit( train_data=train_data, label='class', auto_stack=True, output_directory = dir, eval_metric='log_loss', time_limits=long_time) #CPU times: user 9min 21s, sys: 11.3 s, total: 9min 32s #Wall time: 5min 15s |
1 2 3 4 5 6 7 | import sklearn.metrics X_test_ = pd.DataFrame( X_test ) predictions = predictor.predict(X_test_) print("Accuracy score ", sklearn.metrics.accuracy_score(y_test, predictions)) print("AUC ", sklearn.metrics.roc_auc_score(y_test, predictions)) #Accuracy score 0.8609450495454918 #AUC 0.780458426444995 |
使用此数据集和设置,Auto-Gluon可获得最佳结果。
概要
这次我接触了Auto-sklearn 2.0,但是我认为这种AutoML确实很容易并且给出了合理的结果,所以很方便。