写在前面
这篇接上一篇教程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的应用就是大致如此了,感觉跟我想的不大一样呀,我以为的是比较高大上,怎么一到我这儿就这么平民的感觉了。唉,果然还是太菜了么。
后面的训练
本来想要用全部样本训练的,然后只训练一个分类器,但是没办法还是显示内存不够
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
)