天天看點

【sklearn】dataset子產品(2)—— 生成資料集1. 生成資料集

  • 本文介紹sklearn.datasets子產品
  • 本文是從jupyter文檔轉換來的,某個代碼塊不一定能直接複制運作,代碼輸出結果統一以注釋形式添加在代碼最後

文章目錄

  • 1. 生成資料集
    • 1.1 分類和聚類生成器
      • 1.1.1 單标簽
        • 1.1.1. make_blobs
        • 1.1.1.2 make_classification
        • 1.1.1.3 make_gaussian_quantiles
        • 1.1.1.4 make_hastie_10_2
        • 1.1.1.5 make_circles
        • 1.1.1.6 make_moon

1. 生成資料集

  • 前文:【sklearn】dataset子產品(1)—— 玩具資料集、遠端資料集 介紹了幾種datasets子產品自帶的資料集,但有些時候我們需要自定義生成服從某些分布某些形狀的資料集,這時就可以使用datasets中提供的各種随機樣本的生成器,建立可控制的大小和複雜性人工資料集。
  • 全部加載方法
    datasets.make_biclusters 
    datasets.make_blobs
    datasets.make_checkerboard 
    datasets.make_circles
    datasets.make_classification 
    datasets.make_friedman1
    datasets.make_friedman2 
    datasets.make_friedman3
    datasets.make_gaussian_quantiles
    datasets.make_hastie_10_2 
    datasets.make_low_rank_matrix
    datasets.make_moons
    datasets.make_multilabel_classification
    datasets.make_regression 
    datasets.make_s_curve
    datasets.make_sparse_coded_signal
    datasets.make_sparse_spd_matrix
    datasets.make_sparse_uncorrelated
    datasets.make_spd_matrix 
    datasets.make_swiss_roll
               
  • 常用方法
    生成方法 介紹
    make_blobs() 多類單标簽資料集,為每個類配置設定一個或多個正太分布的點集
    make_classification() 多類單标簽資料集,為每個類配置設定一個或多個正太分布的點集,提供了為資料添加噪聲的方式,包括次元相關性,無效特征以及備援特征等
    make_gaussian-quantiles() 将一個單高斯分布的點集劃分為兩個數量均等的點集,作為兩類
    make_hastie-10-2() 産生一個相似的二進制分類資料集,有10個次元
    make_circle 和 make_moom() 産生二維二進制分類資料集來測試某些算法的性能,可以為資料集添加噪聲,可以為二進制分類器産生一些球形判決界面的資料

1.1 分類和聚類生成器

  • 以下生成器将産生一個相應特征的離散矩陣

1.1.1 單标簽

1.1.1. make_blobs

  1. make_blobs

    産生多類單标簽資料集,它為每個類配置設定服從一個或多個(每個次元)正态分布的點集,對于中心和各簇的标準偏差提供了更好的控制,可用于示範聚類。
  2. 方法原型
    sklearn.datasets.make_blobs(n_samples=100,
                                n_features=2,
                                *,
                                centers=None,
                                cluster_std=1.0,
                                center_box=(-10.0, 10.0),
                                shuffle=True,
                                random_state=None,
                                return_centers=False,)
               
  3. 參數表
    參數 類型 預設 說明
    n_samples int類型 可選參數 (default=100) 總的點數,平均的分到每個clusters中。
    n_features int類型 可選參數 (default=2) 每個樣本的特征次元。
    centers int類型 or 聚類中心坐标元組構成的數組類型 可選參數(default=3) 産生的中心點的數量, or 固定中心點位置。
    cluster_std float or floats序列 可選參數 (default=1.0) clusters的标準差。
    center_box 一對floats (min, max) 可選參數 (default=(-10.0, 10.0)) 随機産生資料的時候,每個cluster中心的邊界。
    shuffle boolean 可選參數 (default=True) 打亂樣本。
  4. 說明:
    1. 一共

      n_samples

      個資料點,每個資料點有

      n_features

      個次元,服從第

      i

      維方差為

      cluster_std[i]

      n_features

      維正态分布,資料點(及其每個次元)分為

      centers

      類。每一類中心點的每一維都處于

      center_box

      給出的數軸邊界内。
    2. 把每個簇想象成

      n_features

      維超立方體空間中的一個立方體,它的每個次元都服從指定的正态分布
  5. 示例
    import numpy as np
    from sklearn import datasets
    from matplotlib import pyplot as plt
    
    my_datas = datasets.make_blobs(n_samples=1500, 
                                   n_features=5, 
                                   centers=3,
                                   center_box = (-10,10),
                                   cluster_std=[1.0,2.0,3.0])
    
    x,y = my_datas
    plt.scatter(x[:, 0], x[:, 1], c=y, s=8)
    
    #print(x)
    #print(y)
               
    【sklearn】dataset子產品(2)—— 生成資料集1. 生成資料集

