离散属性是什么?取值是有限个类别或整数的属性
离散属性(Discrete Attribute),在很多场合也叫类别属性(Categorical Attribute),是指取值只有有限个或可数个离散值的属性。比如性别、血型、城市、商品品类、学历等级、星期几,以及家庭成员数这样的计数。与之相对的是连续属性,比如身高、温度、价格,可以在一个范围内取任意的值。
离散属性的几种类型
无序的类别属性,也叫标称属性:各个取值之间没有大小和先后,比如颜色有红、绿、蓝,血型有 A、B、AB、O。只能判断两个值是否相同。有序属性,也叫序数属性:取值之间有明确的顺序,但相邻取值之间的差距不一定相等,比如学历分为小学、初中、高中、大学,满意度分为不满意、一般、满意,衣服尺码分为小、中、大。可以比较大小,但不宜做加减。离散的数值属性:比如购买次数、孩子的数量,取值是整数,可以进行算术运算。周志华《机器学习》中还区分了“有序属性”和“无序属性”:前者可以直接在属性值上计算距离,比如身高的 1.5 米与 1.7 米更接近;后者需要专门的距离度量,比如 VDM(值差异度量),根据不同取值在各类别中出现的分布是否相似来定义它们之间的距离。
不同的模型如何处理离散属性
决策树、朴素贝叶斯等模型可以比较自然地处理离散属性:决策树可以按照属性的取值进行划分,朴素贝叶斯可以直接统计每个取值在各类别中出现的频率。CatBoost、LightGBM 等梯度提升工具也提供了对类别特征的原生支持。而线性模型、支持向量机、K 近邻和神经网络等需要数值输入的模型,通常要先对离散属性进行编码。
常用的编码方法
独热编码:为每个可能的取值建立一列,样本取这个值时为 1,否则为 0。它不会引入虚假的大小关系,是处理无序类别最常用的方法,缺点是取值很多时会产生大量的列。序号编码:用整数 0、1、2 等表示各个取值,适合有序属性,比如把学历编码为 1 到 4;如果用于无序属性,会让模型误以为取值之间有大小关系。目标编码:用每个取值对应的目标变量平均值来代替它,适合取值非常多的属性,比如城市、商品编号,但必须在交叉验证内部计算并加以平滑,否则容易造成信息泄露和过拟合。频数编码:用每个取值出现的次数或频率来代替它。嵌入:在深度学习中,为每个取值学习一个低维的向量,让模型自己发现取值之间的相似性,广泛用于推荐系统中的用户编号、商品编号等高基数特征。
连续属性的离散化
有时也会反过来,把连续属性转换为离散属性,这叫离散化或分箱。比如把年龄分成少年、青年、中年、老年,把收入分成若干档。离散化的方法有等宽分箱、等频分箱,以及根据目标变量寻找最优切分点的有监督方法,C4.5 决策树就使用二分法把连续属性离散化。离散化可以让模型更稳健、更容易解释,也能捕捉非线性的关系,在信用评分卡等领域很常用,但会损失一部分信息。