社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

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

生信技能树 • 2 年前 • 1069 次点击  



咱们《生信技能树》在去年疫情期间一共尝试培养了一百多位线上学徒,主要是跟我学习肿瘤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
 
1069 次点击