目录

1. 前言        

2. make_classification¶

3. make_blobs

4. make_moons

5. make_circles

6. make_gaussian_quantiles

7. make_hastie_10_2

8. 多标签数据集生成

9. make_biclusters

10. make_checkerboard


1. 前言        

        机器学习算法是以数据为粮食的,所以机器学习开发的第一步就是数据的准备。数据预处理和特征工程是机器学习中不显眼(没有像算法开发那样亮丽)但是往往是涉及工作量最大的一部分。        

        对机器学习算法的学习和开发人员的一个福音是互联网上有很多开源的数据集,scikit-learn也内置了一部分简单的规模较小的数据(toy datasets,玩具数据集),并且为其它规模较大的数据集准备了相应的获取(下载)的API。这些数据集已经经过了适当的预处理,可以使得机器学习算法的学习和开发人员可以回避掉数据采集和处理的“吃力不讨好”的过程而聚焦于机器学习算法本身。

        此外,scikit-learn还有自动生成面向各种机器学习问题的随机数据集的工具。这些随机生成的数据集虽然不是来源于实际测量,但是由于可以很简单地生成,而且其统计特征是受控的,所以对于机器学习的学习者或者机器学习算法的早期开发验证也是非常有用。

        本系列简要介绍这几种数据集的生成、加载和/或获取方式,以及相应的基于scikit-learn的处理方法。

        scikie-learn中用于生成数据集的接口函数统一以'make_'打头,可以生成以下类型的数据集:

        (1) 分类和聚类数据集

        (2) 回归数据集

        (3) 流行学习数据集

        (4) 降维数据集

        作为本系列的第三篇,本文介绍分类和聚类数据集的生成,包括以下9个接口函数,其中,

        有六个是用于单标签类数据生成:

         (1) make_blobs()

        (2) make_classification()

        (3) make_gaussian_quantiles()

        (4) make_hastie_10_2()

        (5) make_circles()

        (6) make_moons()

        一个用于多标签类数据生成:

        (7) make_multilabel_classification()

        还有两个用于双聚类数据集生成:

        (8) make_biclusters

        (9) make_checkerboard

        以下各节分别针对每一个接口函数给出一些示例代码,但是不对各用到的函数的参数进行具体描述,仅在以下例子中对用到的参数顺带说明。scikit-learn提供了丰富的参数用于所生成的数据集的特性控制,需要进一步的详细信息请参考scikit-learn在线文档):需要使用时可以自行查阅scikit-learn文档。

2. make_classification

        make_blobs()和make_classification()都用于生成多类别的数据集,每个类别都是由一个或者多个正态分布簇(normally-distributed cluster)构成。

        make_blobs对于各簇的中心和标准偏差提供了更方便的控制选项,通常用于聚类算法的演示。而make_classification则更加侧重于通过各种手段导入各种“噪声”的影响,比如说,相关的、冗余的、没有信息量的特征;每个类分成多个正态分布簇;特征空间的线性变换等等。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Example1: make_classification()生成二分类数据集
from sklearn.datasets import make_classification
X,y = make_classification(n_samples=1000, n_features=5,n_redundant=0,n_clusters_per_class=1,n_informative=1, n_classes=2, random_state=20)

# scatter plot, dots colored by class value
df = pd.DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue'}
fig, ax = plt.subplots()
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])

print(X.shape, y.shape)

3. make_blobs

        'blob'的意思可能跟cluster差不多,都是簇、团、块的意思。

        以下第一个例子生成了3个blobs,第二个例子生成了4个blobs。注意,在第3个例子中,显式地制指定了4个blobs的中心各簇的样本数,以及各簇的standard deviation.

# make_blobs: Generate isotropic Gaussian blobs for clustering. Of course, can also be used for classfication problem.
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=1000, centers=3, n_features=2,random_state=10)

# scatter plot, dots colored by class value
df = pd.DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue',2:'y'}
fig, ax = plt.subplots()
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])

 

X, y = make_blobs(n_samples=[100,300,250,400], n_features=2,
                  centers=[[100,120],[250,300], [700,150],[300,500]],
                  cluster_std=50, random_state=111)

# scatter plot, dots colored by class value
df = pd.DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue',2:'y', 3: 'green'}
fig, ax = plt.subplots()
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])

 

4. make_moons

        make_moons()函数生成一个二分类问题数据集,它生成两个半月形对应两个分类。可以通过noise参数来控制噪声量。 适合于非线性分类算法的演示。

# make_moons: Generate isotropic Gaussian blobs for clustering.
# 经常用于非线性分类示例。
from sklearn.datasets import make_moons
# generate 2d classification dataset
X, y = make_moons(n_samples=1000,shuffle=True, noise=0.1, random_state=10)
# scatter plot, dots colored by class value
df = pd.DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue'}
fig, ax = plt.subplots()
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])

 

5. make_circles

        顾名思义,每个类别的样本构成一个圆形。

# make_circles: generates a binary classification problem with datasets that fall into concentric circles.
# Make a large circle containing a smaller circle in 2d. 
# A simple toy dataset to visualize clustering and classification algorithms, suitable for algorithms that can learn complex non-linear manifolds.

from sklearn.datasets import make_circles
# generate 2d classification dataset
X, y = make_circles(n_samples=1000, noise=0.05) # 'noise' is used to control the amount of noise in the shapes.
# scatter plot, dots colored by class value
df = pd.DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue'}
fig, ax = plt.subplots(figsize=[6,6])
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])

