用seaborn画tsne,并指定形状、形状颜色与标记内容

         最近在做深度模型的可视化操作,心血来潮,特此纪念!

        原创不易,转载请标明出处,谢谢!

1.如何用seaborn画tsne?

        这里拿sklearn中的digits数据集为例,类别数为2;

代码解释:

        1.主函数

        (1)加载digits数据集,类别数为2;

        (2) 得到数据集的特征与标签;

        (3)传入plot_tsne()函数;

        2.plot_tsne()函数:画tsne分布图,并将图像保存,"test/Set2.jpg"

        (1)初始化TSNE(),然后用PCA将特征降至2维;

        (2)将特征与标签存入表格df中;

        (3)调用seaborn的scatterplot()函数画图,色板条为“Set2”;

        (4)图像保存;

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt_sne
from sklearn import datasets
from sklearn.manifold import TSNE
import os


def plot_tsne(features, labels, epoch,fileNameDir = None):
    '''
    features:(N*m) N*m大小特征,其中N代表有N个数据,每个数据m维
    label:(N) 有N个标签
    '''
    print(features.shape,labels.shape)
    print(type(features),type(labels))
    print(np.any(np.isnan(features)),np.any(np.isinf(features)))
    features = np.nan_to_num(features)
    if not os.path.exists(fileNameDir):
        os.makedirs(fileNameDir)
    import pandas as pd
    tsne = TSNE(n_components=2, init='pca', random_state=0)
    import seaborn as sns

    #查看标签的种类有几个
    class_num = len(np.unique(labels))  # 要分类的种类个数  eg:[0, 1, 2, 3]这个就是为4
    
    try:
        tsne_features = tsne.fit_transform(features)  # 将特征使用PCA降维至2维
    except:
        tsne_features = tsne.fit_transform(features)
    
    #一个类似于表格的数据结构
    df = pd.DataFrame()
    df["y"] = labels
    df["comp1"] = tsne_features[:, 0]
    df["comp2"] = tsne_features[:, 1]
    
    # hue:根据y列上的数据种类,来生成不同的颜色;
    # style:根据y列上的数据种类,来生成不同的形状点;
    
    sns.scatterplot(x= df.comp1.tolist(), y= df.comp2.tolist(),hue=df.y.tolist(),style = df.y.tolist(),
                    palette=sns.color_palette("Set2",class_num),
                    data=df).set(title="T-SNE projection")
    
    plt_sne.savefig(os.path.join(fileNameDir,"%s.jpg") % str(epoch),format = "jpg")
    plt_sne.show()
    

if __name__ == '__main__':
    digits = datasets.load_digits(n_class=2)
    features, labels = digits.data, digits.target
    print(features.shape)
    print(labels.shape)

    plot_tsne(features, labels, "Set2", fileNameDir="test")

         运行上述代码,可得结果:

用seaborn画tsne,并指定形状、形状颜色与标记内容_第1张图片

  2.如何指定图像上的形状?

        如果我们想用其他形状表示标签0,1,该怎么做呢!

做法很简单,对上述代码中的sns.scatterplot函数,添加markers参数

sns.scatterplot(
        x= df.comp1.tolist(), 
        y= df.comp2.tolist(),
        hue=df.y.tolist(),style = df.y.tolist(),
        palette=sns.color_palette("Set2",class_num),
        markers= {1:"v",0:"^"},
        data=df).set(title="T-SNE projection")

        添加markers参数后,我们就可以用倒三角表示标签1,正三角表示标签0:

用seaborn画tsne,并指定形状、形状颜色与标记内容_第2张图片

3.如何指定形状颜色? 

         我们如果想对标签1,0的颜色进行随意指定,不想用色板条上提供的,做法如下!

(1)定义一个hex列表,用于存储表示颜色的十六进制;比如:

        hex = ["#ff8b8b", "#6e85b7"]

(2)将hex替换sns.plotscatter函数中的“Set2”参数即可;