1.1.1.2 make_classification

  1. make_classification

    産生多類單标簽資料集,它為每個類配置設定服從一個或多個(每個次元)正态分布的點集,提供了為資料添加噪聲的方式,包括次元相關性,無效特征(随機噪聲)以及備援特征等。
  2. 方法原型
    sklearn.datasets.make_classification(n_samples=100, 
                                         n_features=20,
                                         *,
                                         n_informative=2,
                                         n_redundant=2,
                                         n_repeated=0, 
                                         n_classes=2,
                                         n_clusters_per_class=2,
                                         weights=None,
                                         flip_y=0.01, 
                                         class_sep=1.0,
                                         hypercube=True,
                                         shift=0.0, 
                                         scale=1.0, 
                                         shuffle=True, 
                                         random_state=None,)
               
  3. 文檔:
    1. 原文:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_classification.html#sklearn.datasets.make_classification
    2. 翻譯:https://blog.csdn.net/n889092/article/details/77126754
  4. 文檔介紹:
    • 生成随機的n分類問題。
    • 設有

      n_informative

      維,邊長為

      2*class_sep

      的超立方體,首先建立服從關于其頂點的正态分布(标準差std = 1)的點的簇,并為每個類配置設定相等數量的簇,它引入了這些特征之間的互相依賴性。然後可以為資料進一步添加各種類型的噪聲。
    • 在不進行改組(Without shuffling)的情況下,“X”按以下順序水準排列特征:
      1. n_informative

        特征
      2. informative特征的線性組合

        n_redundant

      3. n_repeated

        重複項,這是從informative和redundant特征中進行替換随機繪制的。
      4. 其餘特征用随機噪聲填充
    • 是以,不進行改組(Without shuffling)時,所有有用的特征都包含在列

      X [:,:n_informative + n_redundant + n_repeated]

      中。
  5. 參數表
    參數 類型 預設 說明
    n_samples int optional (default=100) 樣本數量.
    n_features int optional (default=20) 總的特征數量, 其中包括資訊特征

    n_informative

    個,備援特征

    n_redundant

    個,重複特征

    n_repeated

    個,其餘為随機繪制的無用特征。
    n_informative int optional (default=2) 資訊特征的數量。每個類由多個高斯簇組成,每個高斯簇都位于n_informative維子空間中超立方體的頂點周圍。 對于每個簇,資訊特征是獨立地繪制自正态分布N(0,1),然後随機線性組合各個簇中以增加協方差。簇位于在超立方體的頂點上。
    n_redundant int optional (default=2) 備援特征的數量。這些特征是作為資訊特征的随機線性組合生成的
    n_repeated int optional (default=0) 重複特征的數量。這些特征是從資訊特征和備援特征中随機抽取的
    n_classes int optional (default=2) 分類問題的類(或标簽)數。
    n_clusters_per_class int optional (default=2) 每個類的簇數量。
    weights floats清單 or None (default=None) 每個類的權重,用于控制配置設定給每個類别的樣本比例。取值為None時均勻配置設定,否則根據floats清單給出的比例配置設定(這個清單長n_classes或n_classes-1,後者會自動推斷最後一個類别樣本比例)。如果比例之和大于1,傳回樣本數量可能超過n_samples
    flip_y float optional (default=0.01) 随機配置設定類别的樣本所占的比例。 較大的值會在标簽中引入噪音,并使分類任務更加困難。 請注意,在某些情況下,預設設定flip_y> 0可能導緻y中的類别數少于n_class。
    class_sep float optional (default=1.0) 超立方體大小的乘數因子。較大的取值分散了簇/類别,使分類任務更加容易。
    hypercube boolean optional (default=True) 如果為True,則将簇放置在超立方體的頂點上。 如果為False,則将簇放在随機多面體的頂點上。
    shift float,array of shape [n_features] or None optional (default=0.0) 按指定值移動特征。 如果為None,則将特征移動 [-class_sep,class_sep] 中的随機值。
    scale float array of shape [n_features] or None optional (default=1.0) 将特征乘以指定值進行縮放。 如果為None,則按[1,100]中随機選取的值縮放特征。 注意特征縮放是在特征移動後發生的。
    shuffle boolean optional (default=True) 随機排列樣本和特征。
    random_state int,RandomState instance or None optional (default=None) 如果int,random_state是随機數生成器使用的種子;如果是随機狀态執行個體,random_state是随機數生成器;如果為None,則随機數生成器是np.random使用的随機狀态執行個體
  6. 示例1
    import numpy as np
    from sklearn import datasets
    from matplotlib import pyplot as plt
    
    # datasets.make_classification?
    
    # 要求:n_classes * n_clusters_per_class <= 2^n_informative
    data1,target1 = datasets.make_classification(n_samples=100,           # 樣本總數
                                                 n_features=2,            # 特征總數 = n_informative + n_redundant + n_repeated + 随機噪聲特征
                                                 n_informative=1,         
                                                 n_redundant=0,
                                                 n_repeated=0, 
                                                 n_clusters_per_class=1)  # 每個類的簇數量
    
    data2,target2= datasets.make_classification(n_samples=100,
                                                n_features=2,
                                                n_informative=1,
                                                n_redundant=0,
                                                n_repeated=1,
                                                n_clusters_per_class=1)
    
    data3,target3= datasets.make_classification(n_samples=200,
                                                n_features=2,
                                                n_informative=2,
                                                n_redundant=0,
                                                n_repeated=0,
                                                n_clusters_per_class=1)
    
    data4,target4 = datasets.make_classification(n_samples=100,           # 樣本總數
                                                 n_features=2,            # 特征總數 = n_informative + n_redundant + n_repeated + 随機噪聲特征
                                                 n_informative=2,         
                                                 n_redundant=0,
                                                 n_repeated=0, 
                                                 n_classes=2,
                                                 n_clusters_per_class=2)  # 每個類的簇數量
    
    fig,axes = plt.subplots(1,4)
    axes[0].scatter(data1[:,0],data1[:,1],c=target1)
    axes[1].scatter(data2[:,0],data2[:,1],c=target2)
    axes[2].scatter(data3[:,0],data3[:,1],c=target3)
    axes[3].scatter(data4[:,0],data4[:,1],c=target4)
    plt.show()
               
    【sklearn】dataset子產品(2)—— 生成資料集1. 生成資料集
  7. 示例2
    import matplotlib.pyplot as plt
    from sklearn.datasets import make_classification
     
    plt.figure(figsize=(10,10))  # 建立一個10 * 10 英寸的圖像
    plt.subplots_adjust(bottom=0.05,top=0.9,left=0.05,right=0.95)
     
    plt.subplot(221)
    plt.title("One informative feature, one cluster per class",fontsize='small')
    X1,Y1= make_classification(n_samples=1000,
                               n_features=2,
                               n_informative=1,
                               n_redundant=0,
                               n_clusters_per_class=1)
    plt.scatter(X1[:,0],X1[:,1],marker='o',c=Y1)
     
    plt.subplot(222)
    plt.title("Two informative features, two cluster per class", fontsize='small')
    X2,Y2 = make_classification(n_samples=1000,
                                n_features=2,
                                n_informative=2,
                                n_redundant=0,
                                n_clusters_per_class=2)
    plt.scatter(X2[:,0],X2[:,1],marker='o',c=Y2)
     
    plt.subplot(223)
    plt.title("Two informative features, two clusters per class", fontsize='small')
    X3,Y3 = make_classification(n_samples=1000,
                                n_features=2,
                                n_informative=2,
                                n_redundant=0,
                                n_clusters_per_class=2)
    plt.scatter(X3[:,0],X3[:,1],marker='o',c=Y3)
     
    plt.subplot(224)
    plt.title("Multi-class, two informative features, one cluster",fontsize='small')
    X4,Y4= make_classification(n_samples=1000,
                               n_features=2,
                               n_informative=2,
                               n_redundant=0,
                               n_classes=3,
                               n_clusters_per_class=1)
    plt.scatter(X4[:,0],X4[:,1],marker='o',c=Y4)
    plt.show()
               
    【sklearn】dataset子產品(2)—— 生成資料集1. 生成資料集

