用于对带有无序标签的数据集执行推断的python库

shuffled-stats的Python项目详细描述


用于对带有无序/无序标签的数据集执行推断的python库。

该库包括生成数据集和对其标签(y)相对于输入特征(x)被洗牌的数据集执行线性回归的函数。换句话说,当您不知道哪个度量值来自哪个数据点时,应该使用此库执行线性回归。

应用包括:在一次(flow cytometry)对整个粒子群进行的实验,为保护隐私而洗牌的数据集(medical records),顺序不明的测量(signaling with identical tokens

安装

$ pip install shuffled_stats

示例(无噪音)

让我们从一些简单的例子开始。我们构造了一些随机的二维输入数据和相应的标签。然后使用shuffled_stats.linregress函数应用随机回归。

importnumpyasnp,shuffled_statsnp.random.seed(1)x=np.random.normal(1,1,(100,2))#input featuresy=3*x[:,0]-7*x[:,1]#labelsnp.random.shuffle(y)#in-place shuffling of the labelsshuffled_stats.linregress(x,y)#performs shuffled linear regression>>>array([3.,-7.])

原始的重量,[3,-7]被精确地恢复。

我们可以用定义的数据点来做另一个示例:

x1x2y
123
257
-1-2-3
5510
21012

标准线性回归将清楚地揭示1*x1+1*x2=y。让我们看看无序线性回归通过标签的排列版本所揭示的内容:

x=np.array([[1,2],[2,5],[-1,-2],[5,5],[2,10]])y=np.array([-3,10,7,3,12])shuffled_stats.linregress(x,y)#performs shuffled linear regression>>>array([1.,1.])

同样,重量被准确地恢复。

示例(有噪音)

np.random.seed(1)#for reproducibilityx=np.random.normal(1,1,(100,3))#input featuresx[:,0]=1#making a bias/intercept columny=4+2*x[:,1]-3*x[:,2]#labelsy=y+np.random.normal(0,.3,(100))#adding Gaussian noisew=shuffled_stats.linregress(x,y)np.round(w,2)>>>array([3.80,2.09,-2.91])

我们发现恢复权重近似于原始权重(4, 2,-3),包括偏置项。

该库包含一个函数shuffled_stats.generate_dataset,用于快速生成用于测试的数据集。下面是一个示例:

np.random.seed(1)#for reproducibilityx,y,w0=shuffled_stats.generate_dataset(n=100,dim=3,bias=True,noise=0.3,mean=2)w=shuffled_stats.linregress(x,y)print(np.round(w0,2))>>>array([2.07,-1.47,-0.83])print(np.round(w,2))>>>array([1.79,1.55,-0.63])
<>重量大致恢复。我们可以用shuffled_stats.error_in_weights来量化相对误差。

shuffled_stats.error_in_weights(w0,w)>>>0.13010948373615697#13% error

我们是否可以通过运行三个单独的“试验”或“复制”这个试验来提高性能,每个试验由100个无序的标签组成(在每个试验中,标签的顺序未知,但试验中的标签必须与该试验中的数据点相对应)?我们可以使用我们的库轻松测试此功能:

np.random.seed(1)#for reproducibilityx,y,w0,groups=shuffled_stats.generate_dataset(n=300,dim=3,weights=[2.07,-1.47,-0.83],bias=True,noise=0.3,mean=2,n_groups=3)#fix weights to the same values as beforew=shuffled_stats.linregress(x,y,groups=groups)print(np.round(w,2))>>>array([2.09,-1.48,-0.83])shuffled_stats.error_in_weights(w0,w)>>>0.0099665304764283077#<1% error

这次的重量要近得多!

这个库包括几个不同的估计器(详见论文)。我们可以选择不同的估计器来比较结果:

np.random.seed(1)#for reproducibilityx,y,w0=shuffled_stats.generate_dataset(n=100,dim=3,weights=[1,1,1],noise=0.3,mean=1)#the true weights are [1,1]w=shuffled_stats.linregress(x,y,estimator='SM')print(np.round(w,2))>>>[0.980.981.03]w=shuffled_stats.linregress(x,y,estimator='LS')print(np.round(w,2))>>>[0.990.921.09]w=shuffled_stats.linregress(x,y,estimator='EMD')print(np.round(w,2))>>>[0.990.931.09]

示例(在数据集上)

最后,我们还提供了从.csv文件(shuffled_stats.load_dataset_in_clusters)加载数据集的方法,以便可以将无序回归的性能与实际数据(例如,普通最小二乘法)的性能进行比较。下面是一个使用uci存储库中的accidents.csv数据集的示例。

fromsklearn.linear_modelimportLinearRegressionnp.random.seed(1)#for reproducibilityx,y,groups=shuffled_stats.load_dataset_in_clusters('accidents.csv',normalize=True,n_clusters=2)lr=LinearRegression(fit_intercept=False)#fit_intercept is false because x already includes a bias columnprint(lr.fit(x,y).coef_)>>>[1.02859104,0.03967381]print(shuffled_stats.linregress(x,y))>>>[1.123482160.02539006]

不错,如果我自己说的话!如果您有任何问题,请随时探索随机回归并联系我!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
在Android应用程序中处理新活动时出现java NullPointerException   从PSV文件读取Java   在JavaSwing中将方法从一个类传递到另一个类   带有MongoDB错误的java Vertx ClassNotFoundException:com。mongodb。联系溪流工厂   在java中替换2D数组中的数字?   java Avro方案空布尔和双整数布尔的写并集   java导入组织。neo4j无法解决?   从另一个获取变量。使用反射的java文件   Java:以格式化字符串的形式返回具有非常不同的条目长度的2D数组   java客户端应用程序正在从IBMMQ接收不同格式的消息体   java在我的主循环中的步骤有问题   java如何正确安装来自sslforfree的证书。tomcat服务器上的com   java RecyclerView变更单永久   java如何获得屏幕的精确中间位置,即使调整了大小