Python社区  »  机器学习算法

机器学习or深度学习,都不可错过的开源库AutoGluon

生信技能树 • 7 月前 • 390 次点击  



咱们《生信技能树》在去年疫情期间一共尝试培养了一百多位线上学徒,主要是跟我学习肿瘤ngs数据分析,但是成功出师的不到五个。可能是因为没有门槛,不收费,仅仅是提供海量生物信息学资料吧,反而劝退了不少。

有意思的是福建医科大学的一位小伙伴并没有走我的ngs之路,反而去琢磨机器学习人工智能啦,也开始投稿!

下面是福建医科大学小伙伴投稿

为了减少人工干预,实现机器学习的自动化,越来越多的人开始关注Automated Machine Learning这一新兴领域。不久前,亚马逊发布了开源代码库AutoGluon,这是一个新的开源库,开发人员可以使用该库构建包含图像、文本或表格数据集的机器学习应用程序。

使用AutoGluon,只需编写几行代码就可以利用深度学习的力量来构建应用程序。“AutoGluon推动机器学习的普适化,并将深度学习的好处带给所有开发人员,” 亚马逊AWS应用科学家Jonas Mueller说。

写在前面

因为本人实在是懒,而且有关于机器学习和深度学习的基础知识不是很牢固,但又想着借着人工智能高大上的旗号整出一些好玩的模型,这边听说有一个模块能简简单单的就构建出深度学习模型,而且调参出的效果还比较人工的好,这。。。碍于网上没啥教程,那我能怎么办,自己边看边写喽。参考链接:github源码地址:https://github.com/awslabs/autogluon 官网教程:https://auto.gluon.ai/stable/index.html

安装

目前该模块只适用于Linux与Mac系统,windows模块正在开发当中。各位想尝鲜的话,可以在windows装wsl,然后利用下面的语句安装模块

python3 -m pip install -U pip
python3 -m pip install -U setuptools wheel
python3 -m pip install autogluon
# cpu 版
python3 -m pip install -U "mxnet<2.0.0"
# gpu版
# Here we assume CUDA 10.1 is installed.  You should change the number
# according to your own CUDA version (e.g. mxnet_cu100 for CUDA 10.0).
python3 -m pip install -U "mxnet_cu101<2.0.0"

库功能

其实这个库要完成的任务分成了几个教程,分别是表格预测图像预测目标检测文本预测等,这篇先完成第一个教程表格预测

表格预测(Tabular Prediction)

定义:根据个人的理解,这个表格预测应该是属于输入数据是表格,然后根据这些信息再做相关的机器学习任务。优点:无需数据清洗、特征工程、超参优化、模型选择

示例1

目的:预测一个人的收入是否超出5万美元

导入数据,构建对象

# import data 
import pandas 
import numpy 
from autogluon.tabular import TabularDataset, TabularPredictor
train_data = TabularDataset('https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv')
subsample_size = 500  # subsample subset of data for faster demo, try setting this to much larger values
train_data = train_data.sample(n=subsample_size, random_state=0)
train_data.head()

这边构造的AutoGluon Dataset对象,也就是TabularDataset是等同于pandas的data.frame的,所以可以用pandas.dataframe的属性来使用它,比如上面说的train_data.head()。同样的,如果你有自己的数据的话,可以按照下面这张图片提示构造对象反正万事不决时就查帮助文档

label = 'class'
pd.value_counts(train_data[label]) # 或train_data[label].value_counts() 
# 上面两种方式视个人习惯
# 看下标签有哪些,以及对应标签的个数
在这里插入图片描述

训练模型

save_path = 'agModels-predictClass'  


    
# specifies folder to store trained models
predictor = TabularPredictor(label=label, path=save_path).fit(train_data)

save_path用来指定训练模型的文件夹 然后直接TabularPredictor进行模型构建上面这张图很好玩哈,就是大概说明了为什么推断是二分类任务,如果不准的话如何修改,还有就是我们现在的可用内存是多少然后。。。哈哈哈,笔记本太垃圾了,还可以自动根据内存调整参数

加载测试集并验证

# load test set 
test_data = TabularDataset('https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv')
y_test = test_data[label]  # values to predict
test_data_nolab = test_data.drop(columns=[label])  # delete label column to prove we're not cheating
test_data_nolab.head()
predictor = TabularPredictor.load(save_path)  # unnecessary, just demonstrates how to load previously-trained predictor from file


