由于我每天都在学习,所以我是python和机器学习的新手。我想清除一些东西,这一次是关于标签的。我有2004个课程要分类。我正在从文件名手动构建标签。像下面一样
import numpy as np
path = "D:/data/image/1/1/asas1231231231.jpg"
label = np.zeros(2004)
# The line to read the 4th index from path and converting it into integer and then pass it on to the array to have the label
label[int(path.rsplit('/')[4]) - 1 ] = 1
# Which gives me
print(label[0])
1.0
现在我的文件名到2004年为止,每次读取图像时,我也在标签中添加标签,然后将其添加到列表中,例如
training_labels = []
training_labels.append(label)
但是在对标签进行了一些研究之后,我才知道了np_utils.to_categorical
np_utils.to_categorical(1,2004)
给我
array([[1., 0., 0., ..., 0., 0., 0.]])
我的问题是两者之间有什么区别? 谁能解释一下。 我还为我的那个打印了形状
(2004年)
有了np_utils,我得到了
(1,2004)
答案 0 :(得分:0)
我认为“热门标签”的真正含义有些混乱。我假设您是指“一种热编码”,通常用于对一种热编码特征(see also here)中的分类变量进行编码。例如,如果您有一个男人/女人变量,则可以用一个男人的0和一个女人的1来表示该变量。这也许是回归的观点,但是对于您的训练标签,它的工作方式基本上相同。在您的代码中,看起来您正在使用“原始”数字作为标签。这里的固有问题是(在分类中)通常这些类彼此不相关。假设您的标签是红色,绿色和黄色。在您的方法中,您会将它们映射到1,2和3类。该方法的问题之一是排序没有意义,例如为什么黄色(3)高于红色(1)?为什么红色(1)和绿色(2)之间的距离比红色(1)和黄色(3)之间的距离小?
为避免此类问题,您可以使用一键向量对类进行编码。看一下输出:
from keras.utils import np_utils
np_utils.to_categorical([0, 1,2], 2004)
>>array([[1., 0., 0., ..., 0., 0., 0.],
[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 1., ..., 0., 0., 0.]])
您将看到to_categorical函数实际上是从0开始的类。形状是(3,2004),因为我输入了3个不同的类([0,1,2])并提供了第二个参数 2004 的类的数量。这些长度为2004的向量分别表示单个类。根据向量中1的位置,定义类。请注意,每个向量对于一个类都是唯一的。
最后,看看scikit-learn documentation中的一些示例。
话虽如此,想一想如果您真的想将年份用作类(分类)或数字特征(回归),可能会很有用。这我不能告诉你。
HTH