1.1.1.3 make_gaussian_quantiles

  1. make_gaussian_quantiles

    産生多類單标簽資料集。它通過 χ 2 \chi^2 χ2 分布的分位數(quantile)将single Gaussian cluster(單高斯簇)進行近乎相等大小的同心超球面劃分,生成各向同性的高斯樣本及其标簽。簡單說,此分類資料集是從一個多元标準正态分布采樣得到的,若幹嵌套的同心多元球體将采樣資料劃分為各個類别,這種劃分使每個類中的樣本數量大緻相等
  2. 方法原型
    datasets.make_gaussian_quantiles(*,
                                     mean=None,
                                     cov=1.0,
                                     n_samples=100,
                                     n_features=2,
                                     n_classes=3,
                                     shuffle=True,
                                     random_state=None,)
               
  3. 參數表
    參數 類型 預設 說明
    mean array of shape [n_features] 可選參數 (default=None) 多元正态分布的均值。如果為None,則使用原點(0,0,…)
    cov float 可選參數 (default=1) 該值乘以機關矩陣得到協方差矩陣。該資料集僅産生對稱的正态分布
    n_samples int 可選參數(default=100) 平均分散在各類别中的資料點總數
    n_features int 可選參數 (default=2) 每個樣本的特征數量
    n_classes int 可選參數 (default=3) 類别數量
    shuffle boolean 可選參數 (default=True) 打亂樣本
    random_state int,RandomState instance or None optional (default=None) 如果int,random_state是随機數生成器使用的種子;如果是随機狀态執行個體,random_state是随機數生成器;如果為None,則随機數生成器是np.random使用的随機狀态執行個體
  4. 示例
    import numpy as np
    from sklearn import datasets
    from matplotlib import pyplot as plt
    
    # datasets.make_gaussian_quantiles?
    
    # 要求:len(mean) == n_features
    X,y = datasets.make_gaussian_quantiles(mean=[1,2,3],
                                           cov=2,
                                           n_samples=1000,
                                           n_features=3,
                                           n_classes=3,)
    
    fig = plt.figure(figsize = (12,6))
    a0 = fig.add_subplot(1,2,1,label='a0')
    a0.scatter(X[:,0],X[:,1],c=y)
    
    a1 = fig.add_subplot(1,2,2,label='a1',projection='3d') #這種方法也可以畫多個子圖
    a1.scatter(X[:,0],X[:,1],X[:,2],alpha=0.5,c=y)  # alpha透明度,c顔色序列
    
    #plt.scatter(X[:,0],X[:,1],marker='o',c=y,s=3)
    plt.tight_layout()
    plt.show()
               
    【sklearn】dataset子產品(2)—— 生成資料集1. 生成資料集