# model evalute 
y_pred = predictor.predict(test_data_nolab)
print("Predictions:  \n", y_pred)
perf = predictor.evaluate_predictions(y_true=y_test, y_pred=y_pred, auxiliary_metrics=True)

大概就展示下测试集的数据概况 然后就是结果了,都是一些基本的模型评估指标,没有想到的是同样的数据,同样的代码训练出来的结果竟然会比官网的好那么一点点,可能是因为不同的运行环境导致的吧,但差别不大,也就差了4个百分点

展示所有预训练模型在测试集的效能

predictor.leaderboard(test_data, silent=True)

由分类精度得知,predictor.predict(test_data_nolab)这个时候用的是WeighEnsemble_L2模型 到目前为止,训练第一个简单模型就完成啦,但是我想看这个模型的具体参数呢,这个就需要后面进行探索了,我也会发布后续的教程。第一次是教程,如有不合理的地方,请指出。

订正

关于predict.显示的模型一般是最优模型,而最优模型可由predictor.get_model_best()获得

训练模型(加入验证集)

# 加载训练集
from autogluon.tabular import TabularDataset, TabularPredictor
import numpy as np
train_data = TabularDataset('https://autogluon.s3.amazonaws.com/datasets/Inc/train.csv')
subsample_size = 500  # subsample subset of data for faster demo, try setting this to much larger values
train_data = train_data.sample(n=subsample_size, random_state=0)
print(train_data.head())

# 加载验证集和测试集
new_data = TabularDataset('https://autogluon.s3.amazonaws.com/datasets/Inc/test.csv')
test_data = new_data[5000:].copy()  # this should be separate data in your applications
y_test = test_data[label]
test_data_nolabel = test_data.drop(columns=[label])  # delete label column
val_data = new_data[:5000].copy()

# 定义评估指标,accuracy是默认的
metric = 'accuracy' # we specify eval-metric just for demo (unnecessary as it's the default)

选定特定分类器

predictor.predict(test_data, model='LightGBM')

如何获取指定分类器的参数

all_models = predictor.get_model_names()
model_to_use = all_models[i]
specific_model = predictor._trainer.load_model(model_to_use)

# Objects defined below are dicts of various information (not printed here as they are quite large):
model_info = specific_model.get_info()
predictor_information = predictor.info()

这边我看了model_info,里面就是这个应该就是模型的具体信息了,着实有点多,让人眼花缭乱。

额外部分

输出预测概率

pred_probs = predictor.predict_proba(test_data_nolab)
pred_probs.head(5)
在这里插入图片描述

在测试集上定义其他输出标准

predictor.leaderboard(test_data, extra_metrics=['accuracy''balanced_accuracy''log_loss'], silent=True)

可以选择的输出有'['accuracy', 'acc', 'balanced_accuracy', 'mcc', 'roc_auc', 'roc_auc_ovo_macro', 'average_precision', 'log_loss', 'nll', 'pac_score', 'precision', 'precision_macro', 'precision_micro', 'precision_samples', 'precision_weighted', 'recall', 'recall_macro', 'recall_micro', 'recall_samples', 'recall_weighted', 'f1', 'f1_macro', 'f1_micro', 'f1_samples', 'f1_weighted', 'r2', 'mean_squared_error', 'mse', 'root_mean_squared_error', 'rmse', 'mean_absolute_error', 'mae', 'median_absolute_error', 'spearmanr', 'pearsonr', 'pinball_loss', 'pinball', 'soft_log_loss']',兄弟,眼睛花不花,哈哈哈。

拟合过程中发生了什么

results = predictor.fit_summary()

这张图的score_val代表的是模型在验证集的性能表现,而pred_time_则表示在集上预测所花的时间,还有就是fit_*拟合的时间

更高的输出精度(参数设置)

