机器学习超详细实践攻略(1):盘点scikit-learn里那些有趣又有用的彩蛋级入门数据集

机器学习超详细实践攻略(1):盘点scikit-learn里那些有趣又有用的彩蛋级入门数据集_第1张图片在机器学习算法的学习过程中,找到用来适合用来练手的数据集是我们面临的第一道门槛,毕竟俗话说得好,巧妇也难为无米之炊嘛。

为此,我在知乎上写过一篇回答:
机器学习需要的大量数据集从哪里找?

这篇回答主要是介绍了从各个比赛平台寻找机器学习相关实战数据集的方法,目前已经获得了1.5k个赞同,看来大家对于数据集的需求还是挺旺盛的。不过,虽然这些数据集都是从实际的业务场景抽离出来的,都有着实际的义务含义,但是这些数据集存在三个缺点:

1、这些数据集数据量相对庞大;

2、这些数据集包含了实际业务中的各种情况,而且主办方为了增加比赛的难度,甚至故意在数据集里加入一些异常的数据,探索明白这些数据集也需要很长的时间;

3、有些数据集随着比赛结束就关闭了下载通道,不好获得。
机器学习算法入门,最好能够自己亲手跑通SVM、LR、随机森林等常用的几个机器学习算法,能够直观地看看这些算法的表现效果,这和学编程做的第一件事就是让程序输出“hello world”一样。而在入门机器学习算法,对来自生活中的数据集进行加载、转换、清洗就是一个非常大的工作量,缺少数据集成为了阻碍很多初学者实践算法的不小的门槛。

其实,很多人不知道的是,机器学习领域经典的Python包scikit-learn已经将常用的数据集预置进去了,并封装成了‘’函数。这些数据集都是机器学习领域比较基础的数据集。他们由于数据量简单、数据含义直观等优点,常常混迹于各种课程中。最重要的是:对于自己直观地看到机器学习算法效果来说,足够了!下面,将具体介绍这些数据集。

一、如何使用简单数据集

这些数据集在安装好scikit-learn就已经存在于我们的电脑上了。主要包括以下几个数据集:

  1. 分类数据集:
    1.1 鸢尾花数据集:load_iris()
    1.2 手写数字识别数据集:load_digits()
    1.3 葡萄酒识别数据集:load_wine()
    1.4 乳腺癌诊断数据集:load_breast_cancer()
  2. 回归数据集:
    2.1 波士顿房价数据集:load_boston()
    2.2 糖尿病数据集:load_diabetes()
  3. 多变量回归数据集:
    3.1 兰纳胡德体能数据集:load_linnerud()

使用他们的方法非常简单。只需要执行:

from sklearn import datasets
dataset = sklearn.datasets.load_数据集名字()

#数据集
X = dataset.data

#对应标签
Y = dataset.target

当然,如果你想详细了解一下这些数据集,也可以使用以下函数:

  • dataset.target_names:查看标签含义
  • dataset.DESCR:查看数据集的描述(包括数据集的来源、属性个数、各个属性的单位等)

二、各数据集详细介绍

在我们使用数据集之前,最好知道这些数据集是描述了一个什么问题,这样才能顺理成章地明白机器学习算法是怎么解决这个问题的。以下就是关于这些简单数据集的描述。

一)鸢尾花数据集

Iris 鸢尾花数据集是一个非常经典而且历史悠久的数据集,虽然只有150个样本,但是由于其属性简单、意义直观等特点,在统计学习和机器学习领域简直是大名鼎鼎的入门数据集。数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条记录都有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度,可以通过这4个特征判断鸢尾花卉属于 iris-setosa、 iris-versicolour、 iris-virginica这3个品种中的哪一品种。

二)手写数字识别数据集

其实这严格来说属于图像处理的范畴,不过最近传统图像处理领域被深度学习颠覆到内裤都保不住了,所以这个数据集被scikit-learn收录也是可以解释得通的。这个数据集里总共有5620个样本,每个样本是由于 8*8 = 64个像素点组成的图片。我们的目标,是根据这些像素点的,预测出其代表了0~9哪个数字。

三)葡萄酒识别数据集

这是从UCI葡萄酒识别数据集中摘录出来的一个子数据集,总共有178个样本,完整的数据集可以点击UCI葡萄酒识别数据集 下载。
这个数据集产生的背景是:有个农民在意大利同一地区种植了三个不同品种的葡萄,待葡萄成熟之后分别将他们制成葡萄酒,然后科学家通过分析每种葡萄酒中13种成分的含量和特性,来判断某一杯葡萄酒是由哪种葡萄酿制的,这13种属性分别是:

  • Alcohol:酒精
  • Malic acid :苹果酸
  • Ash Alcalinity of ash :灰分
  • Magnesium :碱性
  • Total phenols:镁
  • Flavanoids :酚
  • Nonflavanoid phenols :黄酮类化合物
  • Proanthocyanins :非类黄酮酚
  • Color intensity :原花青素
  • Hue:色度
  • OD280/OD315 of diluted wines: OD280/OD315
  • Proline:脯氨酸
    这些化学成份不认识也无所谓。反正最后我们的目标是判断一杯葡萄酒是由三种葡萄中的哪一种酿制的。所以,标签自然就是三个代表三个葡萄品种的枚举值了。

