当你打开这篇文章,一定是遇到了如下问题场景:
情景1,有一组数据标签,我们希望给数据加一个合理的波动,即认为:
属于标签的合理波动。
情景2,有一组数据标签,我们希望给出更合理的等距分箱的间距。
针对上述场景,我想了一个基于双t检验合理的方法,具体做法如下:制作一组新的数据,其值为
,其中
。而
是来自均匀分布
的随机数。如果A和B服从
的双t检验,就有90%的把握认为,我们设置的数据波动或者等距分箱的间距很合理。这是因为双总体t检验的统计学意义是:判断两个抽取的样本集合所代表的总体的均值
和和
差异是否明显,t检验的数学原理网上很多作者详细写过,我就不发啦,文末有上述小trick方案的python代码。
情景来源:我一个朋友做了个回归模型,但是不希望用r2或者MSE等指标做评价,希望能够给出类似分类模准确率这样的评价指标,而且不希望选择常规连续标签离散化再做分类模型,比如卡方分箱等。我就跟他说,设预测值是b,真实值是a,如果
就认为模型的预测是准确的。现在需要给一个合理的
的选择的解释。
举个例子,假设数据是
经过上述计算可以得到当设置的波动值时,有99.016%的把握认为波动不影响数据原有统计学属性。
这时,请大胆的将数据改为
下面给出我的上述方案的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()
写在最后:可能是没找到专业性的问题描述词汇,对于我的问题,我查阅资料并没有找到上述情景的解决方案,因此自创了这个方法 ,如果读者有更好的方案,请评论区留言一起学习,非常感谢。