分类 炼丹 下的文章

今天在使用sktime库的时候遇到了解码失败的问题:

from sktime.datasets import load_airline

报错类似于:

{
    "name": "UnicodeDecodeError",
    "message": "'gbk' codec can't decode byte 0xb8 in position 4507: illegal multibyte sequence",
    "stack": "---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
Cell In[19], line 1
----> 1 from sktime.datasets import load_airline

显然这是个编码问题,我第一时间检查了VSCode中的默认编码,确保是utf-8无误。

于是我怀疑大概率是程序编码出了问题,试了修改默认编码:

阅读剩余部分

DictVectorizer

考虑一个两列构成的输入数据:

citytemperature
New York70
San Francisco50

可以看到,这里第一列是一个类别特征,第二列是一个实数型特征。前面我们通过LabelBinarizer对标签进行one-hot编码,这里我们可以通过DictVectorizer实现对输入特征的自动one-hot编码:

阅读剩余部分

one-hot 编码

对于一个分类问题,假设有N种类别,不妨记作 [ "A类", "B类", "C类", "D类", ...],有时候我们可能倾向于直接用数字编号表示,表示成 [ 0, 1, 2, 3, ...]。但是问题是数字编号预设了一个不应该存在的限制:我们在任意两个类别之间强加了比较关系,比如"D类"(类别3) > "B类"(类别2)。一方面,这种类别之间的大小比较毫无意义。另一方面,这种顺序会导致距离测算错误。

假设某个情况是"D类"(类别3) 。在第一种情况下,它被我们错误的分类成了"A类"(类别0) ,这时候二者距离是 3 - 0 =3;在第二种情况下,它被我们错误分类成了"C类"(类别2) ,这时候二者的距离是 3 -2 = 1。这表明,在这种机制下,把"D类"归类成"C类"这种情况,会被当做优于把"D类"归类成"A类"这种情况,这会极大程度上误导机器学习朝着更优的方向进行。

一种解决办法是采用one-hot编码。拿上面的例子来说:

  • A 类被编码成 [1, 0, 0, 0, ...]
  • B 类被编码成 [0, 1, 0, 0, ...]
  • C 类被编码成 [0, 0, 1, 0, ...]
  • D 类被编码成 [0, 0, 0, 1, ...]
  • ...

由于这些向量都是单位正交向量,任意两个向量之间的余弦距离都是一样的,这表明类别归类错误程度("距离")在这种机制下可以被正确计算。

阅读剩余部分