增加训练时间的一般都会增加输出精度

  • time_limit : 模型训练的最长等待时间,通常不设置
  • eval_metric: 评估指标,AUC还是精度等
  • presets:默认为'medium_quality_faster_train',损失了精度但是速度比较快。要是设置为“best_quality”,则会做bagging和stacking以提高性能
  • Tuning_data: 这个作为验证集数据的参数,官网建议如果没有特别的理由时不加,让机器自己从训练集中分割出一小部分验证集,这边值得一提的是机器还能自己根据数据使用分层抽样等,可以说是非常人性化了。
  • holdout_frac:这个参数指定从训练集出分割出多少比例的验证集
  • num_bag_folds = 5-10,这个应该是类似k倍交叉验证,会增加训练时间
  • num_stack_levels = 1-3,stacking 水平
  • num_bag_sets:减少方差,但是增加训练时间
time_limit = 60  # for quick demonstration only, you should set this to longest time you are willing to wait (in seconds)
metric = 'roc_auc'  # specify your evaluation metric here
predictor = TabularPredictor(label, eval_metric=metric).fit(train_data, time_limit=time_limit, presets='best_quality')
predictor.leaderboard(test_data, silent=True)

定义搜索空间

import


    
 autogluon.core as ag

nn_options = {  # specifies non-default hyperparameter values for neural network models
    'num_epochs'10,  # number of training epochs (controls training time of NN models)
    'learning_rate': ag.space.Real(1e-41e-2, default=5e-4, log=True),  # learning rate used in training (real-valued hyperparameter searched on log-scale)
    'activation': ag.space.Categorical('relu''softrelu''tanh'),  # activation function used in NN (categorical hyperparameter, default = first entry)
    'layers': ag.space.Categorical([100], [1000], [200100], [300200100]),  # each choice for categorical hyperparameter 'layers' corresponds to list of sizes for each NN layer to use
    'dropout_prob': ag.space.Real(0.00.5, default=0.1),  # dropout probability (real-valued hyperparameter)
}

gbm_options = {  # specifies non-default hyperparameter values for lightGBM gradient boosted trees
    'num_boost_round'100,  # number of boosting rounds (controls training time of GBM models)
    'num_leaves': ag.space.Int(lower=26, upper=66, default=36),  # number of leaves in trees (integer hyperparameter)
}

hyperparameters = {  # hyperparameters of each model type
                   'GBM': gbm_options,
                   'NN': nn_options,  NOTE: comment this line out if you get errors on Mac OSX
                  }  # When these keys are missing from hyperparameters dict, no models of that type are trained

time_limit = 2*60  # train various models for ~2 min
num_trials = 5  # try at most 5 different hyperparameter configurations for each type of model
search_strategy = 'auto'  # to tune hyperparameters using Bayesian optimization routine with a local scheduler

hyperparameter_tune_kwargs = {  # HPO is not performed unless hyperparameter_tune_kwargs is specified
    'num_trials': num_trials,
    'scheduler' : 'local',
    'searcher': search_strategy,
}

predictor = TabularPredictor(label=label, eval_metric=metric).fit(
    train_data, tuning_data=val_data, time_limit=time_limit,
    hyperparameters=hyperparameters, hyperparameter_tune_kwargs=hyperparameter_tune_kwargs,
)

这部分就是根据自己的需求个性化定义一下搜索空间了,然后由于定义了搜索空间,所以这模型就只有nn和GBM了

训练结果

y_pred = predictor.predict(test_data_nolabel)
print("Predictions:  ", list(y_pred)[:5])
perf = predictor.evaluate(test_data, auxiliary_metrics=False)
results = predictor.fit_summary()

可以看到准确率只有0.29,下面是其他模型的准确率

模型的解释性(特征的重要性)

芜湖,特征的重要性来喽。

predictor.feature_importance(test_data)

这样如果你需要进行特征工程或缩小特征的话,也可以运行这部分代码哦。我是一般在深度学习不过滤特征的,机器学习过程会过滤特征。

减少时间操作

# 模型启用
predictor.persist_models()

num_test = 20
preds = np.array(['']*num_test, dtype='object')
for i in range(num_test):
    datapoint = test_data_nolabel.iloc[[i]]
    pred_numpy = predictor.predict(datapoint, as_pandas=False)
    preds[i] = pred_numpy[0]

perf = predictor.evaluate_predictions(y_test[:num_test], preds, auxiliary_metrics=True)
print("Predictions: ", preds)

# 释放内存
predictor.unpersist_models()  # free memory by clearing models, future predict() calls will load models from disk

