倾向得分匹配结果,python特征匹配
什么是PSM?PSM什么时候用?
PSM(倾向得分匹配)得分匹配是一种利用非实验数据或观察数据分析干预效果的统计方法。
为了研究某项措施或行为对人的影响(比如吸烟对健康的影响,在北大读书对收入的影响),或者某项措施对互联网中用户的影响,最直接有效的评估方法是我们在大量样本中随机选取对照组和治疗组,保证这些用户在实验前的一致性(通过aa检验),然后进行AB检验,再评估效果。
但在现实中,由于某些因素,上述实验无法有效开展,比如不能强迫能上北大的人不上北大,可以组织实验者抽烟。在这种情况下,我们期望引入一种方法来寻找一个有效的对照组来评估这种措施的效果。(具体PSM的假设原理和合理性在此不再过多讨论)
PSM的实现将结合Python详细介绍(本文描述的Python实现基于Python 3。x)
数据预处理
引用了包导入警告
warnings.filterwarnings(“忽略”)
进口熊猫作为pd
将numpy作为np导入
%matplotlib内联
导入操作系统
从scipy导入统计
将matplotlib.pyplot作为plt导入
进口patsy
导入系统
从stats models . genmod . generalized _ linear _ model导入GLM
将statsmodels.api作为sm导入
将seaborn作为sns导入
读取data path=os.getcwd() #以获取当前路径。
File=path /data.txt #写具体的引用文件名。文件数据包括所有X变量和Y变量(0,1)
Df=pd.read_csv(file,sep=\t) #根据具体的文件类型,read_csv用于txt文件,read_excel用于excel。
确定变量x _ field=[x1 , x2 , x3 , x4 , X5 , X6]
Y_field=[Y]
field=X_field Y_field
清理数据,并将实验组与预选的对照组区分开来
Data=data.dropna() #删除任何包含无效数据的行
treated=data[data[Y]==1]
control=data[data[Y]==0]
已处理[字段]。描述()。round(2)# PSM前对照组和实验组之间的差异
控件[字段]。描述()。回合(2)
根据数据量,选取PSM的实验数据和控制组的预选数据。
(此处,文件大的情况下进行进一步筛选)data.groupby(Y_field)。size() #原始数据的样本大小
treated _ sample=treated . sample(10000,轴=0)[字段]。reset _ index (drop=true) #实验组
control _ sample=control . sample(100000,轴=0) [field]。Reset _ index (drop=true) #对照组,数据量必须大于实验组。
PSM算法步骤1计算逻辑回归方程data _ p=control _ sample。追加(已处理_样本)。reset _ index (drop=true) #选择的两个数据集是回归基本数据。
y_f,x_f=patsy.dmatrices({} ~ {} )。format(Y_field[0], 。join(X_field)),data=data_p,
return_type=dataframe )
公式={} ~ {} 。format(Y_field[0], 。join(X_field))
打印(公式:\n 公式)
print(n多数:,len(control_sample))
Print (n minority:,len (treated _ sample)) #确定回归方程
i=0
Nmodels=50可以指定回归模型的数量。
错误=0
model_accuracy=[]
型号=[]
而i nmodels和errors 5:
Sys.stdout.write (\ r {}: {} \ {} )。格式(“在平衡样本上拟合模型”,I,n模型))#哪个模型
Control _ sample.sample (len(已处理_样本))。追加(已处理_样本)。dropna () #模型选择相同的对照组和对照组样本。
Y _ samp,x _ samp=patsy . d matrix(formula,data=df,return _ type= data frame) #选择模型的自变量和因变量。
Glm=glm (y _ samp,x _ samp,family=sm . families . binomial())# logistic回归模型
尝试:
res=glm.fit()
preds=[如果i=.5则为1.0,否则I在res.predict(X_samp)中为0.0]
preds=pd。数据帧
预测列数=y _样本列数
b=y_samp.reset_index(drop=True)
a=preds.reset_index(drop=True)
ab_score=((a.sort_index()。sort _ index(axis=1)==b . sort _ index()。sort_index(axis=1))。sum() * 1.0/len(y_samp))。值[0]
#模型预测准确性得分
模型_准确度.附加(ab _分数)
models.append(res)
i=1
例外情况为e:
错误=1
打印(错误:{} 。格式(e))
打印( \ n平均精度:, {}% 。
格式(圆形(NP。均值(模型_精度)* 100,2))) #所有模型的平均准确性
脉搏间隔调制(pulse spacing modulation的缩写)步骤2为实验组,即已处理_样本,在对照组池,即控制组中找与预测值相似的行作为对照组(采用临近匹配法)阈值=0.001
method=min
nmatches=1
test _ scores=data _ p[data _ p[Y _ field[0]]==True][[ scores ]]
ctrl _ scores=data _ p[data _ p[Y _ field[0]]==False][[ scores ]]
结果,match_ids=[],[]
对于范围内的I(len(test _ scores)):
match_id=i
score=test_scores.iloc[i]
matches=abs(ctrl_scores - score).排序值(分数)。头(匹配)
choosed=NP。随机的。选择(匹配。index,nmatches,replace=False)结果。扩展([test _ scores。索引[I]]列表(已选择)
匹配标识。extend([I]*(len(choosed)1))
ctrl_scores=ctrl_scores.drop(选择,轴=0)
matched _ data=data _ p . loc[result]
匹配数据[匹配标识]=匹配标识
matched_data[记录标识]=matted _ data . index
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。