scikit-learn 数据集加载工具
sklearn.datasets
模块嵌入了“ 入门“部分介绍的一些小型玩具数据集。
该模块还具有帮助用户获取大型数据集的功能,这些数据集通常由机器学习社区用来模拟“现实世界”的数据来进行算法测试。
为了控制数据统计特性(通常是特征的相关性和信息性)的同时评估数据集规模(n_samples
和 n_features
)的影响,还可以生成综合数据集。
7.1 通用数据集
根据所需的数据集类型,可以使用三个主要的数据集接口来获取数据集。
The dataset loaders(数据集加载器)。它们可用于加载小的标准数据集,如“ 玩具数据集”部分所述。
The dataset fetchers(数据集提取程序)。它们可用于下载和加载更大的数据集,如“ 现实世界数据集”部分所述。
loaders和fetchers的函数返回一个sklearn.utils.Bunch
对象,这个对象至少包含两个部分:一部分是n_samples
* n_features
的数据框,与键data
(除了20个新闻组的数据集)对应;另一个是包含有目标值的长度等于n_samples
的数组,与键target
对应。
Bunch对象是一个字典,它的键是属性。有关Bunch对象的更多信息,请参见sklearn.utils.Bunch
。
通过将return_X_y
参数设置为True,几乎所有这些函数还可以将输出约束为仅包含特征数据和目标的元组。
数据集的DESCR
属性中还包含完整的说明,其中一些包含feature_names
和target_names
。有关详细信息,请参见下面的数据集描述。
The dataset generation functions(数据集生成函数)。它们可用于生成受控的合成数据集,如“ 生成的数据集”部分所述。
这些函数返回一个元组(X, y)
,该元组由一个n_samples
*n_features
的 numpy数组X
和一个 包含目标的长度为n_samples
的数组y
组成。
此外,还有其他工具可用于加载其他格式或从其他位置加载数据集,如“ 加载其他数据集” 部分所述。
7.2 玩具数据集
scikit-learn带有一些小的标准数据集,不需要从某些外部网站下载任何文件。
可以使用以下功能加载它们:
函数 | 返回 |
---|---|
load_boston (*[, return_X_y]) |
加载并返回波士顿房价数据集(回归)。 |
load_iris (*[, return_X_y, as_frame]) |
加载并返回鸢尾花数据集(分类)。 |
load_diabetes (*[, return_X_y, as_frame]) |
加载并返回糖尿病数据集(回归)。 |
load_digits (*[, n_class, return_X_y, as_frame]) |
加载并返回数字数据集(分类)。 |
load_linnerud (*[, return_X_y, as_frame]) |
加载并返回linnerud物理锻炼数据集。 |
load_wine (*[, return_X_y, as_frame]) |
加载并返回葡萄酒数据集(分类)。 |
load_breast_cancer (*[, return_X_y, as_frame]) |
加载并返回威斯康星州乳腺癌数据集(分类)。 |
这些数据集可用于快速说明scikit-learn中实现的各种算法的行为。但是,
7.2.1 波士顿房价数据集
数据集特征:
实例数 | 506 |
---|---|
属性数量 | 13个数值/分类特征,房价中位数(特征14)是标签。 |
属性信息(按顺序) | - CRIM 按城镇划分的人均犯罪率 - ZN 比例超过25,000平方英尺的住宅用地比例。 - INDUS 每个城镇非零售业务英亩的比例 - CHAS 查尔斯河虚拟变量(如果边界是河流,则为1;否则为0) - NOX 一氧化氮浓度(百万分之几) - RM 每个住宅的平均房间数 - AGE 1940年之前建造的自有住房的年龄比例 - DIS 与五个波士顿就业中心的加权距离 - RAD 高速公路通行能力指数 - TAX 每10,000美元的税全额财产税税率 - PTRATIO 按镇划分的师生比率 - B 1000(Bk-0.63)^ 2 其中Bk是按城镇划分的黑人比例 - LSTAT 人口地位降低百分比 - MEDV 自有住房的价值中位数(以1000美元计) |
缺失值 | 无 |
创作者 | Harrison, D. and Rubinfeld, D.L. |
这是UCI ML住房数据集的副本。 https://archive.ics.uci.edu/ml/machine-learning-databases/housing/
该数据集取自卡内基梅隆大学维护的StatLib库。
波士顿房价数据出现在哈里森(Harrison)和鲁宾菲尔德(Rubinfeld)的“Hedonic prices and the demand for clean air”,1978年 J. Environ. Economics & Management,第5卷,第81-102页 。后被Belsley,Kuh和Welsch用在“ Regression diagnostics … ”, Wiley, 1980. N.B. Various 。注意后者的244-261页上的表格中的数据是经过转换的。
波士顿房价数据已用于许多解决回归问题的机器学习论文中。
参考文献
Belsley, Kuh & Welsch, ‘Regression diagnostics: Identifying Influential Data and Sources of Collinearity’, Wiley, 1980. 244-261. Quinlan,R. (1993). Combining Instance-Based and Model-Based Learning. In Proceedings on the Tenth International Conference of Machine Learning, 236-243, University of Massachusetts, Amherst. Morgan Kaufmann.
7.2.2 鸢尾花植物数据集
数据集特征:
实例数 | 150(三类各50个) |
---|---|
属性数量 | 4个数值,预测属性和类别 |
属性信息 | - 萼片长度(厘米) - 萼片宽度(厘米) - 花瓣长度(厘米) - 花瓣宽度(厘米) - 类: 鸢尾花 鸢尾花 鸢尾花 |
统计摘要 | |
缺失值 | 无 |
类别分布 | 3个类别中的每类别占33.3%。 |
创作者 | R.A. Fisher |
捐赠者 | Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov) |
日期 | 1988年7月 |
著名的鸢尾花数据,最早由 R.A. Fisher 爵士使用。该数据集摘自Fisher的论文。请注意,它与R中的相同,但与UCI机器学习存储库中的不同,后者具有两个错误的数据点。
这也许是模式识别文献中最著名的数据库。Fisher的论文是该领域的经典著作,至今仍被频繁引用(请参见Duda&Hart)。数据集包含3类,每类50个实例,其中每个类都属于一种鸢尾花。一类与其他两类可线性分离;后者与其他的类别不能线性分离。
参考文献
Fisher, R.A. “The use of multiple measurements in taxonomic problems” Annual Eugenics, 7, Part II, 179-188 (1936); also in “Contributions to Mathematical Statistics” (John Wiley, NY, 1950). Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis. (Q327.D83) John Wiley & Sons. ISBN 0-471-22361-1. See page 218. Dasarathy, B.V. (1980) “Nosing Around the Neighborhood: A New System Structure and Classification Rule for Recognition in Partially Exposed Environments”. IEEE Transactions on Pattern Analysis and Machine Intelligence, Vol. PAMI-2, No. 1, 67-71. Gates, G.W. (1972) “The Reduced Nearest Neighbor Rule”. IEEE Transactions on Information Theory, May 1972, 431-433. See also: 1988 MLC Proceedings, 54-64. Cheeseman et al”s AUTOCLASS II conceptual clustering system finds 3 classes in the data. Many, many more …
7.2.3 糖尿病数据集
从442名糖尿病患者中获取每位的年龄,性别,体重指数,平均血压和六次血清测量值,共十个基线变量,以及一年后疾病进展的定量测量指标。
数据集特征:
实例数 | 442 |
---|---|
特征数量 | 前10列是数字测量值 |
标签 | 第11列是基线后一年疾病进展的定量测量 |
特征信息 | 年龄(岁) 性别 体重指数 bp平均血压 s1 tc,T细胞(一种白细胞) s2 ldl,低密度脂蛋白 s3 hdl,高密度脂蛋白 s4 tch,甲状腺刺激激素 S5 LTG,拉莫三嗪 s6 glu,血糖水平 |
注意:这10个特征变量中的每一个都以平均值为中心,并按标准偏差乘以 n_samples
(即每列总和的平方和1)进行缩放。
源URL:https : //www4.stat.ncsu.edu/~boos/var.select/diabetes.html
更多相关信息,请参见: Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani (2004) “Least Angle Regression,” Annals of Statistics (with discussion), 407-499. (https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf)
7.2.4 手写数字数据集的光学识别
数据集特征:
实例数 | 5620 |
---|---|
属性数量 | 64 |
属性信息 | 范围为0..16的整数像素的8x8图像。 |
缺失值 | 无 |
创作者 | Alpaydin (alpaydin ‘@’ boun.edu.tr) |
日期 | 1998年7月 |
这是UCI ML手写数字数据集测试集的副本 https://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handheld+Digits
数据集包含手写数字的图像:10个类别,每个类别均指一个数字。
NIST提供的预处理程序用于从预印表格中提取手写数字的标准化位图。在总共43个人中,有30个人参与了培训,而有13个人参与了测试。将32x32位图划分为4x4的非重叠块,并在每个块中统计像素点的数量。这将生成8x8的输入矩阵,其中每个元素都是0..16范围内的整数。这降低了尺寸并且产生了小的变形。
有关NIST预处理例程的信息,请参见 M. D. Garris, J. L. Blue, G. T. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C. L. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469, 1994.
参考文献
C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their Applications to Handwritten Digit Recognition, MSc Thesis, Institute of Graduate Studies in Science and Engineering, Bogazici University.
Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika. Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin. Linear dimensionalityreduction using relevance weighted LDA. School of Electrical and Electronic Engineering Nanyang Technological University. 2005. Claudio Gentile. A New Approximate Maximal Margin Classification Algorithm. NIPS. 2000.
7.2.5 Linnerrud(林纳鲁德)数据集
数据集特征:
实例数 | 20 |
---|---|
属性数量 | 3 |
缺失值 | 无 |
Linnerrud数据集是一个多输出回归数据集。它包括从健身俱乐部的二十名中年男子中收集的三个运动(data)和三个生理(target)变量:
生理-CSV包含对3个生理变量的20个观察值:
体重,腰围和脉搏。
运动-CSV包含对3个运动变量的20个观察值:
下巴,仰卧起坐和跳跃。
参考文献
Tenenhaus, M. (1998). La regression PLS: theorie et pratique. Paris: Editions Technic.
7.2.6 葡萄酒数据集
数据集特征:
实例数 | 178(3类各50个) |
---|---|
属性数量 | 13个数值,预测属性和类别 |
属性信息 | - 醇 - 苹果酸 - 灰 - 灰的碱度 - 镁 - 总酚 - 类黄酮 - 非类黄酮酚 - 原花青素 - 色彩强度 - 色调 - 稀释酒的OD280 / OD315 - 脯氨酸 - 类别: class_0 class_1 class_2 |
统计摘要 | |
缺失值 | 无 |
类别分布 | class_0(59),class_1(71),class_2(48) |
创作者 | R.A. Fisher |
捐赠者 | Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov) |
日期 | 1988年7月 |
这是UCI ML Wine识别数据集的副本。 https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data
数据是由三个不同的种植者对意大利同一地区种植的葡萄酒进行化学分析的结果。对于这三种葡萄酒中的不同成分,进行了十三项不同的测量。
原始所有者:
Forina, M. et al, PARVUS - An Extendible Package for Data Exploration, Classification and Correlation. Institute of Pharmaceutical and Food Analysis and Technologies, Via Brigata Salerno, 16147 Genoa, Italy.
引文:
Lichman, M. (2013). UCI Machine Learning Repository [https://archive.ics.uci.edu/ml]. Irvine, CA: University of California, School of Information and Computer Science.
参考文献
(1) S. Aeberhard, D. Coomans and O. de Vel, Comparison of Classifiers in High Dimensional Settings, Tech. Rep. no. 92-02, (1992), Dept. of Computer Science and Dept. of Mathematics and Statistics, James Cook University of North Queensland. (Also submitted to Technometrics).
The data was used with many others for comparing various classifiers. The classes are separable, though only RDA has achieved 100% correct classification. (RDA : 100%, QDA 99.4%, LDA 98.9%, 1NN 96.1% (z-transformed data)) (All results using the leave-one-out technique)
(2) S. Aeberhard, D. Coomans and O. de Vel, “THE CLASSIFICATION PERFORMANCE OF RDA” Tech. Rep. no. 92-01, (1992), Dept. of Computer Science and Dept. of Mathematics and Statistics, James Cook University of North Queensland. (Also submitted to Journal of Chemometrics).
7.2.7 威斯康星州乳腺癌(诊断)数据集
数据集特征:
实例数 | 569 |
---|---|
属性数量 | 30个数值型预测属性和1个类别标签 |
属性信息 | - 半径(从中心到周长上的点的距离的平均值) - 纹理(灰度值的标准差) - 周长 - 面积 - 平滑度(半径长度的局部变化) - 紧密度(周长*周长 /面积-1.0) - 凹度(轮廓凹陷的严重程度) - 凹点(轮廓的凹入部分的数量) - 对称 - 分形维数(“海岸线近似”-1) 为每个图像计算这些特征的平均值,标准和“最差”(最大值),从而得到30个特征。 例如,字段0是平均半径,字段10是半径标准差,字段20是最差半径。 标签分类: -- WDBC-恶性 -- WDBC-良性 |
统计摘要 | |
缺失值 | 无 |
类别分布 | 212-恶性,357-良性 |
创作者 | Dr. William H. Wolberg, W. Nick Street, Olvi L. Mangasarian |
捐赠者 | Nick Street |
日期 | 1995年11月 |
这是UCI ML威斯康星州(诊断)乳腺癌数据集的副本。 https://goo.gl/U2Uwz2
从乳腺肿块的细针抽吸(FNA)的数字化图像计算特征。它们描述了图像中存在的细胞核的特征。
上述分离平面是使用多表面方法树(MSM-T) [K. P. Bennett, “Decision Tree Construction Via Linear Programming.” Proceedings of the 4th Midwest Artificial Intelligence and Cognitive Science Society, pp. 97-101, 1992] ,一种使用线性规划构建决策树的分类方法。在1-4个特征和1-3个分离平面的空间中使用详尽搜索选择相关特征。
用于获得3维空间中分离平面的实际线性程序的描述如下: [K. P. Bennett and O. L. Mangasarian: “Robust Linear Programming Discrimination of Two Linearly Inseparable Sets”, Optimization Methods and Software 1, 1992, 23-34].
该数据库也可以通过UW CS ftp服务器获得:
ftp ftp.cs.wisc.edu cd math-prog/cpo-dataset/machine-learn/WDBC/
参考文献
W.N. Street, W.H. Wolberg and O.L. Mangasarian. Nuclear feature extraction for breast tumor diagnosis. IS&T/SPIE 1993 International Symposium on Electronic Imaging: Science and Technology, volume 1905, pages 861-870, San Jose, CA, 1993. O.L. Mangasarian, W.N. Street and W.H. Wolberg. Breast cancer diagnosis and prognosis via linear programming. Operations Research, 43(4), pages 570-577, July-August 1995. W.H. Wolberg, W.N. Street, and O.L. Mangasarian. Machine learning techniques to diagnose breast cancer from fine-needle aspirates. Cancer Letters 77 (1994) 163-171.
7.3 现实世界的数据集
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, …]) |
将标签的面孔加载到Wild(LFW)人数据集中(分类)。 |
fetch_lfw_pairs (*[, subset, data_home, …]) |
在“Wild(LFW)”对数据集中加载标签的面部(分类)。 |
fetch_covtype (*[, data_home, …]) |
加载covertype(植被型数据集)数据集(分类)。 |
fetch_rcv1 (*[, data_home, subset, …]) |
加载RCV1多标签数据集(分类)。 |
fetch_kddcup99 (*[, subset, data_home, …]) |
加载kddcup99(网络入侵检测)数据集(分类)。 |
fetch_california_housing (*[, data_home, …]) |
加载加利福尼亚住房数据集(回归)。 |
7.3.1 Olivetti人脸数据集
该数据集包含 1992年4月至1994年4月之间在AT&T剑桥实验室拍摄的一组面部图像。sklearn.datasets.fetch_olivetti_faces
函数是数据获取/缓存功能,可从AT&T下载数据存档。
如原始网站所述:
40个不同主题,每一个主题都有十张不同的图像。对于某些对象,图像是在不同的时间拍摄的,光线,面部表情(睁开/闭合的眼睛,微笑/不微笑)和面部细节(眼镜/不戴眼镜)均不同。所有图像都是在深色均匀背景下拍摄的,对象处于直立的,正面的位置(允许某些侧向移动)。
数据集特征:
类别 | 40 |
---|---|
样品总数 | 400 |
维数 | 4096 |
特征 | 实数,介于0和1之间 |
图像被量化为256灰度级并存储为无符号的8位整数。加载程序会将这些值转换为[0,1]区间内的浮点值,对于许多算法而言,它们更易于使用。
该数据库的“类别标签”是从0到39的整数,表示被摄人物的身份。但是,每个类只有10个示例,从无监督或半监督的角度来看,这个相对较小的数据集更加有趣。
原始数据集包含92 x 112,而这里的版本是64x64的图像。
能使用这些图像,请归功于AT&T剑桥实验室。
7.3.2 20个新闻组文本数据集
20个新闻组数据集,包括关于20个主题的大约18000个新闻帖子,分为两个子集:一个用于训练(或开发),另一个用于测试(或性能评估)。训练集和测试集之间的划分基于特定日期之前和之后发布的消息。
该模块包含两个加载程序。第一个 sklearn.datasets.fetch_20newsgroups
返回原始文本列表,这些原始文本可以馈送到文本特征提取器(例如sklearn.feature_extraction.text.CountVectorizer
使用自定义参数),以提取特征向量。第二个是sklearn.datasets.fetch_20newsgroups_vectorized
返回可用的特征,而不必使用特征提取器。
数据集特征:
类别 | 20 |
---|---|
样本总数 | 18846 |
维数 | 1个 |
特征 | 文本 |
7.3.2.1 用法
sklearn.datasets.fetch_20newsgroups
函数是一种数据获取/缓存函数,可从原始的20个新闻组网站下载数据存档,提取~/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
属性中。目标标签是代表类别的整数:
>>> 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])
通过将要加载的类别列表传递给sklearn.datasets.fetch_20newsgroups
函数,可以仅加载类别的某个子集 :
>>> 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])
7.3.2.2 将文本转换为向量
为了将文本数据用于预测或聚类模型,首先需要将文本转换为适合统计分析的数值向量。如以下示例所示,可以使用sklearn.feature_extraction.text
模块来实现此目的,该模块从20个新闻组数据的训练集中提取TF-IDF向量:
>>> 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维的空间(不到0.5%的非零特征)中,平均每个样本有159个非零分量:
>>> vectors.nnz / float(vectors.shape[0])
159.01327...
sklearn.datasets.fetch_20newsgroups_vectorized
是一个返回即用型令牌计数特征而不是文件名的函数。
7.3.2.3 过滤文本以进行更实际的训练
对于分类器来说,很容易在20个新闻组数据中出现的特定内容(如新闻组标题)上过度匹配。许多分类器得到的F分数都很高,但对于不在此时间范围内的其他文档上表现的很糟糕。
例如,让我们看看多项式朴素贝叶斯分类器的结果,该分类器可以快速训练并获得不错的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...
(使用稀疏特征的文本文档分类示例打乱了训练集和测试集,而不是按时间分段,在这种情况下,多项式朴素贝叶斯的F分数更高,为0.88。你是否对该分类器内部发生的事情感到怀疑?)
让我们来看看最有用的特征是什么:
>>> import numpy as np
>>> def show_top10(classifier, vectorizer, categories):
... feature_names = np.asarray(vectorizer.get_feature_names())
... 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]中,[名称] <[电子邮件地址]>写道:” 其他特征与当时正在发布的特定人员的姓名和电子邮件地址匹配。
凭借如此丰富的区分新闻组的线索,分类器根本无需从文本中识别主题,而且它们都表现出相同的高水平。
因此,加载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...
其他一些分类器可以更好地应对此较难的任务。可以尝试运行用于文本特征提取和评估的示例,选择使用和不使用--filter
选项来比较结果。
建议 |
---|
当评估20个新闻组数据上的文本分类器时,应删除与新闻组相关的元数据。在scikit-learn中,您可以通过设置remove=('headers', 'footers', 'quotes') 来做到这一点。F分数将较低,但是它更符合实际。 |
例子 |
---|
用于文本特征提取和评估的示例 使用稀疏特征对文本文档进行分类 |
7.3.3 Wild人脸识别数据集中的标签人脸
该数据集是通过互联网收集的名人的 JPEG 图片的集合,所有详细信息都可以在官方网站上找到:http://vis-www.cs.umass.edu/lfw/
每张图片均以一张脸为中心。典型的任务称为人脸验证:给定一对两张图片,二进制分类器必须预测这两个图片是否来自同一个人。
另一种任务是“人脸验证”或“人脸识别”:给定未知人物的面部图片,通过参考先前看到的已识别人物图片库来识别人物姓名。
人脸验证和人脸识别都是典型的任务,都是在一个经过训练的模型的输出上执行的。最流行的人脸检测模型称为Viola-Jones,在OpenCV库中实现。 该人脸检测器从各种网络中提取LFW人脸图片。
数据集特征:
类别 | 5749 |
---|---|
样本总数 | 13233 |
维数 | 5828 |
特征 | 实数,介于0和255之间 |
7.3.3.1 用法
scikit-learn
提供了两个加载程序,这些加载程序将自动下载,缓存,解析元数据文件,解码jpeg并将感兴趣的部分转换为映射的numpy数组。该数据集的大小大于200 MB。第一次加载通常需要花费几分钟以上的时间才能将JPEG文件的相关部分完全解码为numpy数组。如果数据集已被加载一次,则通过使用joblib
缓存~/scikit_learn_data/lfw_home/
文件夹中的映射版本,以下两次的加载时间少于200ms 。
第一个加载程序用于人脸识别任务:多类分类任务(因此有监督学习):
>>> 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
数组中的一个人的ID :
>>> 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
函数,都可以通过传递color=True
来获得RGB颜色通道的附加维度,在这种情况下,数据形状将为 (2200, 2, 62, 47, 3)
sklearn.datasets.fetch_lfw_pairs
的数据集被细分成3个子集:train
训练集,test
测试集和10_folds
评估集,这意味着使用10倍交叉验证方案来计算性能指标。
参考文献:
Labeled Faces in the Wild: A Database for Studying Face Recognition in Unconstrained Environments. Gary B. Huang, Manu Ramesh, Tamara Berg, and Erik Learned-Miller. University of Massachusetts, Amherst, Technical Report 07-49, October, 2007.
7.3.3.2 例子
7.3.4 森林覆盖类型数据集
该数据集中的每个样本对应于美国30m×30m的森林斑块,是为了预测每个斑块的覆盖类型(即树木的主要树种)而收集的。有七个覆盖类型,这使其成为多类分类问题。每个样本都有54个特征,在数据集的首页上进行了介绍 。其中一些特征是布尔类型,而其他特征则是离散或连续的测量值。
数据集特征:
类别 | 7 |
---|---|
样本总数 | 581012 |
维数 | 54 |
特征 | 整型 |
sklearn.datasets.fetch_covtype
将加载森林覆盖类型数据集,它返回一个类似于字典的对象,其data
参数对应特征矩阵,目标值位于target
。如有必要,将从网络上下载数据集。
7.3.5 RCV1数据集
路透社语料库第一卷(RCV1)是一个由路透社有限公司为研究目的提供的超过80万个手动分类的新闻报道的档案。该数据集在[1]中进行了详细描述。
数据集特征:
类别 | 103 |
---|---|
样本总数 | 804414 |
维数 | 47236 |
特征 | 实数,介于0和1之间 |
sklearn.datasets.fetch_rcv1
将加载以下版本:RCV1-v2,向量,完整集,主题多标签:
>>> from sklearn.datasets import fetch_rcv1
>>> rcv1 = fetch_rcv1()
它返回具有以下属性的类字典对象:
data
:特征矩阵是Scipy CSR稀疏矩阵,具有804414个样本和47236个特征。非零值包含余弦标准化的对数TF-IDF向量。在[1]中提出了一个按时间顺序的划分:前面23149个样本是训练集。最后的781265个样本是测试集。这是按照LYRL2004官方时间顺序进行的。该数组具有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主页下载数据集。压缩后的大小约为656 MB。
参考文献
1(1,2)Lewis, D. D., Yang, Y., Rose, T. G., & Li, F. (2004). RCV1: A new benchmark collection for text categorization research. The Journal of Machine Learning Research, 5, 361-397.
7.3.6 Kddcup 99(网络入侵检测)数据集
KDD Cup '99数据集是通过处理MIT Lincoln Lab [1]创建的1998 DARPA入侵检测系统(IDS)评估数据集的tcpdump部分而创建的。人工数据(在数据集首页上进行了描述)是使用封闭网络和人工注入的攻击生成的,以在后台正常活动的情况下产生大量不同类型的攻击。由于最初的目标是为监督学习算法生成大型训练集,所以有很大一部分(80.1%)的异常数据在现实世界中是不现实的,因此不适合用于旨在检测“异常”数据的无监督异常检测,即:
与正常数据在质量上有所不同 在观察中占少数。
因此,我们将KDD数据集转换为两个不同的数据集:SA和SF。
SA是通过简单选择所有正常数据和少量异常数据得出的,异常比例为1%。
SF就像在[2]中一样,简单地获取属性logged_in为正的数据,从而集中在入侵攻击上,其攻击率为0.3%。
http和smtp是SF的两个子集,对应于第三个特征等于'http'( 或者 ‘smtp’ )
一般KDD结构:
样本总数 | 4898431 |
---|---|
维数 | 41 |
特征 | 离散(整数)或连续(浮点) |
目标标签 | str,“正常”。或异常类型的名称 |
SA结构:
样本总数 | 976158 |
---|---|
维数 | 41 |
特征 | 离散(整数)或连续(浮点) |
目标标签 | str,“正常”。或异常类型的名称 |
SF结构:
样本总数 | 699691 |
---|---|
维数 | 4 |
特征 | 离散(整数)或连续(浮点) |
目标标签 | str,“正常”。或异常类型的名称 |
http结构:
样本总数 | 619052 |
---|---|
维数 | 3 |
特征 | 离散(整数)或连续(浮点) |
目标标签 | str,“正常”。或异常类型的名称 |
smtp结构:
样本总数 | 95373 |
---|---|
维数 | 3 |
特征 | 离散(整数)或连续(浮点) |
目标标签 | str,“正常”。或异常类型的名称 |
sklearn.datasets.fetch_kddcup99
将加载kddcup99数据集;它返回一个类似于字典的对象,其中data
对应特征矩阵,目标值位于中target
。如有必要,将从网络上下载数据集。
7.3.7 加州房屋数据集
数据集特征:
实例数 | 20640 |
---|---|
属性数量 | 8个数字预测属性和1个目标变量 |
属性信息 | - MedInc 中位数收入 - HouseAge 房屋平均年龄 - AveRooms 平均房间数 - AveBedrms 平均卧室数 - Population 人口 - AveOccup 平均房屋出租率 - Latitude 房子街区纬度 - Longitude 房子街区经度 |
缺失值 | 无 |
该数据集是从StatLib存储库获得的。 http://lib.stat.cmu.edu/datasets/
目标变量是加利福尼亚地区的房屋中位价。
该数据集来自1990年美国人口普查,每个人口普查区块组使用一行。街区小组是美国人口普查局发布样本数据的最小地理单位(街区小组通常人口为600至3,000人)。
可以使用该sklearn.datasets.fetch_california_housing
函数下载/加载 。
参考文献
Pace, R. Kelley and Ronald Barry, Sparse Spatial Autoregressions, Statistics and Probability Letters, 33 (1997) 291-297
7.4 生成的数据集
此外,scikit-learn包括各种随机样本生成器,可用于构建大小和复杂度受控的人工数据集。
7.4.1 分类和聚类的生成器
这些生成器生成特征矩阵和相应的离散目标。
7.4.1.1 单标签
make_blobs和make_classification通过。
make_blobs
和make_classification
都通过为每个类分配一个或多个正态分布的点集群来创建多类数据集集。 make_blobs
提供有关每个聚类的中心和标准偏差的更好控制,并用于演示聚类。 make_classification
专门通过相关,冗余和非信息性特征,类别的高斯聚类以及特征空间的线性变换等方式引入噪声
make_gaussian_quantiles
将单个高斯聚类划分为由同心超球体分隔的近似相等大小的类。 make_hastie_10_2
产生类似的10维二分类问题。
make_circles
与make_moons
生成对某些算法(例如基于质心的聚类或线性分类)具有挑战性的二维二分类数据集(包括可选的高斯噪声)。它们对于可视化很有用。make_circles
产生具有球形决策边界的高斯数据以进行二元分类,同时 make_moons
产生两个交织的半圆。
7.4.1.2 多标签
make_multilabel_classification
生成带有多个标签的随机样本,以反映出从多个主题混合而来的一堆单词。每个文档的主题数是从泊松分布中得出的,主题本身是从固定的随机分布中得出的。同样,单词的数量是从泊松分布中抽取的,单词是从多项式分布抽取的,其中每个主题都定义了单词的概率分布。 在以下方面简化了 bag-of-words mixtures (单词混合包) :
每个主题的单词分布都是独立绘制的,实际上,所有单词分布都会受到稀疏的基本分布的影响,并且会相互关联。 对于从多个主题生成的文档,所有主题在生成其词袋时均具有同等的权重。 没有标签的文档单词是随机的,而不是来自基础分布。
7.4.1.3 集群化
make_biclusters (shape, n_clusters, *[, …]) |
生成具有恒定块对角线结构的数组以进行双聚类。 |
---|---|
make_checkerboard (shape, n_clusters, *[, …]) |
生成具有棋盘格结构的数组以进行双聚类。 |
7.4.2 回归生成器
make_regression
产生的回归目标是随机特征的可选稀疏随机线性组合,带有噪声。它的特征可能是不相关的,或者是低秩的(少数特征占大多数方差)。。
其他回归生成器根据随机特征确定性地生成函数。 make_sparse_uncorrelated
产生的目标是四个具有固定系数的特征的线性组合。其他特征显示非线性关系, make_friedman1
是由多项式和正弦变换联系起来的,make_friedman2
包括特征的乘法和往复; make_friedman3
类似于目标上的arctan变换。
7.4.3 用于流形学习的生成器
make_s_curve ([n_samples, noise, random_state]) |
生成S曲线数据集。 |
---|---|
make_swiss_roll ([n_samples, noise, random_state]) |
生成瑞士卷(swiss roll)数据集。 |
7.4.4 分解生成器
make_low_rank_matrix ([n_samples, …]) |
生成具有钟形奇异值的低阶矩阵 |
---|---|
make_sparse_coded_signal (n_samples, *, …) |
生成信号作为字典元素的稀疏组合。 |
make_spd_matrix (n_dim, *[, random_state]) |
生成随机对称的正定矩阵。 |
make_sparse_spd_matrix ([dim, alpha, …]) |
生成一个稀疏对称定正矩阵。 |
7.5 加载其他数据集
7.5.1 样本图像
Scikit-learn还嵌入了一些示例 JPEG 图像,由它们的作者在知识共享许可下发布。这些图像可以用于测试算法和2维数据通道。
load_sample_images () |
加载样本图像以进行图像处理。 |
---|---|
load_sample_image (image_name) |
加载单个样本图像的numpy数组 |
警告 |
---|
图像的默认编码基于uint8 类型来存储。如果将输入转换为浮点表示,机器学习算法通常最有效。另外,如果你打算使用matplotlib.pyplpt.imshow ,不要忘记按以下示例中的步骤缩放到0-1的范围。 |
例子: |
---|
使用K均值的颜色量化 |
7.5.2 svmlight / libsvm格式的数据集
scikit-learn包括用于以svmlight / libsvm格式加载数据集的实用函数。在这种格式中,每行代码的形式是 <label> <feature-id>:<feature-value> <feature-id>:<feature-value> ...
,这种格式特别适合于稀疏数据集。在本模块中,X
使用了scipy稀疏CSR矩阵,y
使用了numpy数组。
你可以按如下方式加载数据集:
>>> from sklearn.datasets import load_svmlight_file
>>> X_train, y_train = load_svmlight_file("/path/to/train_dataset.txt")
...
你也可以一次加载两个(或更多)数据集:
>>> X_train, y_train, X_test, y_test = load_svmlight_files(
... ("/path/to/train_dataset.txt", "/path/to/test_dataset.txt"))
...
在这种情况下,X_train
并X_test
保证具有相同数量的特征。另一种达到同样效果的方法是固定特征的数量:
>>> X_test, y_test = load_svmlight_file(
... "/path/to/test_dataset.txt", n_features=X_train.shape[1])
...
相关链接: |
---|
svmlight / libsvm格式的公共数据集:https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets 更快的API兼容实现:https://github.com/mblondel/svmlight-loader |
7.5.3 从openml.org存储库下载数据集
openml.org是机器学习数据和实验的公共存储库,它允许每个人都可以上传开放的数据集。
在sklearn.datasets
模块下,可以使用 sklearn.datasets.fetch_openml
函数从存储库下载数据集。
例如,要下载小鼠大脑中基因表达的数据集:
>>> from sklearn.datasets import fetch_openml
>>> mice = fetch_openml(name='miceprotein', version=4)
要完全指定数据集,你需要提供名称和版本,尽管版本是可选的,请参见下面的“ 数据集版本”。数据集总共包含1080个示例,这些示例属于8个不同的类别:
>>> mice.data.shape
(1080, 77)
>>> mice.target.shape
(1080,)
>>> np.unique(mice.target)
array(['c-CS-m', 'c-CS-s', 'c-SC-m', 'c-SC-s', 't-CS-m', 't-CS-s', 't-SC-m', 't-SC-s'], dtype=object)
您可以通过查看DESCR
和details
属性获取有关数据集的更多信息:
>>> print(mice.DESCR)
**Author**: Clara Higuera, Katheleen J. Gardiner, Krzysztof J. Cios
**Source**: [UCI](https://archive.ics.uci.edu/ml/datasets/Mice+Protein+Expression) - 2015
**Please cite**: Higuera C, Gardiner KJ, Cios KJ (2015) Self-Organizing
Feature Maps Identify Proteins Critical to Learning in a Mouse Model of Down
Syndrome. PLoS ONE 10(6): e0129126...
>>> mice.details
{'id': '40966', 'name': 'MiceProtein', 'version': '4', 'format': 'ARFF',
'upload_date': '2017-11-08T16:00:15', 'licence': 'Public',
'url': 'https://www.openml.org/data/v1/download/17928620/MiceProtein.arff',
'file_id': '17928620', 'default_target_attribute': 'class',
'row_id_attribute': 'MouseID',
'ignore_attribute': ['Genotype', 'Treatment', 'Behavior'],
'tag': ['OpenML-CC18', 'study_135', 'study_98', 'study_99'],
'visibility': 'public', 'status': 'active',
'md5_checksum': '3c479a6885bfa0438971388283a1ce32'}
在DESCR
包含数据的任意文本说明,同时details
包含openml字典存储的元数据,如数据集id。有关更多详细信息,请参见OpenML文档。小鼠蛋白质数据集的data_id
是40609,你可以使用此id(或名称)在openml网站上获取有关该数据集的更多信息:
>>> mice.url
'https://www.openml.org/d/40966'
该data_id
还唯一识别OpenML数据集:
>>> mice.details
{'id': '4550', 'name': 'MiceProtein', 'version': '1', 'format': 'ARFF',
'creator': ...,
'upload_date': '2016-02-17T14:32:49', 'licence': 'Public', 'url':
'https://www.openml.org/data/v1/download/1804243/MiceProtein.ARFF', 'file_id':
'1804243', 'default_target_attribute': 'class', 'citation': 'Higuera C,
Gardiner KJ, Cios KJ (2015) Self-Organizing Feature Maps Identify Proteins
Critical to Learning in a Mouse Model of Down Syndrome. PLoS ONE 10(6):
e0129126. [Web Link] journal.pone.0129126', 'tag': ['OpenML100', 'study_14',
'study_34'], 'visibility': 'public', 'status': 'active', 'md5_checksum':
'3c479a6885bfa0438971388283a1ce32'}
7.5.3.1 数据集版本
数据集由唯一指定data_id
,但不一定由其名称指定。具有相同名称的数据集可以存在多个不同的“版本”,这些“版本”可以包含完全不同的数据集。如果发现某个数据集的特定版本包含重大问题,则可以将其停用。使用名称指定数据集将返回仍处于可用状态的数据集的最早版本。这意味着fetch_openml(name="miceprotein")
如果较早的版本不可用,则可能在不同的时间返回不同的结果。你可以看到我们上面获取的data_id
为40966的数据集是“ miceprotein ”数据集的版本1:
>>> mice.details['version']
'1'
实际上,该数据集只有一个版本。另一方面,鸢尾花数据集具有多个版本:
>>> iris = fetch_openml(name="iris")
>>> iris.details['version']
'1'
>>> iris.details['id']
'61'
>>> iris_61 = fetch_openml(data_id=61)
>>> iris_61.details['version']
'1'
>>> iris_61.details['id']
'61'
>>> iris_969 = fetch_openml(data_id=969)
>>> iris_969.details['version']
'3'
>>> iris_969.details['id']
'969'
用名称“ iris”指定数据集会产生最早的版本,即版本1,它的data_id
是61。为了确保始终获得此确切的数据集,最可靠的方法是通过data_id
来指定它。另一个data_id`为969的数据集是版本3(版本2已停用),并且包含数据的二进制版本:
>>> np.unique(iris_969.target)
array(['N', 'P'], dtype=object)
你还可以指定名称和版本,这也可以唯一标识数据集:
>>> iris_version_3 = fetch_openml(name="iris", version=3)
>>> iris_version_3.details['version']
'3'
>>> iris_version_3.details['id']
'969'
参考文献:
Vanschoren, van Rijn, Bischl and Torgo “OpenML: networked science in machine learning”, ACM SIGKDD Explorations Newsletter, 15(2), 49-60, 2014.
7.5.4 从外部数据集加载
scipy -learn适用于存储为numpy数组或scipy稀疏矩阵的任何数字数据。其他可转换为数字数组的类型(如panda DataFrame)也可以接受。
以下是将标准列数据加载为scikit-learn可用格式的一些推荐方法:
pandas.io 提供了从常见格式(包括CSV,Excel,JSON和SQL)读取数据的工具。也可以从元组或字典列表构造DataFrame。Pandas可以平稳地处理异构数据,并提供了用于将其操纵和转换为适合scikit-learn的数字数组的工具。 scipy.io 专门研究在科学计算环境中经常使用的二进制格式,如.mat和.arff numpy / routines.io 用于将列式数据标准加载到numpy数组中 scikit-learn datasets.load_svmlight_file
用于svmlight或libSVM稀疏格式scikit-learn datasets.load_files
用于文本文件的目录,其中每个目录的名称是每个类别的名称,每个目录内的每个文件对应于该类别中的一个样本
对于一些其他数据,例如图像,视频和音频,你可以参考:
skimage.io或 Imageio, 用于将图像和视频加载到numpy数组中 scipy.io.wavfile.read 用于将WAV文件读取到numpy数组中
存储为字符串(在panda数据流中很常见)的分类(或命名)特征需要使用sklearn.preprocessing.OneHotEncoder
或sklearn.preprocessing.OrdinalEncoder
转换为数字特征。请参阅预处理数据。
注意:如果您管理自己的数字数据,建议使用优化的文件格式,例如HDF5,以减少数据加载时间。诸如H5Py,PyTables和pandas之类的各种库都提供了Python接口,用于以该格式的数据的读取和写入。
更多建议: