如何设置合理的数据波动or等距分箱的距离选择

        当你打开这篇文章,一定是遇到了如下问题场景:

        情景1,有一组数据标签A=[a_{1}, a_{2}, a_{3}..., a_{n}],我们希望给数据加一个合理的波动,即认为:A\pm \theta =[a_{1}\pm \theta, a_{2}\pm \theta, a_{3}\pm \theta, ....]属于标签的合理波动。

        情景2,有一组数据标签A=[a_{1}, a_{2}, a_{3}..., a_{n}],我们希望给出更合理的等距分箱的间距。

        针对上述场景,我想了一个基于双t检验合理\theta的方法,具体做法如下:制作一组新的数据,其值为B=[b_{1}, b_{2}, b_{3}..., b_{n}],其中b_{i} = a_{i} + uniform\left ( -\theta ,\theta \right )。而uniform\left ( -\theta ,\theta \right )是来自均匀分布\left ( -\theta ,\theta \right )的随机数。如果A和B服从\alpha <0.1的双t检验,就有90%的把握认为,我们设置的数据波动或者等距分箱的间距很合理。这是因为双总体t检验的统计学意义是:判断两个抽取的样本集合所代表的总体的均值\mu _{1}和和\mu _{2}差异是否明显,t检验的数学原理网上很多作者详细写过,我就不发啦,文末有上述小trick方案的python代码。

        情景来源:我一个朋友做了个回归模型,但是不希望用r2或者MSE等指标做评价,希望能够给出类似分类模准确率这样的评价指标,而且不希望选择常规连续标签离散化再做分类模型,比如卡方分箱等。我就跟他说,设预测值是b,真实值是a,如果\left | a-b \right |< \theta就认为模型的预测是准确的。现在需要给一个合理的\theta的选择的解释。

         举个例子,假设数据是

[5, 4, 3, 4, 5, 4, 3, 7, 6, 3]

经过上述计算可以得到当设置的波动值\theta < 0.0491时,有99.016%的把握认为波动不影响数据原有统计学属性。

这时,请大胆的将数据改为

\mathbf{\mathbf{\mathit{\mathit{\mathfrak{\mathbf{}}}}}[5\pm 0.05, 4\pm 0.05, 3\pm 0.05,......]}

       下面给出我的上述方案的python代码的简单示例:

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats


# 随机生成数模拟数据A
A = np.random.randint(3, 8, (1, 10)).flatten()
print(A)

# theta_all是备选的 数据波动值theta
theta_all = np.linspace(0.0001, 0.3, 50)
t_all = []

# 计算每个备选theta的双总体t检验p值,保存于t_all
for theta in theta_all:
    # 每个备选theta计算40次t检p值,取均值
    # 因为第二个主体B是由A加上基于均匀分布随机数产生的,有随机性
    step = 40
    t_step = []
    for i in range(step):
        B = [a + np.random.uniform(-theta, theta) for a in A]
        t = stats.ttest_ind(A, B)
        t_step.append(t[1])
    t_all.append(np.mean(t_step))

# 显然,theta越小,B和A越接近,我们取p=0.99作为阈值,找到对应的theta的在theta_all中坐标split_index
# 也就是说只要theta小于该值,我们有99%把握认为波动设置合理,不影响原数据统计属性
split_index = 0
for i in range(len(t_all)):
    if t_all[i] > 0.99:
        split_index = i
    else:
        pass

# 最后就是画图了
point_index = "  最大θ值:%.4f, 最小置信度:%.3f)"\
              % (theta_all[split_index], t_all[split_index]*100) + "%"
plt.plot(theta_all[0:split_index + 1], t_all[0:split_index + 1], c='b')
plt.plot(theta_all[split_index:-1], t_all[split_index:-1], c='r')
plt.scatter(theta_all[split_index], t_all[split_index], s=30)
plt.text(theta_all[split_index], t_all[split_index], point_index)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

plt.show()

         写在最后:可能是没找到专业性的问题描述词汇,对于我的问题,我查阅资料并没有找到上述情景的解决方案,因此自创了这个方法 ,如果读者有更好的方案,请评论区留言一起学习,非常感谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值