使用 Python 生成合成数据
机器学习的一个问题,尤其是当您刚开始并想了解算法时,通常很难获得合适的测试数据。有些要花很多钱,有些则不能免费获得,因为它们受版权保护。因此,在某些情况下,人工生成的测试数据可以是一种解决方案。
出于这个原因,我们教程的这一章涉及人工生成数据。本章是关于创建人工数据。在我们教程的前几章中,我们了解到 Scikit-Learn (sklearn) 包含不同的数据集。一方面,有小的玩具数据集,但它也提供更大的数据集,这些数据集通常在机器学习社区中用于测试算法或作为基准。它为我们提供了来自“现实世界”的数据。
所有这些都很棒,但在许多情况下,这仍然不够。也许您找到了正确的数据类型,但您需要更多此类数据,或者数据并不完全是您要查找的数据类型,例如,您可能需要更复杂或更不复杂的数据。这是您应该考虑自己创建数据的地方。在这里,sklearn
提供帮助。它包括各种随机样本生成器,可用于创建定制的人工数据集。满足您对大小和复杂性的想法的数据集。
以下 Python 代码是一个简单示例,我们在其中为一些德国城市创建了人工天气数据。我们使用 Pandas 和 Numpy 来创建数据:
import numpy as np
import pandas as pd
城市 = [ ‘柏林’ 、 ‘法兰克福’ 、 ‘汉堡’ 、
‘纽伦堡’ 、 ‘慕尼黑’ 、 ‘斯图加特’ 、
‘汉诺威’ 、 ‘萨尔布吕肯’ 、 ‘科隆’ 、
‘康斯坦茨’ 、 ‘弗莱堡’ 、 ‘卡尔鲁厄’
]
n = len (城市)
数据 = { '温度' : np 。随机的。正常( 24 , 3 , n ),
'湿度' : np 。随机的。正常( 78 , 2.5 , n ),
'Wind' : np 。随机的。正常( 15 , 4 , n )
}
df = pd. DataFrame (数据=数据, 索引=城市)
df
温度 | 湿度 | 风 | |
---|---|---|---|
柏林 | 26.133572 | 80.328353 | 5.015542 |
法兰克福 | 23.161901 | 76.886831 | 14.021860 |
汉堡 | 24.145767 | 79.678764 | 10.897413 |
纽伦堡 | 27.114319 | 77.825100 | 21.273423 |
慕尼黑 | 24.573419 | 74.416920 | 21.734649 |
斯图加特 | 20.615747 | 81.827868 | 6.316270 |
汉诺威 | 26.513550 | 80.462603 | 9.568481 |
萨尔布吕肯 | 23.602173 | 83.181582 | 11.382041 |
科隆 | 27.769321 | 79.759665 | 11.433353 |
康斯坦斯 | 29.343985 | 78.814028 | 17.818053 |
弗莱堡 | 25.554123 | 77.339895 | 7.965502 |
卡尔斯鲁厄 | 19.780618 | 76.517790 | 6.304491 |
另一个例子
我们将为四种不存在的花卉创建人工数据。如果这些名字让你想起编程语言和披萨,那绝非巧合:
- Flos Pythonem
- 爪哇
- 弗洛斯玛格丽塔酒
- 人工花
RGB 平均颜色值相应地为:
- (255, 0, 0)
- (245, 107, 0)
- (206, 99, 1)
- (255, 254, 101)
花萼的平均直径为:
- 3.8
- 3.3
- 4.1
- 2.9
Flos pythonem (254, 0, 0) |
Flos Java (245, 107, 0) |
---|---|
弗洛斯玛格丽塔 (206, 99, 1) |
人工花链 (255, 254, 101) |
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
从 scipy.stats 导入 truncnorm
def truncated_normal ( mean = 0 , sd = 1 , low = 0 , upp = 10 , type = int ):
return truncnorm (
( low - mean ) / sd , ( upp - mean ) / sd , loc = mean , scale = sd )
def truncated_normal_floats ( mean = 0 , sd = 1 , low = 0 , upp = 10 , num = 100 ):
res = truncated_normal ( mean = mean , sd = sd , low = low , upp = upp )
返回 res 。RVS (NUM )
def truncated_normal_ints ( mean = 0 , sd = 1 , low = 0 , upp = 10 , num = 100 ):
res = truncated_normal ( mean = mean , sd = sd , low = low , upp = upp )
返回 res 。RVS (NUM )。类型( np .uint8 )
#项为每个花类的数目:
number_of_items_per_class = [ 190 , 205 , 230 , 170 ]
花 = {}
#FLOS Pythonem:
NUMBER_OF_ITEMS = number_of_items_per_class [ 0 ]
的红色 = truncated_normal_ints (平均值= 254 , SD = 18 , 低= 235 , upp = 256 ,
num = number_of_items )
果岭 = truncated_normal_ints (平均值= 107 , SD = 11 , 低= 88 , UPP = 127 ,
NUM = NUMBER_OF_ITEMS )
蓝调 = truncated_normal_ints (平均值= 0 , SD = 15 , 低= 0 , UPP = 20 ,
NUM = NUMBER_OF_ITEMS )
calyx_dia = truncated_normal_floats ( 3.8, 0.3 , 3.4 , 4.2 ,
num = number_of_items )
data = np . column_stack (( reds , greens , blues , calyx_dia ))
花[ "flos_pythonem" ] = 数据
#FLOS爪哇:
NUMBER_OF_ITEMS = number_of_items_per_class [ 1 ]
的红色 = truncated_normal_ints (平均值= 245 , SD = 17 , 低= 226 , UPP = 256 ,
NUM = NUMBER_OF_ITEMS )
果岭 = truncated_normal_ints (平均值= 107 , SD = 11 , 低= 88 , upp = 127 ,
NUM = NUMBER_OF_ITEMS )
蓝调 = truncated_normal_ints (平均值= 0 , SD = 10 , 低= 0 , UPP = 20 ,
NUM = NUMBER_OF_ITEMS