sns.scatterplot(
        x= df.comp1.tolist(), 
        y= df.comp2.tolist(),
        hue=df.y.tolist(),
        style = df.y.tolist(),
        palette=sns.color_palette(hex,class_num),
        markers= {1:"v",0:"^"},
        data=df).set(title="T-SNE projection")

        这样,就能得到一个自定义颜色的分布图:

用seaborn画tsne,并指定形状、形状颜色与标记内容_第3张图片

 4.如何指定自定义的标记内容?

        我们不想让右上角的0,1标签作为图注,想将0,1标签替换为其他信息,比如:

                将标签0替换为“zero”,标签1替换为"one";

        关于这一块,本人在网上并没有找到通过直接修改函数参数从而达到目的的方案,如果有小伙伴搜到的,可以在评论区分享一下!

本人是这样做的:

        (1)先读取存取在df表格中的标签列,然后再定义一个数组,根据标签0,1进行值的转换:

        data_label = []
        for v in df.y.tolist():
            if v == 1:
                data_label.append("one")
            else:
                data_label.append("zero")

        (2)将自定义的data_label加入存储数据的df表格中的value列:

        df["value"] = data_label

        (3)更改sns.scatterplot()函数中的hue、style、markers参数:

        sns.scatterplot(
                x= df.comp1.tolist(), 
                y= df.comp2.tolist(),
                hue=df.value.tolist(),
                style = df.value.tolist(),
                palette=sns.color_palette(hex,class_num),
                markers= {"one":"v","zero":"^"},
                data=df).set(title="T-SNE projection")

         通过上述操作,就能达到指定自定义的标签内容的效果:

用seaborn画tsne,并指定形状、形状颜色与标记内容_第4张图片

         至此,标题中提到的问题已解答完毕,祝好!

———————————————————————————————————————————

        同时具备解决上述问题的代码,如下:

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt_sne
from sklearn import datasets
from sklearn.manifold import TSNE
import os


def plot_tsne(features, labels, epoch,fileNameDir = None):
    '''
    features:(N*m) N*m大小特征,其中N代表有N个数据,每个数据m维
    label:(N) 有N个标签
    '''
    print(features.shape,labels.shape)
    print(type(features),type(labels))
    print(np.any(np.isnan(features)),np.any(np.isinf(features)))
    features = np.nan_to_num(features)
    if not os.path.exists(fileNameDir):
        os.makedirs(fileNameDir)
    import pandas as pd
    tsne = TSNE(n_components=2, init='pca', random_state=0)
    import seaborn as sns
    
    #查看标签的种类有几个
    class_num = len(np.unique(labels))  # 要分类的种类个数  eg:[0, 1, 2, 3]这个就是为4
   
    try:
        tsne_features = tsne.fit_transform(features)  # 将特征使用PCA降维至2维
    except:
        tsne_features = tsne.fit_transform(features)
    
    #一个类似于表格的数据结构
    df = pd.DataFrame()
    df["y"] = labels
    df["comp1"] = tsne_features[:, 0]
    df["comp2"] = tsne_features[:, 1]

    hex = ["#ff8b8b", "#6e85b7"]
    data_label = []
    for v in df.y.tolist():
        if v == 1:
            data_label.append("one")
        else:
            data_label.append("zero")
    df["value"] = data_label
    
    # hue:根据y列上的数据种类,来生成不同的颜色;
    # style:根据y列上的数据种类,来生成不同的形状点;

    sns.scatterplot(x= df.comp1.tolist(), y= df.comp2.tolist(),hue=df.value.tolist(),style = df.value.tolist(),
                    palette=sns.color_palette(hex,class_num),markers= {"one":"v","zero":"^"},
                    data=df).set(title="T-SNE projection")
   
    plt_sne.savefig(os.path.join(fileNameDir,"%s.jpg") % str(epoch),format = "jpg")
    plt_sne.show()


if __name__ == '__main__':
    digits = datasets.load_digits(n_class=2)
    features, labels = digits.data, digits.target
    print(features.shape)
    print(labels.shape)

    plot_tsne(features, labels, "Set2", fileNameDir="test")

你可能感兴趣的:(anti-spoofing,sklearn,python)