8.2. 真实世界的数据集#

scikit-learn提供加载更大数据集的工具,并在必要时下载它们。

可以使用以下函数加载它们:

fetch_olivetti_faces(*[, data_home, ...])

加载来自AT & T的Olivetti面部数据集(分类)。

fetch_20newsgroups(*[, data_home, subset, ...])

从20个新闻组数据集加载文件名和数据(分类)。

fetch_20newsgroups_vectorized(*[, subset, ...])

加载并对20个新闻组数据集进行垂直化(分类)。

fetch_lfw_people(*[, data_home, funneled, ...])

加载野外标签面孔(LFW)人员数据集(分类)。

fetch_lfw_pairs(*[, subset, data_home, ...])

加载Wild中的标签面孔(LFW)配对数据集(分类)。

fetch_covtype(*[, data_home, ...])

加载coverype数据集(分类)。

fetch_rcv1(*[, data_home, subset, ...])

加载RCV 1多标签数据集(分类)。

fetch_kddcup99(*[, subset, data_home, ...])

加载kddcup 99数据集(分类)。

fetch_california_housing(*[, data_home, ...])

加载加州住房数据集(回归)。

fetch_species_distributions(*[, data_home, ...])

Phillips et.物种分布数据集的加载器。

8.2.1. 奥利韦蒂面临数据集#

This dataset contains a set of face images taken between April 1992 and April 1994 at AT&T Laboratories Cambridge. The sklearn.datasets.fetch_olivetti_faces function is the data fetching / caching function that downloads the data archive from AT&T.

如原网站所述:

40个不同主题中的每一个都有10个不同的图像。对于某些受试者来说,图像是在不同时间拍摄的,改变了灯光、面部表情(睁开/闭眼睛、微笑/不微笑)和面部细节(戴眼镜/不戴眼镜)。所有图像都是在黑暗的均匀背景下拍摄的,受试者处于直立的正面位置(允许一些侧向移动)。

Data Set Characteristics:

40

样本总数

400

维度

4096

特征

真实的,在0和1之间

图像被量化为256个灰度级,并存储为无符号8位整数;加载程序将这些值按时间间隔转换为浮点值 [0, 1] ,对于许多算法来说,它们更容易使用。

该数据库的“目标”是0到39之间的一个整数,指示照片中的人的身份;然而,每个类别只有10个示例,因此从无监督或半监督的角度来看,这个相对较小的数据集更有趣。

原始数据集由92 x 112组成,而此处提供的版本由64 x 64图像组成。

使用这些图像时,请归功于AT & T剑桥实验室。

8.2.2. 20个新闻组文本数据集#

20个新闻组数据集包含约18000个新闻组帖子,涉及20个主题,分为两个子集:一个用于培训(或开发),另一个用于测试(或性能评估)。列车和测试集之间的划分基于特定日期之前和之后发布的消息。

此模块包含两个加载器。第一个, sklearn.datasets.fetch_20newsgroups ,返回可以被反馈给文本特征提取器的原始文本列表,例如 CountVectorizer 使用自定义参数来提取特征载体。第二个, sklearn.datasets.fetch_20newsgroups_vectorized ,返回即用功能,即没有必要使用特征提取器。

Data Set Characteristics:

20

样本总数

18846

维度

1

特征

文本

使用#

sklearn.datasets.fetch_20newsgroups 功能是一个数据获取/缓存功能,可以从原始数据档案下载数据档案 20 newsgroups website ,提取中的档案内容 ~/scikit_learn_data/20news_home 文件夹并调用 sklearn.datasets.load_files 在训练集或测试集文件夹中,或两者兼而有之::

>>> from sklearn.datasets import fetch_20newsgroups
>>> newsgroups_train = fetch_20newsgroups(subset='train')

>>> from pprint import pprint
>>> pprint(list(newsgroups_train.target_names))
['alt.atheism',
 'comp.graphics',
 'comp.os.ms-windows.misc',
 'comp.sys.ibm.pc.hardware',
 'comp.sys.mac.hardware',
 'comp.windows.x',
 'misc.forsale',
 'rec.autos',
 'rec.motorcycles',
 'rec.sport.baseball',
 'rec.sport.hockey',
 'sci.crypt',
 'sci.electronics',
 'sci.med',
 'sci.space',
 'soc.religion.christian',
 'talk.politics.guns',
 'talk.politics.mideast',
 'talk.politics.misc',
 'talk.religion.misc']