默认情况下,autogluon一次将模型加载到内存中,只有在预测所需时才能成为内存。这种策略对于stacking/bagging是强大的,但导致预测时间较慢。如果计划反复进行预测(例如,在一次的新数据点而不是一个大型测试数据集上),可以首先指定推理所需的所有模型应加载到内存中,如上所示。当然可以指定特定的分类器或全部的分类器模型 我是用不上这个功能了,感觉

删除模型中部分分类器

additional_ensembles = predictor.fit_weighted_ensemble(expand_pareto_frontier=True)
print("Alternative ensembles you can use for prediction:", additional_ensembles)

predictor.leaderboard(only_pareto_frontier=True, silent=True)
model_for_prediction = additional_ensembles[0]
predictions = predictor.predict(test_data, model=model_for_prediction)
predictor.delete_models(models_to_delete=additional_ensembles, dry_run=False)  # delete these extra models so they don't affect rest of tutorial

将交叉验证的模型整合到一块去

refit_model_map = predictor.refit_full()
print("Name of each refit-full model corresponding to a previous bagged ensemble:")
print(refit_model_map)
predictor.leaderboard(test_data, silent=True)

这边说这么做是可以大大降低memory/latency requirements (but may also reduce accuracy),因为最后整合了所有交叉模型,也就是利用了所有的数据,后面也就没有模型的验证评估了(原先的验证集是从训练集分出的一小块数据)

参数部分

  • hyperparameters: 选择'very_light',“‘light’”,“toy”
  • time_limit:选择比较短的时间
  • excluded_model_types:去掉某些已知的训练比较慢的模型
  • presets :跟上面精度提高的类似,不过是选用了不同的参数以达到不同的效果
presets = ['good_quality_faster_inference_only_refit''optimize_for_deployment']
predictor_light = TabularPredictor(label=label, eval_metric=metric).fit(train_data, presets=presets, time_limit=30)
excluded_model_types = ['KNN''NN''custom']
predictor_light = TabularPredictor(label=label, eval_metric=metric).fit(train_data, excluded_model_types=excluded_model_types, time_limit=30,
presets=presets,hyperparameters='very_light')

碰到内存不够怎么办

  • 设置num_bag_sets = 1(也可以尝试大于1)。
  • 设定excluded_model_types = ['KNN', 'XT' ,'RF'](或这些模型的某些子集)。
  • 尝试不同的presets。
  • 设置HyperParameters

硬盘空间不够怎么办

  • 删除之前保存过模型的文件夹
  • 调用predictor.save_space()来删除fit生成的中间文件
  • 只保留最优模型,调用语句predictor.delete_models(models_to_keep='best', dry_run=False)
  • 把optimize_for_deployment加到presets 中当然,降低磁盘空间的同时,也会使模型的搭建倾向于准确率略小,实际上这是一个时间空间与准确率的权衡

写在后面

大概通过这两篇的写作,我好像对这个模块有一个大致的了解了,接下来看下它对于kaggle竞赛项目的指导作用后,我就要转战第二部分图像预测部分了,希望我的小破电脑能hold住

写在前面

这篇接上一篇教程2,终于要看到autogluon在竞赛中的应用了。

安装必要的模块和文件

1.模块

pip install kaggle 

2.文件

下载API文件,通过在kaggle个人账号,点击头像然后会得到一个kaggle.json文件,如果你是用kaggle cli 工具时,且

你的电脑是Linux,OSX或其他基于UNIX系统时,把这个文件放置在~/.kaggle/kaggle.json ,windows则放置在C:\Users.kaggle\kaggle.json。

下载数据

可以通过命令行下载数据

kaggle competitions download -c [COMPETITION]
kaggle competitions download -c ieee-fraud-detection

这边的[COMPETITION]替换为项目名,我这边将其改成了ieee-fraud-detection,但是下载过程报了403 error,也就是说没有kaggle服务器理解了我的这次下载请求,但由于我没有权限访问而拒绝了。查看了下我的json文件和放置位置,正常,折腾了一下下没有解决,算了改为手动下载吧。原文件信息如下(五个子文件):

在这里插入图片描述

读取数据

在做实践中,改下自己的目录directory即可

import pandas as pd
import numpy as np
from autogluon.tabular import TabularPredictor

directory = '~/github/ieee-fraud-detection/'  # directory where you have downloaded the data CSV files from the competition
label = 'isFraud'  # name of target variable to predict in this competition
eval_metric = 'roc_auc'  # Optional: specify that competition evaluation metric is AUC
save_path = directory + 'AutoGluonModels/'  # where to store trained models

train_identity = pd.read_csv(directory+'train_identity.csv')
train_transaction = pd.read_csv(directory+'train_transaction.csv')

因为训练集包含多个csv文件,所以我们需要将其合并成一个大的csv文件以便后面的AutoGluon语句调用,这边官网也给出了代码。

train_data = pd.merge(train_transaction, train_identity, on='TransactionID', how='left')

简单的合并命令,第一次学到类似的命令还是从成哥的数据库课程学到的,on代表根据那个列名称进行合并,how代表连接方式,表示的是主要以左边还是以右边的数据库为准,或者二者兼容的,具体可查阅命令详情。

训练模型

这边其实跟之前的教程变化不大,但是就是time_limit设置的大了点

predictor = TabularPredictor(label=label, eval_metric=eval_metric, path=save_path, verbosity=3).fit(
    train_data, presets='best_quality', time_limit=3600
)

results = predictor.fit_summary()

训练过程

训练一万轮,但是大约在700多就迭代停止了,因为实在是太慢了,我都看了n个冰冰的视频了,程序还没跑完我就手动停止了,哈哈哈。快速训练

subsample_size = 500  


    
# subsample subset of data for faster demo, try setting this to much larger values
train_data = train_data.sample(n=subsample_size, random_state=0)
print(train_data.head())
predictor = TabularPredictor(label=label, eval_metric=eval_metric, path=save_path, verbosity=3).fit(
    train_data, presets='best_quality'
)

评估模型效果

测试集

测试集同样做与训练集一致的操作,因为训练集的列名和测试集的列名有着不一样,是id-10与id_10的区别,所以列名做了个修改

test_identity = pd.read_csv(directory+'test_identity.csv')
test_transaction = pd.read_csv(directory+'test_transaction.csv')
test_data = pd.merge(test_transaction, test_identity, on='TransactionID', how='left')  # same join applied to training files
a = [i.replace("-","_"for i in test_data.columns]
subsample_size = 500  # subsample subset of data for faster demo, try setting this to much larger values
test_data = test_data.sample(n=subsample_size, random_state=0)


y_predproba = predictor.predict_proba(test_data)
y_predproba.head(5)  # some example predicted fraud-probabilities
在这里插入图片描述

预测的正类是什么

predictor.positive_class
在这里插入图片描述

预测的分类时

predictor.class_labels  # classes in this list correspond to columns of predict_proba() output
在这里插入图片描述

预测分类的概率,且指指定正类

y_predproba = predictor.predict_proba(test_data, as_multiclass=False)

准备提交材料

submission = pd.read_csv(directory+'sample_submission.csv')
submission['isFraud'] = y_predproba
submission.head()
submission.to_csv(directory+'my_submission.csv', index=False)

提交结果

kaggle competitions submit -c ieee-fraud-detection -f sample_submission.csv -m "my first submission"

写在最后

大概关于在kaggle项目中autoGluon的应用就是大致如此了。后面就是AutoGluon针对图形与物体检测部分了,敬请期待。

后面的训练

本来想要用全部样本训练的,然后只训练一个分类器,但是没办法还是显示内存不够

nn_options = {  # specifies non-default hyperparameter values for neural network models
    'num_epochs': 10
}
hyperparameter_tune_kwargs = { 
    'num_trials': num_trials,
    'scheduler' : 'local',
    'searcher': search_strategy,
}
num_trials = 5  # try at most 5 different hyperparameter configurations for each type of model
search_strategy = 'auto'  
hyperparameters = { 
                   'NN': nn_options
                  } 
predictor = TabularPredictor(label=label, eval_metric=eval_metric, path=save_path, verbosity=3).fit(
    train_data, presets='good_quality_faster_inference_only_refit',
    hyperparameters=hyperparameters, hyperparameter_tune_kwargs=hyperparameter_tune_kwargs
)

参考链接:

https://www.amazon.science/amazons-autogluon-helps-developers-get-up-and-running-with-state-of-the-art-deep-learning-models-with-just-a-few-lines-of-code?

关于Autogluon简明使用教程和官方安装指南等更多信息,请见官网:

https://autogluon.mxnet.io/

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/115971
 
390 次点击  
分享到微博