四)乳腺癌诊断数据集

这个数据集由国外医疗中心肿瘤研究所提供,也可以在UCI数据库中找到。
该数据集总共有良心和恶心肿瘤2大类,良性肿瘤有357个样本,恶性肿瘤有212 个样本,共569个样本,我们通过乳房CT的30个属性来判断该乳房是否患有恶心肿瘤。
具体属性请去scikit-learn官网自行查看,由于属性太多,这里就不一一列出了。

五)波士顿房价数据集

想想我们在购房的时候,必然要考虑这个房子周围配套设施、是否是学区房、离地铁近不近,邻居是不是好相处等因素。这些因素共同决定了这个房子在我们心目中的价格。美国人民也不例外,所以,美国人口普查局就收集了美国马萨诸塞州波士顿住房价格的有关信息,没想到被聪明的机器学习专家应用到了回归预测中。
这个数据集只有506个样本,总共13个属性,属性含义如下:

  • CRIM:城镇人均犯罪率。
  • ZN:住宅用地超过 25000平方米 的比例。
  • INDUS:城镇非零售商用土地的比例。
  • CHAS:周围是否有河流(有河流,则为1,否则为0)。
  • NOX:一氧化氮浓度。
  • RM:住宅平均房间数。
  • AGE:1940 年之前建成的房屋比例。
  • DIS:到波士顿五个中心区域的加权距离。
  • RAD:距离公路的距离。
  • TAX:当地税率。
  • PTRATIO:城镇师生比例。
  • B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。
  • LSTAT:人口中底层人民的比例。
  • MEDV:自住房的平均房价,以千美元计
    每个样本对应一个浮点数标签,代表某个房子的价格。看看这些影响房价的因素,是不是基本符合我们的购房考虑因素啊?看来全世界人民的心理都是相通的。

六)糖尿病病情预测数据集

随着生活水平的提高,越来越多的人在平常大量摄入高油高糖的食物。糖尿病的患者人数也在逐年上升。本数据集就是通过一个糖尿病人当前的基本情况和身体指标,预测其一年之后的病情发展情况。数据集总共有442个样本。通过10个属性维度来就行区分,分别是:

  • Age:年龄
  • Sex :性别
  • Body mass index:BMI指数
  • Average blood pressure:平均血压
  • S1
  • S2
  • S3
  • S4
  • S5
  • S6
    这些S代表了六种血清的化验数据,别问我具体的含义,只知道是医学方面的一些量化值就可以了。
    属性值的取值范围在(-0.2,0.2)之间,标签的取值范围在[25,346]之间。

注意:为了便于输入算法模型中,这10个特征变量都以标准偏差时间为中心并按比例进行了缩放处理。

七)兰纳胡德体能数据集

数据集的名字有点拗口,不过你只要记住这是一个衡量体能的数据集就好了。
数据集的背景就是一个叫兰纳胡德(Linnerud)的人测量了某个健身俱乐部的 20 位中年男子的生理数据。被测变量分为两组子数据集。第一个子数据集包含三个生理特征:

  • Weight:体重
  • Waist:腰围
  • Pulse:脉搏
    第二个子数据集包含了三个运动特征:
  • Chins:引体向上
  • Situps:仰卧起坐
  • Jumps:跳跃
    我们要做的,就是寻找子数据一和子数据集二之间的因果关系,这就属于多变量回归问题。

我们解释一下多变量回归的概念:回归问题的本质就是去分析因变量与自变量之间的关系,从而为分析数据、预测数据提供科学的、合理的依据,但是通常我们所说的回归问题,是通过几个自变量得到一个结果,比如说上边提到的通过各种因素预测房价等问题。而多变量回归就是要分析多个自变量造成了多个因变量的变化规律。属于多对多的关系。

举个例子,比如现在,有一堆自变量(X1,X2,…Xn),这些因素可以导致(Y1,Y2,…Yn)这些因变量的变化,我们又完全不清楚自变量之间、因变量之间存在的关系。

顺便提一句,对于变量之间关系复杂、而样本量又很少的问题,用偏最小二乘回归解决是最个不错的选择。sklearn已经实现了偏最小二乘回归算法,有兴趣的可以参考sklearn文档。
最后,正因为这些数据集本身非常简单,而且已经被scikit-learn做了简化处理,用来入门可以,要想真正提高自己运用算法和数据挖掘的能力,还是要参加各种比赛或者从事实际的项目,毕竟两千多年前,大将军赵括已经用亲身经历告诉我们纸上谈兵的惨痛后果了哦。

三、自己构造数据集

如果玩腻了这些简单的数据集,sklearn还支持自己自定义创造数据集。
构造数据集的函数也在sklearn.datasets下,我们分别采用make_classification、 make_regression、make_blobs三个函数来构建分类、回归、聚类数据集。比如我们随便构建一个10个样本的分类数据集:

