在机器学习算法的学习过程中,找到用来适合用来练手的数据集是我们面临的第一道门槛,毕竟俗话说得好,巧妇也难为无米之炊嘛。
为此,我在知乎上写过一篇回答:
机器学习需要的大量数据集从哪里找?
这篇回答主要是介绍了从各个比赛平台寻找机器学习相关实战数据集的方法,目前已经获得了1.5k个赞同,看来大家对于数据集的需求还是挺旺盛的。不过,虽然这些数据集都是从实际的业务场景抽离出来的,都有着实际的义务含义,但是这些数据集存在三个缺点:
1、这些数据集数据量相对庞大;
2、这些数据集包含了实际业务中的各种情况,而且主办方为了增加比赛的难度,甚至故意在数据集里加入一些异常的数据,探索明白这些数据集也需要很长的时间;
3、有些数据集随着比赛结束就关闭了下载通道,不好获得。
机器学习算法入门,最好能够自己亲手跑通SVM、LR、随机森林等常用的几个机器学习算法,能够直观地看看这些算法的表现效果,这和学编程做的第一件事就是让程序输出“hello world”一样。而在入门机器学习算法,对来自生活中的数据集进行加载、转换、清洗就是一个非常大的工作量,缺少数据集成为了阻碍很多初学者实践算法的不小的门槛。
其实,很多人不知道的是,机器学习领域经典的Python包scikit-learn已经将常用的数据集预置进去了,并封装成了‘’函数。这些数据集都是机器学习领域比较基础的数据集。他们由于数据量简单、数据含义直观等优点,常常混迹于各种课程中。最重要的是:对于自己直观地看到机器学习算法效果来说,足够了!下面,将具体介绍这些数据集。
这些数据集在安装好scikit-learn就已经存在于我们的电脑上了。主要包括以下几个数据集:
使用他们的方法非常简单。只需要执行:
from sklearn import datasets
dataset = sklearn.datasets.load_数据集名字()
#数据集
X = dataset.data
#对应标签
Y = dataset.target
当然,如果你想详细了解一下这些数据集,也可以使用以下函数:
在我们使用数据集之前,最好知道这些数据集是描述了一个什么问题,这样才能顺理成章地明白机器学习算法是怎么解决这个问题的。以下就是关于这些简单数据集的描述。
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种属性分别是:
这个数据集由国外医疗中心肿瘤研究所提供,也可以在UCI数据库中找到。
该数据集总共有良心和恶心肿瘤2大类,良性肿瘤有357个样本,恶性肿瘤有212 个样本,共569个样本,我们通过乳房CT的30个属性来判断该乳房是否患有恶心肿瘤。
具体属性请去scikit-learn官网自行查看,由于属性太多,这里就不一一列出了。
想想我们在购房的时候,必然要考虑这个房子周围配套设施、是否是学区房、离地铁近不近,邻居是不是好相处等因素。这些因素共同决定了这个房子在我们心目中的价格。美国人民也不例外,所以,美国人口普查局就收集了美国马萨诸塞州波士顿住房价格的有关信息,没想到被聪明的机器学习专家应用到了回归预测中。
这个数据集只有506个样本,总共13个属性,属性含义如下:
随着生活水平的提高,越来越多的人在平常大量摄入高油高糖的食物。糖尿病的患者人数也在逐年上升。本数据集就是通过一个糖尿病人当前的基本情况和身体指标,预测其一年之后的病情发展情况。数据集总共有442个样本。通过10个属性维度来就行区分,分别是:
注意:为了便于输入算法模型中,这10个特征变量都以标准偏差时间为中心并按比例进行了缩放处理。
数据集的名字有点拗口,不过你只要记住这是一个衡量体能的数据集就好了。
数据集的背景就是一个叫兰纳胡德(Linnerud)的人测量了某个健身俱乐部的 20 位中年男子的生理数据。被测变量分为两组子数据集。第一个子数据集包含三个生理特征:
我们解释一下多变量回归的概念:回归问题的本质就是去分析因变量与自变量之间的关系,从而为分析数据、预测数据提供科学的、合理的依据,但是通常我们所说的回归问题,是通过几个自变量得到一个结果,比如说上边提到的通过各种因素预测房价等问题。而多变量回归就是要分析多个自变量造成了多个因变量的变化规律。属于多对多的关系。
举个例子,比如现在,有一堆自变量(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_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)
构造分类数据集特有的参数的解释:
构造回归数据集完整的范例:
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)
构造回归数据集特有的参数解释:
构造聚类数据集完整的范例:
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)
构造聚类数据集特有的参数解释:
除此之外,sklearn还提供了一些更加接近现实的入门数据集,有人脸识别数据集、新闻文本数据集、森林类型数据集等。他们占用存储空间较大,需要的话可以用Python命令把他们下载下来,这里不做赘述。
机器学习超详细实践攻略(8):使用scikit-learn构建模型的通用模板【万字长文】