真正的数据在于 filenamestarget 美德.先知-愿目标属性是类别的integer索引::

>>> newsgroups_train.filenames.shape
(11314,)
>>> newsgroups_train.target.shape
(11314,)
>>> newsgroups_train.target[:10]
array([ 7,  4,  4,  1, 14, 16, 13,  3,  2,  4])

It is possible to load only a sub-selection of the categories by passing the list of the categories to load to the sklearn.datasets.fetch_20newsgroups function:

>>> cats = ['alt.atheism', 'sci.space']
>>> newsgroups_train = fetch_20newsgroups(subset='train', categories=cats)

>>> list(newsgroups_train.target_names)
['alt.atheism', 'sci.space']
>>> newsgroups_train.filenames.shape
(1073,)
>>> newsgroups_train.target.shape
(1073,)
>>> newsgroups_train.target[:10]
array([0, 1, 1, 1, 0, 1, 1, 0, 0, 0])
将文本转换为载体#

为了向预测或集群模型提供文本数据,首先需要将文本转化为适合统计分析的数值载体。这可以通过 sklearn.feature_extraction.text as demonstrated in the following example that extract TF-IDF 来自20个新闻子集的一元语法令牌的载体::

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> categories = ['alt.atheism', 'talk.religion.misc',
...               'comp.graphics', 'sci.space']
>>> newsgroups_train = fetch_20newsgroups(subset='train',
...                                       categories=categories)
>>> vectorizer = TfidfVectorizer()
>>> vectors = vectorizer.fit_transform(newsgroups_train.data)
>>> vectors.shape
(2034, 34118)

提取的TF-IDF载体非常稀疏,在超过30000维的空间中平均有159个非零分量(非零特征不到0.5%)::

>>> vectors.nnz / float(vectors.shape[0])
159.01327...

sklearn.datasets.fetch_20newsgroups_vectorized 是一个返回即用型令牌计数特征而不是文件名的函数。

过滤文本以进行更真实的训练#

分类器很容易过度适应20个新闻组数据中出现的特定内容,例如新闻组标题。许多分类器获得了非常高的F分数,但他们的结果不会推广到不是来自此时间窗口的其他文档。

例如,让我们来看看多项Naive Bayes分类器的结果,它训练速度很快,并且获得了不错的F分数::

>>> from sklearn.naive_bayes import MultinomialNB
>>> from sklearn import metrics
>>> newsgroups_test = fetch_20newsgroups(subset='test',
...                                      categories=categories)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> clf = MultinomialNB(alpha=.01)
>>> clf.fit(vectors, newsgroups_train.target)
MultinomialNB(alpha=0.01, class_prior=None, fit_prior=True)

>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(newsgroups_test.target, pred, average='macro')
0.88213...

(The例如 使用稀疏特征对文本文档进行分类 对训练和测试数据进行洗牌,而不是按时间进行细分,在这种情况下,多项Naive Bayes获得更高的F分数,即0.88。您是否怀疑这个分类器内部发生的事情?)

让我们来看看最具信息性的功能是什么:

>>> import numpy as np
>>> def show_top10(classifier, vectorizer, categories):
...     feature_names = vectorizer.get_feature_names_out()
...     for i, category in enumerate(categories):
...         top10 = np.argsort(classifier.coef_[i])[-10:]
...         print("%s: %s" % (category, " ".join(feature_names[top10])))
...
>>> show_top10(clf, vectorizer, newsgroups_train.target_names)
alt.atheism: edu it and in you that is of to the
comp.graphics: edu in graphics it is for and of to the
sci.space: edu it that is in and space to of the
talk.religion.misc: not it you in is that and to of the

现在您可以看到这些功能过度适合的许多事情:

  • 几乎每个组都通过标题是否如 NNTP-Posting-Host:Distribution: 或多或少地出现。

  • 另一个重要特征涉及发件人是否隶属于大学,如其标题或签名所示。

  • “文章”一词是一个重要特征,这取决于人们引用之前类似这样帖子的频率:“在文章中 [article ID] , [name] < [e-mail address] ”他写道:“

  • 其他功能匹配当时发布的特定人员的姓名和电子邮件地址。