1.1.1.4 make_hastie_10_2

  1. make_hastie_10_2

    産生一個相似的二進制分類資料集,每個樣本有10個次元,分别服從獨立的高斯分布,樣本 X[i] 的标簽根據以下公式生成
    1. 若np.sum(X[i]**2) > 9.34,y[i] = 1
    2. 否則 y[i] = -1
  2. 方法原型
    datasets.make_hastie_10_2(n_samples=12000, 
                              *, 
                              random_state=None)
               
  3. 示例
    import numpy as np
    from sklearn import datasets
    from matplotlib import pyplot as plt
    
    my_datas = datasets.make_hastie_10_2(n_samples = 10000)
    
    X,y = my_datas
    plt.scatter(X[:, 0], X[:, 1], c=y, s=8)
               
    【sklearn】dataset子產品(2)—— 生成資料集1. 生成資料集

1.1.1.5 make_circles

  1. make_circles

    産生一個環狀二分類單标簽資料集。這是一個簡單的玩具資料集,生成帶有球面決策邊界的資料,可以選擇性加入高斯噪聲,用于可視化聚類和分類算法。
  2. 方法原型
    datasets.make_circles(n_samples=100,
                          *,
                          shuffle=True,
                          noise=None,
                          random_state=None,
                          factor=0.8,)
               
  3. 參數表
    參數 類型 預設 說明
    n_samples int or two-element tuple 可選參數 (default=100) 如果為int,則為生成的總點數(對于奇數,内圓将比外圓多一個點);如果是二進制組,則為外圓和内圓中的點數。
    noise double or None 可選參數 (default=None) 加入的高斯噪聲的标準差
    n_samples int 可選參數(default=100) 平均分散在各類别中的資料點總數
    factor 0 < double < 1 可選參數 (default=0.8) 内外圓之間的比例因子
    shuffle boolean 可選參數 (default=True) 打亂樣本
    random_state int,RandomState instance or None optional (default=None) 如果int,random_state是随機數生成器使用的種子;如果是随機狀态執行個體,random_state是随機數生成器;如果為None,則随機數生成器是np.random使用的随機狀态執行個體
  4. 示例
    import numpy as np
    from sklearn import datasets
    from matplotlib import pyplot as plt
    
    # datasets.make_circles?
    my_datas = datasets.make_circles(n_samples=1000,
                                      noise=0.1,
                                      factor=0.8,)
    
    X,y = my_datas
    plt.scatter(X[:, 0], X[:, 1], c=y, s=8)
               
    【sklearn】dataset子產品(2)—— 生成資料集1. 生成資料集

1.1.1.6 make_moon

  1. make_moon

    産生一個月牙形單标簽資料集。這是一個簡單的玩具資料集,生成帶有月牙形決策邊界的資料,可以選擇性加入高斯噪聲,用于可視化聚類和分類算法。
  2. 方法原型
    datasets.make_moons(n_samples=100, 
                        *,
                        shuffle=True,
                        noise=None,
                        random_state=None)
               
  3. 參數表:和

    make_circles

    相比就少一個

    factor

    ,其他一樣
  4. 示例
    import numpy as np
    from sklearn import datasets
    from matplotlib import pyplot as plt
    
    # datasets.make_moons?
    my_datas = datasets.make_moons(n_samples=1000,
                                      noise=0.1,)
    
    X,y = my_datas
    plt.scatter(X[:, 0], X[:, 1], c=y, s=8)
               
    【sklearn】dataset子產品(2)—— 生成資料集1. 生成資料集
  • 未完待續

繼續閱讀