8.2. 真实世界的数据集#
scikit-learn提供加载更大数据集的工具,并在必要时下载它们。
可以使用以下函数加载它们:
|
加载来自AT & T的Olivetti面部数据集(分类)。 |
|
从20个新闻组数据集加载文件名和数据(分类)。 |
|
加载并对20个新闻组数据集进行垂直化(分类)。 |
|
加载野外标签面孔(LFW)人员数据集(分类)。 |
|
加载Wild中的标签面孔(LFW)配对数据集(分类)。 |
|
加载coverype数据集(分类)。 |
|
加载RCV 1多标签数据集(分类)。 |
|
加载kddcup 99数据集(分类)。 |
|
加载加州住房数据集(回归)。 |
|
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']
真正的数据在于 filenames
和 target
美德.先知-愿目标属性是类别的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_people
和 sklearn.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.
引用
Labeled Faces in the Wild: A Database for Studying Face Recognition in Unconstrained Environments. 加里·B Huang、Manu Ramesh、Tamara Berg和Erik Learned-Miller。马萨诸塞大学,阿默斯特,技术报告07-49,2007年10月。
示例
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”,则它将返回 data
和 target
作为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
变成熊猫系列。如有必要,将从网络下载数据集。
引用
1999年DARPA离线入侵检测评估的分析和结果,Richard Lippmann、Joshua W。海恩斯、大卫·J·弗里德、乔纳森·科巴、库马尔·达斯。
K. Yamanishi, J.-I. Takeuchi, G. Williams, and P. Milne. Online unsupervised outlier detection using finite mixtures with discounting learning algorithms. In Proceedings of the sixth ACM SIGKDD international conference on Knowledge discovery and data mining, pages 320-324. ACM Press, 2000.
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. 物种分布数据集#
该数据集代表了中美洲和南美洲两个物种的地理分布。这两个物种是:
"Bradypus variegatus" ,棕喉树懒。
"Microryzomys minutus" ,也被称为森林小稻鼠,是一种生活在秘鲁、哥伦比亚、厄瓜多尔、秘鲁和委内瑞拉的啮齿动物。
该数据集不是典型的数据集,因为 Bunch
包含属性 data
和 target
没有返回。相反,我们有信息可以创建不同物种的“密度”地图。
可以使用属性构建地图的网格 x_left_lower_corner
, y_left_lower_corner
, Nx
, Ny
和 grid_size
,它们分别对应于网格左下角的x和y坐标、沿x和y轴的点数量以及网格上台阶的大小。
网格每个位置的密度包含在 coverage
属性
最后 train
和 test
属性包含有关物种在特定位置的位置的信息。
该数据集由Phillips et.提供。等人(2006)。
引用
"Maximum entropy modeling of species geographic distributions" S. J·菲利普斯,R. P·安德森,R. E. Schapire -生态建模,190:231-259,2006年。
示例