由于有如此丰富的线索来区分新闻组,分类器几乎不必从文本中识别主题,而且它们的表现都处于相同的高水平。

因此,加载20个新闻组数据的函数提供了一个名为 remove ,告诉它要从每个文件中删除哪些类型的信息。 remove 应该是包含的任何子集的数组 ('headers', 'footers', 'quotes') ,告诉它分别删除标题、签名块和引用块。

>>> newsgroups_test = fetch_20newsgroups(subset='test',
...                                      remove=('headers', 'footers', 'quotes'),
...                                      categories=categories)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(pred, newsgroups_test.target, average='macro')
0.77310...

这个分类器失去了很多F分数,只是因为我们删除了与主题分类关系不大的元数据。如果我们也从训练数据中删除此元数据,它会损失更多:

>>> newsgroups_train = fetch_20newsgroups(subset='train',
...                                       remove=('headers', 'footers', 'quotes'),
...                                       categories=categories)
>>> vectors = vectorizer.fit_transform(newsgroups_train.data)
>>> clf = MultinomialNB(alpha=.01)
>>> clf.fit(vectors, newsgroups_train.target)
MultinomialNB(alpha=0.01, class_prior=None, fit_prior=True)
>>> vectors_test = vectorizer.transform(newsgroups_test.data)
>>> pred = clf.predict(vectors_test)
>>> metrics.f1_score(newsgroups_test.target, pred, average='macro')
0.76995...

Some other classifiers cope better with this harder version of the task. Try the 用于文本特征提取和评估的样本管道 example with and without the remove option to compare the results.

数据考虑

克利夫兰印第安人队是一支总部位于美国俄亥俄州克利夫兰的美国职业棒球大联盟队。2020年12月,据报道,“经过乔治·弗洛伊德之死以及全国对种族和殖民主义的清算引发的数月讨论,克利夫兰印第安人队决定改名。“球队老板保罗·多兰”确实明确表示,球队不会将其非正式昵称--部落--作为新的球队名称。“这与印第安人不会有半步之遥,”多兰说。“我们不会有一个以美洲原住民为主题的名字。"

https://www.mlb.com/news/cleveland-indians-team-name-change

建议

  • 当评估20个新闻组数据的文本分类器时,您应该删除与新闻组相关的元数据。在scikit-learn中,您可以通过设置来做到这一点 remove=('headers', 'footers', 'quotes') . F分数会更低,因为它更真实。

  • 此文本数据集包含可能不适合某些NLP应用程序的数据。上面的“数据考虑因素”部分列出了一个示例。在NLP中使用当前文本数据集执行句子完成、集群和其他应用程序等任务的挑战是,具有文化偏见和煽动性的文本会传播偏见。在使用数据集、审查输出时应该考虑到这一点,并且应该记录偏差。

示例

8.2.3. Wild人脸识别数据集中的Labeled Faces#

该数据集是通过互联网收集的名人JPEG图片的集合,详细信息可在Kaggle网站上获取:

https://www.kaggle.com/datasets/jessicali9530/lfw-dataset

每张照片都以一张脸为中心。典型的任务称为面部验证:给定一对两张图片,二进制分类器必须预测这两张图像是否来自同一个人。

另一项任务是面部识别或面部识别:给定未知人员的面部照片,通过参考之前看到的已识别人员的照片库来识别该人员的姓名。

面部验证和面部识别都是通常在经过训练以执行面部检测的模型的输出上执行的任务。最受欢迎的面部检测模型被称为Viola-Jones,在OpenCV库中实现。LFW人脸是由该人脸检测器从各个在线网站提取的。

Data Set Characteristics:

5749

样本总数

13233

维度

5828

特征

真实的,在0到255之间

使用#

scikit-learn 提供了两个加载器,它们将自动下载、缓存、解析元数据文件、解码jpeg并将感兴趣的切片转换为memm映射的numpy数组。此数据集大小超过200 MB。第一次加载通常需要几分钟以上的时间才能将JPEG文件的相关部分完全解码为麻木的数组。如果数据集已加载一次,则通过使用在磁盘上存储的memmapped版本,以下时间的加载时间小于200 ms ~/scikit_learn_data/lfw_home/ 文件夹使用 joblib .

第一个加载器用于面部识别任务:多类分类任务(因此是监督学习)::

>>> from sklearn.datasets import fetch_lfw_people
>>> lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)

