【scikit-learn基础】--『数据加载』之真实数据集

发布时间 2023-12-06 09:47:37作者: wang_yb

上一篇介绍了scikit-learn中的几个玩具数据集,本篇介绍scikit-learn提供的一些真实的数据集。
玩具数据集:scikit-learn 基础(01)--『数据加载』之玩具数据集

1. 获取数据集

与玩具数据集不同,真实的数据集的数据不仅数据特征多,而且数据量也比较大,
所以没有直接包含在scikit-learn库中。

虽然scikit-learn中提供了在线加载数据的函数,不过由于网络方面的原因,在线加载几乎不可能成功。
我离线下载了所有scikit-learn的真实数据,并且转换成了缓存文件,经测试可正常离线使用。

已经转换好的离线数据集:

  1. olivetti:https://url11.ctfile.com/f/45455611-930509718-42d985?p=6872
  2. 20newsgroups:https://url11.ctfile.com/f/45455611-930509625-f32241?p=6872
  3. lfw_home:https://url11.ctfile.com/f/45455611-930509715-c10239?p=6872
  4. covertype:https://url11.ctfile.com/f/45455611-930509631-f5e629?p=6872
  5. RCV1:https://url11.ctfile.com/f/45455611-930509760-30d2a2?p=6872
  6. kddcup99-py3:https://url11.ctfile.com/f/45455611-930509652-4f47ea?p=6872
  7. kddcup99_10-py3:https://url11.ctfile.com/f/45455611-930509637-2f0131?p=6872
  8. cal_housing:https://url11.ctfile.com/f/45455611-930509628-395dab?p=6872

:所有文件的下载密码都是:6872

下载上面的 zip 包之后,解压到本地某个目录中(下面的示例是:d:\share\sklearn-realdata),
加载离线数据集的方法如下:

import os
# sklearn一共提供了9种加载真实数据的方法
from sklearn.datasets import fetch_olivetti_faces
from sklearn.datasets import fetch_20newsgroups
from sklearn.datasets import fetch_20newsgroups_vectorized
from sklearn.datasets import fetch_lfw_people
from sklearn.datasets import fetch_lfw_pairs
from sklearn.datasets import fetch_covtype
from sklearn.datasets import fetch_rcv1
from sklearn.datasets import fetch_kddcup99
from sklearn.datasets import fetch_california_housing

home_dir = "d:\share\sklearn-realdata"
data = fetch_olivetti_faces(data_home=os.path.join(home_dir, "olivetti"))
print(data)

data = fetch_20newsgroups(data_home=os.path.join(home_dir, "20newsgroups"))
print(data)

data = fetch_20newsgroups_vectorized(data_home=os.path.join(home_dir, "20newsgroups"))
print(data)

data = fetch_lfw_people(data_home=home_dir)
print(data)
data = fetch_lfw_pairs(data_home=home_dir)
print(data)

data = fetch_covtype(data_home=home_dir)
print(data)

data = fetch_rcv1(data_home=home_dir)
print(data)

# 只加载10%的数据
data = fetch_kddcup99(data_home=home_dir)
print(data)
# 加载全部的数据
data = fetch_kddcup99(data_home=home_dir, percent10=False)
print(data)

data = fetch_california_housing(data_home=os.path.join(home_dir, "cal_housing"))
print(data)

加载离线数据集的关键在于设置 data_home 参数。

2. 数据集概况

真实数据和之前的玩具数据集相比,它的优势在于数据取自实际应用之中,更能够反映实际问题的复杂性。
用它来学习算法时,可以提前遇到各种调整模型的问题。

scikit-learn一个提供了9 种加载真实数据集的函数,实际是7 种数据集。

2.1. Olivetti 面部数据集

这个数据集来自从 AT&T,包含40 个不同个体的人脸图像的数据集,每个个体有10 张不同的图片。
这些图像是在不同的时间拍摄的,并且具有不同的照明和面部表情(睁开/闭上眼睛,微笑/不微笑)以及面部细节(戴眼镜/不戴眼镜)。

所有的图像都采用黑色均匀的背景,并且个体处于直立的正面位置,允许一定的侧移。
图像被量化为256 个灰度级并以8 位无符号整数的形式存储。
这个数据集的目标是从 0 到 39 的整数,代表图中人物的身份。
由于每一类只有十个样例,这个相对较小的数据集对无监督学习半监督学习具有有趣的挑战性。

此数据集的加载函数:fetch_olivetti_faces

2.2. 新闻组数据集

这是一个常用的文本分类数据集,包含大约20,000 篇新闻文章,这些文章均匀分布在20 个不同的主题中。

这些新闻组数据来源于 1997 年之前的新闻文章,包括各种不同的新闻来源日期
这个数据集的目标是进行文本分类,将每篇文章分配到其对应的主题中。

