数据集快速生成方法集合
- 一、numpy生成随机数据
- 1) rand(d0, d1, ..., dn)
- 2) randn((d0, d1, ..., dn)
- 3) randint(low[, high, size])
- 4) random_integers(low[, high, size])
- 5) random_sample([size])
- 二、sklearn生成随机数据
- 2.1 回归模型随机数据
- 3.2 分类模型随机数据
- 3.3 聚类模型随机数据
- 3.4 分组正态分布混合数据
- 三、seaborn自带数据集(22个)
- 四、pyod.utils.data生成数据集
- 五、vega_datasets自带数据集(17个)
- 六、各平台公开数据集
在学习机器学习算法的过程中,我们经常需要数据来验证算法,调试参数。但是找到一组十分合适某种特定算法类型的数据样本却不那么容易。下面介绍一些我搜集和整理的数据集快速生成方法及案例:
一、numpy生成随机数据
参考资料:
机器学习算法的随机数据生成 numpy比较适合用来生产一些简单的抽样数据。API都在random类中,常见的API有:
1) rand(d0, d1, …, dn)
用来生成d0×d1×…dn维的数组 。数组的值在[0,1)之间
例如: np.random.rand(3,2,2),输出3×2×2的数组
array([[[ 0.49042678, 0.60643763],
[ 0.18370487, 0.10836908]],
[[ 0.38269728, 0.66130293],
[ 0.5775944 , 0.52354981]],
[[ 0.71705929, 0.89453574],
[ 0.36245334, 0.37545211]]])
2) randn((d0, d1, …, dn)
也是用来生成d0xd1x…dn维的数组。不过数组的值服从N(0,1)的标准正态分布。
例如:np.random.randn(3,2),输出如下3x2的数组,这些值是N(0,1)的抽样数据。
array([[-0.5889483 , -0.34054626],
[-2.03094528, -0.21205145],
[-0.20804811, -0.97289898]])
如果需要服从正态分布,只需要在randn上每个生成的值x上做变换即可 。
例如: 2*np.random.randn(3,2) + 1,输出如下3x2的数组,这些值是N(1,4)的抽样数据。
array([[ 2.32910328, -0.677016 ],
[-0.09049511, 1.04687598],
[ 2.13493001, 3.30025852]])
3) randint(low[, high, size])
生成随机的大小为size的数据,size可以为整数,为矩阵维数,或者张量的维数。值位于半开区间 [low, high)。
例如:np.random.randint(3, size=[2,3,4])返回维数维2x3x4的数据,取值范围为最大值为3的整数。
array([[[2, 1, 2, 1],
[0, 1, 2, 1],
[2, 1, 0, 2]],
[[0, 1, 0, 0],
[1, 1, 2, 1],
[1, 0, 1, 2]]])
再比如: np.random.randint(3, 6, size=[2,3]) 返回维数为2x3的数据。取值范围为[3,6).
array([[4, 5, 3],
[3, 4, 5]])
4) random_integers(low[, high, size])
和上面的randint类似,区别在于取值范围是闭区间[low, high]。
5) random_sample([size])
返回随机的浮点数,在半开区间 [0.0, 1.0)。如果是其他区间[a,b),可以加以转换(b - a) * random_sample([size]) + a
例如: (5-2)*np.random.random_sample(3)+2 返回[2,5)之间的3个随机数。
array([ 2.87037573, 4.33790491, 2.1662832 ])
二、sklearn生成随机数据
scikit-learn生成随机数据的API都在datasets类之中,和numpy比起来,可以用来生成适合特定机器学习模型的数据。常用的API有:
- 用make_regression生成回归模型的数据
- 用make_hastie_10_2,make_classification或者make_multilabel_classification生成分类模型数据
- 用make_blobs生成聚类模型数据
- 用make_gaussian_quantiles生成分组多维正态分布的数据
2.1 回归模型随机数据
这里我们使用make_regression生成回归模型数据。几个关键参数有n_samples(生成样本数), n_features(样本特征数),noise(样本随机噪音)和coef(是否返回回归系数)。例子代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_regression
# X为样本特征,y为样本输出, coef为回归系数,共1000个样本,每个样本1个特征
X, y, coef =make_regression(n_samples=1000, n_features=1,noise=10, coef=True)
# 画图
plt.scatter(X, y, color='black')
plt.plot(X, X*coef, color='blue',linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
输出的图如下:
3.2 分类模型随机数据
这里我们用make_classification生成三元分类模型数据。几个关键参数有n_samples(生成样本数), n_features(样本特征数), n_redundant(冗余特征数)和n_classes(输出的类别数),例子代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_classification
# X1为样本特征,Y1为样本类别输出, 共400个样本,每个样本2个特征,输出有3个类别,没有冗余特征,每个类别一个簇
X1, Y1 = make_classification(n_samples=400, n_features=2, n_redundant=0,
n_clusters_per_class=1, n_classes=3)
plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)
plt.show()
输出的图如下:
3.3 聚类模型随机数据
这里我们用make_blobs生成聚类模型数据。几个关键参数有n_samples(生成样本数), n_features(样本特征数),centers(簇中心的个数或者自定义的簇中心) 和 cluster_std(簇数据方差,代表簇的聚合程度)。例子如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共3个簇,簇中心在[-1,-1], [1,1], [2,2], 簇方差分别为[0.4, 0.5, 0.2]
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [1,1], [2,2]], cluster_std=[0.4, 0.5, 0.2])
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
plt.show()
输出的图如下:
3.4 分组正态分布混合数据
我们用make_gaussian_quantiles生成分组多维正态分布的数据。几个关键参数有n_samples(生成样本数), n_features(正态分布的维数),mean(特征均值),cov(样本协方差的系数), n_classes(数据在正态分布中按分位数分配的组数)。例子如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_gaussian_quantiles
#生成2维正态分布,生成的数据按分位数分成3组,1000个样本,2个样本特征均值为1和2,协方差系数为2
X1, Y1 = make_gaussian_quantiles(n_samples=1000, n_features=2, n_classes=3, mean=[1,2],cov=2)
plt.scatter(X1[:, 0], X1[:, 1], marker='o', c=Y1)
plt.show()
输出图如下:
三、seaborn自带数据集(22个)
seaborn内置了十几个示例数据集,通过load_dataset函数可以调用。
# 查看数据集种类
import seaborn as sns
print(sns.get_dataset_names())
# ['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds', 'dots', 'dowjones', 'exercise', 'flights', 'fmri', 'geyser', 'glue', 'healthexp', 'iris', 'mpg', 'penguins', 'planets', 'seaice', 'taxis', 'tips', 'titanic']
# 加载数据集
df = sns.load_dataset('titanic')
有时候因为网络问题等原因无法访问。
这时候直接去github上手动下载一下可解决问题
https://github.com/mwaskom/seaborn-data
下载zip格式文档,下载完且压缩后,放到本地seaborn-data文件夹【文件夹搜索文件夹名即可搜到一个空文件夹】里,就可以正常调用load_dataset函数了。
df = sns.load_dataset('titanic')
print(df.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 survived 891 non-null int64
1 pclass 891 non-null int64
2 sex 891 non-null object
3 age 714 non-null float64
4 sibsp 891 non-null int64
5 parch 891 non-null int64
6 fare 891 non-null float64
7 embarked 889 non-null object
8 class 891 non-null category
9 who 891 non-null object
10 adult_male 891 non-null bool
11 deck 203 non-null category
12 embark_town 889 non-null object
13 alive 891 non-null object
14 alone 891 non-null bool
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.7+ KB
None
四、pyod.utils.data生成数据集
参考资料:Pyod文档:https://pyod.readthedocs.io/en/latest/index.html PyOD是用于检测多元数据中的外围对象的最全面和可扩展的Python库。这一令人兴奋但具有挑战性的领域通常被称为异常检测或异常检测。PyOD包括40多种检测算法,自2017年以来,PyOD[AZNL19]已成功应用于众多学术研究和商业产品,下载量超过800万。
在Pyod中提供了三种数据生成方法可用于快速生成带异常点的数据集:
- pyod.utils.data.generate_data(n_train=1000, n_test=500, n_features=2, contamination=0.1, train_only=False, offset=10, behaviour=‘new’, random_state=None, n_nan=0, n_inf=0)[source]
- 用于生成合成数据的实用函数。正态数据由多元高斯分布生成,离群值由均匀分布生成。返回“X_train,X_test,y_TRAINE,y_ test”。
- pyod.utils.data.generate_data_categorical(n_train=1000, n_test=500, n_features=2, n_informative=2, n_category_in=2, n_category_out=2, contamination=0.1, shuffle=True, random_state=None)[source]
- 用于生成合成分类数据的实用函数
- pyod.utils.data.generate_data_clusters(n_train=1000, n_test=500, n_clusters=2, n_features=2, contamination=0.1, size=‘same’, density=‘same’, dist=0.25, random_state=None, return_in_clusters=False)[source]
- 用于在集群中生成合成数据的实用函数。生成的数据可能涉及低密度模式问题和全局异常值,这被认为是异常值检测算法的困难任务。
下面介绍一下generate_data方法的效果及用法:
from pyod.utils.data import generate_data, get_outliers_inliers
# 创建一个带有异常值的随机数据集并绘制它
# generate random data with two features
X_train, Y_train = generate_data(n_train=1000, train_only=True, n_features=2)
# by default the outlier fraction is 0.1 in generate data function
outlier_fraction = 0.1
# store outliers and inliers in different numpy arrays
x_outliers, x_inliers = get_outliers_inliers(X_train, Y_train)
n_inliers = len(x_inliers)
n_outliers = len(x_outliers)
# separate the two features and use it to plot the data
F1 = X_train[:, [0]].reshape(-1, 1)
F2 = X_train[:, [1]].reshape(-1, 1)
# create a meshgrid
xx, yy = np.meshgrid(np.linspace(-10, 10, 200), np.linspace(-10, 10, 200))
# scatter plot
plt.scatter(F1, F2)
plt.xlabel('F1')
plt.ylabel('F2')
plt.show()
五、vega_datasets自带数据集(17个)
此软件包有几个目标:
- 在python中提供对vega-datasets上提供的数据集的直接访问。
- 以pandas数据框的形式返回结果。
- 只要数据集大小和/或许可证约束允许,就可以将数据集与包捆绑在一起,以便在没有Web连接的情况下加载数据集。
目前,该包打包了17个数据集。
# pip3 install vega_datasets
from vega_datasets import data, local_data
# 访问数据集
df = data.iris()
print(df.head(5))
# sepalLength sepalWidth petalLength petalWidth species
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# 列出本地数据集
print(local_data.list_datasets())
# ['airports', 'anscombe', 'barley', 'burtin', 'cars', 'crimea', 'driving', 'iowa-electricity', 'iris', 'la-riots', 'ohlc', 'seattle-temps', 'seattle-weather', 'sf-temps', 'stocks', 'us-employment', 'wheat']
# 数据集描述信息
print(data.iris.description)
# This classic dataset contains lengths and widths of petals and sepals for 150 iris flowers, drawn from three species. It was introduced by R.A. Fisher in 1936 [1]_.
六、各平台公开数据集
网络上还有很多有趣的公共数据集可以用来练习机器学习和深度学习,我整理了一些常用的网站供大家查阅。
- 百度aistudio数据集:https://aistudio.baidu.com/aistudio/datasetoverview
- 阿里天池数据集:https://tianchi.aliyun.com/dataset
- 科大讯飞数据集:https://challenge.xfyun.cn(AI开发者大赛,参赛获取数据集)
- Kaggle数据集:https://www.kaggle.com/datasets
- AIOPS智能运维数据集:https://www.aiops-challenge.com
- 千言开源数据集:
- 千言是由百度联合中国计算机学会、中国中文信息学会共同发起的面向自然语言处理的开源数据集项目,携手高校和企业的数据资源研发者共同建设中文开源数据集,旨在推动中文信息处理技术的进步。千言开源数据集项目自 2020 年 8 月发布以来,吸引来自清华、哈工大、中科院、美团、腾讯、OPPO 等近20家企业和高校的数据集作者加入共同建设。目前,千言已经针对十余个任务,汇集了近50个开源数据集。
- https://mp.weixin.qq.com/s/bZXVfhhekUCi_hjIXC8f2Q
- NasaPcoe数据集:https://www.nasa.gov/intelligent-systems-division
- 和鲸社区数据集:https://www.heywhale.com/home/dataset
- datafountain数据集:https://www.datafountain.cn/datasets
- 伏龙平台电池数据集:https://docs.vloong.thinkenergy.tech/vloong/dev_resources/public_dataset
- 【开源】23个优秀的机器学习数据集及介绍:https://www.yuque.com/seafyliang/tahcx7/hmezld
- 50个机器学习公共数据集:https://mp.weixin.qq.com/s/Gr6jGYN2kmLdXTL2GE9TzQ
- 10个免费数据源:https://mp.weixin.qq.com/s/yUbzF83ur1dY2pqTSjhOSQ