>>> for name in lfw_people.target_names:
...     print(name)
...
Ariel Sharon
Colin Powell
Donald Rumsfeld
George W Bush
Gerhard Schroeder
Hugo Chavez
Tony Blair

默认切片是面部周围的矩形形状,删除了大部分背景::

>>> lfw_people.data.dtype
dtype('float32')

>>> lfw_people.data.shape
(1288, 1850)

>>> lfw_people.images.shape
(1288, 50, 37)

每个 1140 面孔被分配给 target 数组::

>>> lfw_people.target.shape
(1288,)

>>> list(lfw_people.target[:10])
[5, 6, 3, 1, 0, 1, 3, 4, 3, 0]

第二个加载器通常用于面部验证任务:每个样本是一对两张图片,属于或不属于同一个人::

>>> from sklearn.datasets import fetch_lfw_pairs
>>> lfw_pairs_train = fetch_lfw_pairs(subset='train')

>>> list(lfw_pairs_train.target_names)
['Different persons', 'Same person']

>>> lfw_pairs_train.pairs.shape
(2200, 2, 62, 47)

>>> lfw_pairs_train.data.shape
(2200, 5828)

>>> lfw_pairs_train.target.shape
(2200,)

既为 sklearn.datasets.fetch_lfw_peoplesklearn.datasets.fetch_lfw_pairs 函数可以通过传递获得具有Ruby颜色通道的额外维度 color=True ,在这种情况下,形状将是 (2200, 2, 62, 47, 3) .

The sklearn.datasets.fetch_lfw_pairs datasets is subdivided into 3 subsets: the development train set, the development test set and an evaluation 10_folds set meant to compute performance metrics using a 10-folds cross validation scheme.

引用

示例

8.2.4. 森林覆盖类型#

该数据集中的样本对应于美国30 x 30 m的森林斑块,收集这些斑块的任务是预测每个斑块的覆盖类型,即树木的优势物种。有七种覆盖类型,这使得这是一个多类分类问题。每个样本都有54个特征,在 dataset's homepage .一些特征是布尔指标,而另一些是离散或连续的测量。

Data Set Characteristics:

7

样本总数

581012

维度

54

特征

int

sklearn.datasets.fetch_covtype 将加载coverype数据集;它返回一个类似字典的“Bunch”对象,其中包含特征矩阵 data 成员和目标值 target .如果可选参数“as_Frame”设置为“True”,则它将返回 datatarget 作为pandas数据框架,并且将有一个额外的成员 frame 也如有必要,将从网络下载数据集。

8.2.5. RCV 1数据集#

路透社语料库第一卷(RCV1)是路透社有限公司提供的用于研究目的的超过80万个手动分类新闻专线故事的存档。该数据集在 [1].

Data Set Characteristics:

103

样本总数

804414

维度

47236

特征

真实的,在0和1之间

sklearn.datasets.fetch_rcv1 将加载以下版本:RCV 1-v2、载体、全集、主题多标签::

>>> from sklearn.datasets import fetch_rcv1
>>> rcv1 = fetch_rcv1()

它返回一个类似字典的对象,具有以下属性:

data 特征矩阵是一个scipy CSR稀疏矩阵,具有804414个样本和47236个特征。非零值包含余弦归一化的对数TF-IDF向量。一个几乎按时间顺序划分的建议, [1]: 前23149个样本是训练集。最后的781265样本是测试集。这遵循了LIRL 2004官方的时间顺序划分。该数组有0.16%的非零值::

>>> rcv1.data.shape
(804414, 47236)

target :目标值存储在scipy CSR稀疏矩阵中,具有804414个样本和103个类别。每个样本在其类别中的值为1,在其他类别中的值为0。数组有3.15%的非零值:

>>> rcv1.target.shape
(804414, 103)

sample_id :每个样本都可以通过其ID识别,范围(有差距)从2286到810596::

>>> rcv1.sample_id[:3]
array([2286, 2287, 2288], dtype=uint32)

target_names :目标值是每个样本的主题。每个样本至少属于一个主题,最多属于17个主题。有103个主题,每个主题由一个字符串表示。他们的数据库频率跨越五个数量级,从“GMIL”的5次出现到“CCAT”的381327次:

>>> rcv1.target_names[:3].tolist()
['E11', 'ECAT', 'M11']

