FastAI TabularLearner中prob与class输出相同张量的问题及procs疑问
FastAI泰坦尼克Tabular Learner问题解答
问题背景
本人是FastAI新手,刚完成FastAI第一节课,正在使用Kaggle的“Machine Learning From Disaster”泰坦尼克数据集实现Tabular Learner,代码如下:
from fastcore.all import * from fastai.tabular.all import * df = pd.read_csv('/kaggle/input/titanic/train.csv') # 保留相关变量 df = df[['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']] # 分类变量与连续变量定义 cat_names = ['Sex', 'Pclass'] cont_names = ['Age', 'SibSp', 'Parch', 'Fare'] # 不清楚作用,但示例代码中存在且似乎必要 procs = [Categorify, FillMissing, Normalize] dls = TabularDataLoaders.from_df(df, procs=procs, cat_names=cat_names, cont_names=cont_names, y_names="Survived", bs=64) learner = tabular_learner(dls) learner.fit(50) # 预测样本:输入前去掉目标列 sample = df.iloc[0] sample = sample.drop(['Survived']) row, clas, prob = learner.predict(sample)
打印row的结果:
Sex Pclass Age_na Age SibSp Parch Fare Survived 0 1.0 3.0 1.0 -1.983648 0.401285 0.751157 -0.32982 0.711407
但打印clas和prob时得到相同张量,而clas本应返回0或1的分类索引:
clas: tensor([0.7114]) prob: tensor([0.7114])
问题
- 为何会出现这种情况?
- procs是什么,为何是必要的?
问题解答
1. clas与prob返回相同值的原因
这是因为未明确指定任务为二分类任务。默认状态下,tabular_learner会把Survived列的0/1数值当作回归任务处理,而非分类任务。此时模型输出的是连续值,clas和prob都会返回这个连续预测值,而非分类索引和对应概率。
解决方法:初始化tabular_learner时指定分类相关的指标或损失函数,让FastAI识别这是分类任务。例如:
# 指定准确率指标,自动触发分类模式 learner = tabular_learner(dls, metrics=accuracy) # 或者明确指定分类损失函数 learner = tabular_learner(dls, loss_func=CrossEntropyLossFlat(), metrics=accuracy)
修改后训练,clas会返回0或1的分类索引,prob会返回对应两个类别的概率数组(如tensor([0.2886, 0.7114]),分别对应未存活和存活的概率)。
2. procs的作用与必要性
procs是FastAI中用于表格数据预处理的操作集合,每个元素是一个预处理类,负责将原始表格数据转换为模型可接收的格式:
- Categorify:将字符串或离散分类变量(如
Sex、Pclass)转换为数字编码,同时建立类别与索引的映射,让模型能处理非数值型分类特征。 - FillMissing:自动填充连续变量中的缺失值(如泰坦尼克数据集的
Age列存在大量缺失),并且新增[列名]_na列(如Age_na)标记该位置是否为填充的缺失值,给模型补充额外特征信息。 - Normalize:对连续变量做标准化处理(减去均值、除以标准差),让所有连续特征处于相近的数值范围,避免数值较大的特征主导模型训练,提升模型收敛速度与效果。
这些预处理是必须的:原始表格数据通常存在非数值分类、缺失值、数值范围差异大等问题,直接输入模型会导致训练失败或效果极差,procs自动化完成这些标准化流程,符合深度学习模型的输入要求。
内容的提问来源于stack exchange,提问作者Shrey Joshi
相关产品推荐
相关产品推荐