该数据集通常用于训练和测试文本分类算法,例如朴素贝叶斯分类器、支持向量机或决策树等。
由于数据集的大小适中,它也适用于较小的机器学习模型。

此数据集的加载函数:fetch_20newsgroupsfetch_20newsgroups_vectorized
这两个函数的主要区别在于:

  • fetch_20newsgroups返回的是一个原始的文本列表,每个新闻组的数据都以字符串形式给出
  • fetch_20newsgroups_vectorized返回的是一个可以直接用于机器学习或评估的向量数据集,它已经为文本数据进行了特征提取,返回的是一个稀疏矩阵

2.3. 人脸数据集

这个数据集是一个包含13233 张人脸图像的数据集,用于测试人脸识别算法。
这些图像均来自互联网,包含不同的人脸角度、表情和光照条件。
每张图像都给出了对应的人名,共有5749 个个体,其中大部分人只有一张图像,部分人有多张图像。

此数据集的目标是测试人脸识别算法的准确率,通常用于评估算法的准确性召回率交叉验证等。
由于数据集包含大量的人脸图像和个体,因此也适用于训练和测试深度学习模型。

此数据集的加载函数:fetch_lfw_peoplefetch_lfw_pairs
这两个函数的主要区别在于:

  • fetch_lfw_people数据集中每个人至少有一张图片,每张图片都对应不同的人。这个数据集的目标是训练一个分类器来识别不同的人
  • fetch_lfw_pairs数据集中每个人有两张不同图片。这些图片是在不同的时间、不同的光照条件下拍摄的。这个数据集的目标是训练一个分类器来识别同一个人在不同条件下的图片

2.4. 森林覆盖数据集

这个数据集是一个包含森林覆盖类型信息的植被覆盖类型数据集。
该数据集包含581,012 个样本,每个样本是一个30m x 30m 区域的森林覆盖类型,
包括 7 种类型:云杉/冷杉、洛奇波尔松、黄松、三叶杨/柳树、阿斯彭、花旗松和克鲁姆霍尔茨。

除了前 10 个特征是浮点数外,其余特征都是one-hot 变量。这个数据集的目标是预测给定区域的森林覆盖类型。
适用于分类相关的机器学习算法的测试。

此数据集的加载函数:fetch_covtype

2.5. RCV1 多标签数据集

这个数据集是一个包含1063389 个样本的大规模文本分类数据集。
该数据集由英国广播公司(BBC)和英国邮报(The Guardian)的新闻文章组成,每篇文章都被标记为其中一个类别(例如体育、娱乐、政治等)。

RCV1数据集的目标是训练和测试文本分类算法。由于数据集规模较大,它适合用于评估大型机器学习模型和分布式计算系统的性能。
RCV1数据集包含多个属性,如文本内容、类别标签和样本权重等,可以用于训练多种不同类型的文本分类模型,例如朴素贝叶斯分类器、支持向量机或深度学习模型等。

此数据集的加载函数:fetch_rcv1

2.6. kddcup99 数据集

这个数据集是一个网络入侵检测的数据集,源自DARPA入侵检测评估项目。
该数据集包含了 9 个星期的网络连接数据,分为训练集测试集两部分。

训练集包含了4920917条连接记录,测试集包含了4555136条连接记录。
这些连接记录涵盖了多种网络协议和攻击类型,例如 TCP、UDP、ICMP 等以及 DoS、U2R、R2L 等攻击类型。
数据集中的每个连接记录包含41 个固定的特征属性,包括源 IP 地址、目的 IP 地址、协议类型、字节数等,以及一个类标识符表示该连接是否属于攻击类型。

kddcup99数据集是网络入侵检测领域广泛使用的事实基准数据集,可用于评估和比较不同入侵检测算法的性能。

此数据集的加载函数:fetch_kddcup99
由于此数据集数据量很大,所以默认只加载 10%的数据,若要加载全部数据设置参数percent10=False
本文第一节加载离线数据的示例中也加载示例。

2.7. 加州住房数据集

这个数据集包含了加利福尼亚州 1990 年所有城市的房价信息。
数据集中的每个样本都包含 8 个变量的值:

  1. MedianHouseValue(中位数房价):以 1000 美元为单位。
  2. MedianIncome(中位数收入):以年为单位,以美元为单位。
  3. HouseAge(房龄):以年为单位。
  4. Rooms(房间数):整数。
  5. Bedrooms(卧室数):整数。
  6. Population(人口):以 1000 人为单位。
  7. HousingUnits(房屋数量):以千为单位。
  8. SquareMiles(平方英里):以平方英里为单位。

该数据集被广泛用于房价预测相关的机器学习算法的学习中。
此数据集的加载函数:fetch_california_housing

3. 总结

当机器学习的算法掌握到一定程度的时候,一定会想尝试用真实的数据集来训练模型。
这些经典的真实数据集不仅数据量丰富,而且涵盖的范围广,用来练手和提高自己的能力再好不过。