该数据集将从 rcv1 homepage 必要时压缩大小约为656 MB。

引用

8.2.6. Kddcup 99数据集#

KDD Cup ' 99数据集是通过处理麻省理工学院林肯实验室创建的1998年DARPA入侵检测系统(IDS)评估数据集的tcpdump部分创建的 [2]. 人工数据(在 dataset's homepage )是使用封闭网络和手动注入攻击生成的,以产生大量不同类型的攻击,并在后台正常活动。由于最初的目标是为监督学习算法产生大规模的训练集,因此存在很大比例(80.1%)的异常数据,这在现实世界中是不现实的,并且不适合旨在检测“异常”数据的无监督异常检测,即:

  • 与正常数据有质的差异

  • 在观察结果中占绝大多数。

因此,我们将KDD数据集转换为两个不同的数据集:SA和SF。

  • SA是通过简单选择所有正常数据和一小部分异常数据来获得的,异常比例为1%。

  • SF的获得方式如下 [3] 通过简单地拾取属性logic_in为正的数据,从而专注于入侵攻击,这给出了攻击的0.3%的比例。

  • http and smtp are two subsets of SF corresponding with third feature equal to 'http' (resp. to 'smtp').

一般KDD结构:

样本总数

4898431

维度

41

特征

离散(int)或连续(float)

目标

字符串,'正常。”或异常类型的名称

SA结构:

样本总数

976158

维度

41

特征

离散(int)或连续(float)

目标

字符串,'正常。”或异常类型的名称

SF结构:

样本总数

699691

维度

4

特征

离散(int)或连续(float)

目标

字符串,'正常。”或异常类型的名称

http结构:

样本总数

619052

维度

3

特征

离散(int)或连续(float)

目标

字符串,'正常。”或异常类型的名称

smtp结构:

样本总数

95373

维度

3

特征

离散(int)或连续(float)

目标

字符串,'正常。”或异常类型的名称

sklearn.datasets.fetch_kddcup99 将加载kddcup 99数据集;它返回一个类似字典的对象,其中包含特征矩阵 data 成员和目标值 target .“as_Frame”可选参数转换 data 转换为熊猫数据框架, target 变成熊猫系列。如有必要,将从网络下载数据集。

引用

8.2.7. 加州住房数据集#

Data Set Characteristics:

实例数:

20640

数量的属性:

8个数字、预测属性和目标

属性信息:
  • MedInc 区块组的中位数收入

  • HouseAge median house age in block group

  • AveRooms 每户平均房间数

  • 阿维贝德姆斯 每户平均卧室数

  • 人口 街区群体人口

  • 阿维·奥卡普 家庭成员平均人数

  • 纬度 块组纬度

  • Longitude block group longitude

缺少属性值:

没有一

该数据集从StatLib存储库中获得。https://www.dcc.fc.up.pt/~ltorgo/Regression/cal_housing.html

目标变量是加州地区的房屋价值中位数,以数十万美元(10万美元)表示。

该数据集源自1990年美国人口普查,每个人口普查区组使用一行。街区群体是美国人口普查局发布样本数据的最小地理单位(街区群体通常有600至3,000人)。

家庭是居住在家中的一群人。由于此数据集中提供了每个家庭中的房间和卧室的平均数量,因此对于家庭较少且空房子较多的街区组(例如度假胜地)来说,这些列可能会获得惊人的大值。

可以使用下载/加载 sklearn.datasets.fetch_california_housing 功能

引用

  • 佩斯河Kelley和Ronald Barry,稀疏空间自回归,统计学和概率快报,33:291-297,1997年。

8.2.8. 物种分布数据集#

该数据集代表了中美洲和南美洲两个物种的地理分布。这两个物种是:

该数据集不是典型的数据集,因为 Bunch 包含属性 datatarget 没有返回。相反,我们有信息可以创建不同物种的“密度”地图。

可以使用属性构建地图的网格 x_left_lower_corner , y_left_lower_corner , Nx , Nygrid_size ,它们分别对应于网格左下角的x和y坐标、沿x和y轴的点数量以及网格上台阶的大小。

网格每个位置的密度包含在 coverage 属性

最后 traintest 属性包含有关物种在特定位置的位置的信息。

该数据集由Phillips et.提供。等人(2006)。

引用

示例