from sklearn.datasets import make_classification
X,Y = datasets.make_classification(n_samples = 10)
print('X:',X[:3])
print('Y:',Y[:3])
print('X维度:',X.shape)
print('Y维度:',Y.shape)

输出如下:

X: [[ 0.29690827 0.10576263 1.94658436 -1.3104142 -1.1185016 -1.40073829
-0.4096297 -1.86317979 0.64596297 0.75271884 0.35448096 -2.11235401
-2.40728032 -1.23424255 -3.43409603 -2.60231078 0.71952271 -0.40460211
0.88607677 0.21988113]
[-0.3822589 -0.82217221 0.81753074 0.24330878 1.47338236 -1.4133207
0.97520516 -0.12297019 0.19819793 -0.71166377 0.21027697 0.48598411
0.23083475 -0.46330706 -0.44026309 -0.10874537 0.63478363 0.29211047
-0.20734913 -0.7659504 ]
[-0.23784806 0.74146631 -0.49256622 0.77576281 1.16816195 -1.90326764
-1.02380523 0.23918916 -1.17025757 -0.44354062 -0.09143154 0.22992207
-0.60323483 -0.16646197 0.84068396 0.63071089 -1.83135902 0.37492177
-1.36216032 0.56710804]]
Y: [1 1 0]
X维度: (10, 20)
Y维度: (10,)

可以看到,以上函数生成了10个样本,每个样本有20个特征维度。

当然,在生成数据集的过程中,我们可以根据自己的需求自定义一些参数来调整生成的数据集。
在构造这些数据集时,所共同用到的参数有:

  • n_samples:样本个数 n_features :特征总个数。
  • n_informative:有用的特征个数。也就是说,我们可以和n_features参数相结合生成一些无用特征,增加算法的预测难度。
  • n_redundant:无用的特征个数。 random_state :随机数生成种子
  • n_repeated:重复特征数【这个一般无需指定】

这里可能有人会疑惑:指定n_features和n_informative之后,n_redundant不就确定了?其实不然。如果我们指定的n_features大于n_informative +n_redundant 的个数,那么程序会从这两个特征里随机重复挑选一些特征,直到达到特征总个数的数量。这样,我们在实际用算法进行预测的时候,就需要用一些降维算法筛掉冗余特征所以说,scikit-learn为了帮我我们设置复杂的数据集真是操碎了心。

当然,总特征数(n_features)一定要大于n_informative、n_redundant之和,否则会报错:

Number of informative, redundant and repeated features must sum to less than the number of total features
当然,以上这些参数都有默认值,可以不用自己指定。

一)构造分类数据集

构造分类数据集完整的范例:

from sklearn.datasets import make_classification
features2,target2 = datasets.make_classification(n_samples = 10,
                                                 n_features = 3,
                                                 n_informative = 3,
                                                 n_redundant = 0,
                                                 n_classes = 2,
                                                 weights = [0.25,0.75],
                                                 random_state = 1)

构造分类数据集特有的参数的解释:

  • n_calss :分类个数
  • weights :每个类别占的样本比例,这里数组维数要和分类数相对应

二)构造回归数据集

构造回归数据集完整的范例:

from sklearn.datasets import make_regression
features,target,cofficients = datasets.make_regression(n_samples = 10,
                                                       n_features = 3,
                                                       n_informative = 3,
                                                       n_targets = 3
                                                       ,noise = 0.0,
                                                       coef = True,
                                                       random_state = 1)

构造回归数据集特有的参数解释:

  • n_target :默认为1,如果指定多个回归值,那就是构造了类似于兰纳胡德体能数据集的多变量回归数据集
  • noise =0.0:给数据集制造一些噪声,noise越大的话,点就会越来越离散,就越不好拟合回归曲线。
  • coef :默认为False,如果为真,则返回基础线性模型的系数。

三)构造聚类数据集

构造聚类数据集完整的范例:

from sklearn.datasets import make_blobs
features,target = make_blobs(n_samples = 10,
                             n_features = 3,
                             centers = 3,
                             cluster_std = 0.5,
                             shuffle = True,
                             random_state = 1)

构造聚类数据集特有的参数解释:

  • centers = 3:要生成的样本聚类中心数。
  • cluster_std = 0.5:每个类别的方差,例如我们希望生成2类数据,其中一类方差为0.1,另一类方差为0.2,可以将cluster_std设置为[0.1,0.2]
  • shuffle = True:布尔值,控制是否随机打乱样本。
    虽然这样有着自己出题自己做的嫌疑,但是,因为我们对自己构造的数据集非常了解,通过这些数据集来看各个算法的表现,完全能够进一步加深对算法的理解。

三、总结

除此之外,sklearn还提供了一些更加接近现实的入门数据集,有人脸识别数据集、新闻文本数据集、森林类型数据集等。他们占用存储空间较大,需要的话可以用Python命令把他们下载下来,这里不做赘述。

本系列相关文章:

机器学习超详细实践攻略(8):使用scikit-learn构建模型的通用模板【万字长文】

扩展阅读

  • make_classification参数解释
  • make_regression参数解释
  • make_blobs参数解释

你可能感兴趣的:(机器学习超详细攻略,机器学习,数据挖掘,神经网络)