6. make_gaussian_quantiles

        make_gaussian_quantiles()首先生成一个多维正态分布样本集,然后,将这样本集基于分位点(quantiles)分割成多个(n_classes=3 by default)嵌套的多维同心超球,每个超球属于一类,并使得大致各类的样本基本相等。

        基于分位点进行分割是什么意思呢?

        以一维正态分布为例,大致来说就是这样分割的。假设n_classes = 3,因此对应的两个分割用的分位点就是33%和66%。取样本中位于[0, 33%]分位区间的作为第一类,位于[33%, 66%]分位区间的作为第二类,位于[66%, 100%]分位区间的作为第三类。对于多维数据,是基于对应的𝜒2分布的分位数来进行分类。

from sklearn.datasets import make_gaussian_quantiles
import numpy as np
import pandas as pd

data, target = make_gaussian_quantiles(n_samples=1500, cov=1.0, n_classes=3)

# scatter plot, dots colored by class value
df = pd.DataFrame(dict(x=data[:,0], y=data[:,1], label=target))
colors = {0:'red', 1:'blue', 2:'k'}
fig, ax = plt.subplots(figsize=[6,6])
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])

 

 

7. make_hastie_10_2

        这个函数是专门用于以下Hastie的机器学习经典教材中例10.2所提及的数据集的生成,用于二分类问题。为一本书中的一个例子专门列了一个函数,确实是很拼。可以看作是make_gaussian_quantiles的一种特例,或者反过来说make_gaussian_quantiles是make_hastie_10_2的推广。

        T. Hastie, R. Tibshirani and J. Friedman, “Elements of Statistical Learning Ed. 2”, Springer, 2009.》

        该数据集有10个特征,是i.i.d(独立同分布)的标准正态分布,target y定义如下:

    y[i] = 1 if np.sum(X[i] ** 2) > 9.34 else -1
from sklearn.datasets import make_hastie_10_2
import numpy as np
import pandas as pd

data, target = make_hastie_10_2(n_samples=1000, random_state=42)

#target[target==-1] = 0  # 原数据集生成的target为[1,-1],这里变换为[1,0]
#target = target.astype('int32') # 变换成整数

df = pd.DataFrame(data)
df['target'] = target
     
df    

        这是一个10维的数据,所以不容易以散点图的形式进行图示化。以下通过图示的方式看看各个维度是不是独立同分布(i.i.d)的标准高斯分布。

from scipy.stats import norm
plt.figure(figsize=(20,6))
for k in range(10):
    df[k].plot(kind='kde',secondary_y=True,label='feature#'+str(k))
    
x = np.linspace(-8,8, 1000)
plt.plot(x, norm.pdf(x),'r-', lw=2, alpha=0.6, label='theoretic std norm pdf')

plt.legend()

        如上图可知,10个特征分量确实基本上都是与标准正态分布吻合的。

8. 多标签数据集生成

        多标签数据集用于当存在多各类别,而待分类的数据可能属于其中的一类或者同时属于多个类别,或者甚至不属于任何类别。比如说,当需要识别在一张图像中所包含的交通信号等的类型。一张图片可能不包含信号灯,也可能只包含一个红灯或绿灯或黄灯,也可能同时包含一个红灯和绿灯(如果这张图片覆盖了一个十字路口的两个方向的信号灯的话)。

import numpy as np
import matplotlib.pyplot as plt

from sklearn.datasets import make_multilabel_classification as make_ml_clf
x, y = make_ml_clf(n_samples=1000, n_features=10,n_classes=3, random_state=0)
print(x.shape, y.shape)
print(y[:10,:])
(1000, 10) (1000, 3)
[[0 1 0]
 [1 0 1]
 [1 1 1]
 [0 1 1]
 [1 1 0]
 [0 1 0]
 [1 1 1]
 [1 0 1]
 [1 1 1]
 [1 1 0]]

        可以看出,由于是多分类(本例是3分类)多标签的,所以target(label)采用了one-hot编码的形式,每个数据样本的label中可能有一个或多个1,表示属于1个类别或者多个类别。当然,虽然以上没有显示出来,也存在不属于任何类别的样本,即其label为全零向量。

9. make_biclusters

        make_biclusters用于生成具有恒定块对角线结构(constant block diagonal structure)的数组以进行双向聚类。所谓“双向聚类”,是指对变量和实例同时聚类。本数据集可以用于谱协聚类(SpectralCoclustering)算法的示例。

import numpy as np
from matplotlib import pyplot as plt

from sklearn.datasets import make_biclusters
data, rows, columns = make_biclusters(
    shape=(300, 300), n_clusters=5, noise=5,
    shuffle=False, random_state=0)

plt.matshow(data, cmap=plt.cm.Blues)
plt.title("Original dataset")
plt.show()

10. make_checkerboard

        make_checkerboard()用于生成一个具有棋盘格结构的数组,以进行双向聚类。

import numpy as np
from matplotlib import pyplot as plt

from sklearn.datasets import make_checkerboard
data, rows, columns = make_checkerboard(
    shape=(300, 300), n_clusters=5, noise=5,
    shuffle=False, random_state=0)

plt.matshow(data, cmap=plt.cm.Blues)
plt.title("Original dataset")
plt.show()

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