onehot编码的python详细实现以及使用sklearn中的TfidfVectorizer实现one-hot编码

def onehot(label):
    #label=[1,2,3,3]
    #留下各异的标签
    ulabel=np.unique(label)
    #ulabel=[1,2,3]
    #查看一下各异标签的数量。num_label=3
    num_label=ulabel.shape[0]
    #查看训练数据的个数n=4。
    n=label.shape[0]
    #初始化最终的one-hot的label。4*3列的最终向量是我们想要的。
    """
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])
       
       """
    flabel=np.zeros((n,num_label))
    #双重循环判段哪一位应该由0改成1。
    for i in range(n):
    	#判断第i个训练数据
        for j in range(num_label):
        	#根据i数据对应的ulabel下标来判断哪一位由0改成1。
            if(label[i]==ulabel[j]):
                flabel[i][j]=1
    return flabel
    
    """
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.],
       [0., 0., 1.]])
       
       """

测试如下:

x=np.array([1,2,3,3])
onehot(x)

结果如下:
在这里插入图片描述


看懂了之后,把上面的注释去掉,如下:

def onehot(label):
    #先看一下一共有几个标签
    ulabel=np.unique(label)
    num_label=ulabel.shape[0]
    n=label.shape[0]
    #初始化最终的one-hot的label.
    flabel=np.zeros((n,num_label))
    for i in range(n):
        for j in range(num_label):
            if(label[i]==ulabel[j]):
                flabel[i][j]=1
    return flabel

注意:

1.输入的标签序列label需要是numpy类型。
2.对于标签label是字符串也同样适用,无需修改上述代码。

#标签是字符串
a=["sad","happy","angry","happy"]
a=np.array(a)
onehot(a)

在这里插入图片描述

TfidfVectorizer

这个东西恰巧是用于将文本向量化的,由于默认会归一化,发现对标签(只有一个单词或者数字的时候)使用的时候其恰好是one-hot!!!!!想要详细了解的可以参考一个例子来使用sklearn中的TfidfVectorizer。如果只想使用one-hot功能,复制下述代码可以快速使用。

from sklearn.feature_extraction.text import TfidfVectorizer
#标签是字符串
a=["sad","happy","angry","happy"]
atv=TfidfVectorizer()
atv_fit=atv.fit_transform(a)

#下面这行代码是打印标签对应哪一列为1,这个TfidfVectorizer是按字母顺序排序的a-z。
print(atv.get_feature_names())
atv_fit.toarray()

结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43391414/article/details/113097989