云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

百度云_我的世界服务器进不去_好用

小七 141 0

基于SHAP和机器学习的数据偏差检测

尝试使用SHAP notebook检测数据偏差,以重现下面概述的步骤,并观看我们的按需网络研讨会以了解更多信息。StackOverflow的年度开发者调查在今年早些时候结束,他们已经优雅地发布了(匿名)2019年的结果以供分析。他们对全世界软件开发人员的经验有着丰富的了解,他们最喜欢的编辑器是什么?有多少年的工作经验?制表符还是空格?最重要的是薪水。软件工程师的薪水很高,有时既令人眼花缭乱,又有新闻价值。科技行业也痛苦地意识到,它并不总能实现其所谓的精英管理理想。薪酬并不是一个纯粹的功绩函数,一个又一个故事告诉我们,诸如名牌学校、年龄、种族和性别等因素都会对薪酬等结果产生影响。机器学习能比预测更多吗?它是否能解释薪酬,并突出这些因素可能会导致薪酬差异的案例?这个例子将描述如何用SHAP(SHapley加法解释)来扩充标准模型,以检测可能与预测有关的单个实例,然后深入挖掘数据导致这些预测的具体原因。模型偏差还是数据偏差?虽然这个主题通常被描述为检测"模型偏差",但是模型只是它所训练的数据的镜像。如果这个模型是"有偏见的",那么它从历史事实的数据中学到了这一点。模型本身并不是问题所在;它们是分析数据以寻找偏差证据的机会。解释模型并不是什么新鲜事,大多数库都可以评估模型输入的相对重要性。这些是输入效果的汇总视图。然而,一些机器学习模型的输出具有高度的个体效应:您的贷款批准了吗?你会得到经济援助吗?你是个可疑的旅行者吗?事实上,StackOverflow提供了一个方便的计算器,根据它的调查来估计一个人的期望工资。我们只能猜测这些预测的整体准确度,但开发人员特别关心的是他或她自己的前景。正确的问题可能不是,数据是否表明总体上存在偏差?但是,这些数据是否显示了个别的偏见?评估StackOverflow调查数据谢天谢地,2019年的数据是干净的,没有数据问题。它包含了来自大约88000名开发者的85个问题的回答。这个例子只关注全职开发人员。数据集包含大量相关信息,如工作年限、教育程度、角色和人口统计信息。值得注意的是,这个数据集不包含奖金和股本的信息,只包含工资。它还对关于区块链、fizz buzz和调查本身的态度等广泛问题作出了回应。由于不太可能反映出可能决定薪酬的经验和技能,因此不在此列。同样,为了简单起见,它也只关注美国的开发人员。在建模之前,数据需要更多的转换。有几个问题允许多种回答,比如"作为一个开发人员,您对生产力最大的挑战是什么?"这些单一的问题会产生多个是/否回答,需要分解成多个是/否特征。一些选择题,如"你工作的公司或组织大约雇用了多少人?"提供"2-9名员工"这样的回答。这些是有效地组合的连续值,将它们映射回推断的连续值(如"2")可能很有用,以便模型可以考虑它们的阶数和相对大小。不幸的是,这种翻译是手工的,需要一些判断。可以实现这一点的apachespark代码在随附的笔记本中,供感兴趣的人使用。Apache Spark选型随着数据以更易于机器学习的形式出现,下一步是拟合一个回归模型,根据这些特征预测工资。经过Spark过滤和转换后,数据集本身只有4MB,包含来自大约12600名开发者的206个特性,可以很容易地作为一个数据帧放入内存中,更不用说服务器了。xgboost是一个流行的梯度增强树包,它可以在一台机器上,在几分钟内将一个模型拟合到这个数据,而不会产生火花。xgboost提供了许多可调的"超参数",这些参数会影响模型的质量:最大深度、学习速率、正则化等等。与猜测不同,简单的标准做法是尝试对这些值进行大量设置,然后选择能够生成最精确模型的组合。幸运的是,这是火花回来的地方。它可以并行构建数百个这样的模型,并收集每个模型的结果。因为数据集很小,所以很容易将其广播给工作人员,创建一组要尝试的超参数组合,并使用Spark应用相同的简单非分布式xgboost代码,该代码可以在本地为每个组合的数据构建一个模型。...def列车型号(params):(最大深度、学习速率、α、λ、γ、最小子项重量)=参数xgb_回归值=xgb回归值(objective=)注册号:squarederror'最大深度=最大深度\学习率=学习率,注册α=α,λ=λ,γ=γ\min_child_权重=min_child_权重,n_估计器=3000,base_score=base_分数\importance_type='总增益',随机状态=0)xgb_型号=xgb_回归函数.fit(黑白)_列车.价值,是的_列车.价值,\评估集=[(b_X_试验值,是的_试验值)],\eval_metric='rmse',早停轮=30)n_估计值=len(xgb_模型评估结果()['validation\u 0']['rmse'])y_pred=xgb_模型.预测(黑白)_试验值)平均绝对误差_试验值)rmse=sqrt(均方误差_试验值))返回值(params+(n_估计量),(mae,rmse),xgb_模型)...最大深度=np.唯一(地理空间(3,7,num=5,数据类型=np.int32)).tolist()学习率=np.唯一(np.周围(地理空间(0.01,0.1,num=5),小数=3)。tolist()寄存器α=[0]+np.唯一(np.周围(地理空间(1,50,num=5),小数=3)。tolist()注册λ=[0]+np.唯一(np.周围(地理空间(1,50,num=5),小数=3)。tolist()伽马=np.唯一(np.周围(地理空间(5,20,num=5),小数=3),tolist()最小子项重量=np.唯一(地理空间(5,30,num=5,数据类型=np.int32)).tolist()平行度=128param_grid=[(选项(最大深度),选项(学习速率),选项(reg_alpha)\范围内的选项(reg_lambda)、选项(gamma)、选项(min_child_weight))(平行度)]参数评估模型=sc.并行化(param_grid,parallelism).map(列车模型).collect()这会创造出很多模型。为了跟踪和评估结果,mlflow可以用它的度量和超参数记录每个结果,并在笔记本的实验中查看它们。在这里,将多次运行的一个超参数与结果精度(平均绝对误差)进行比较:我们感兴趣的是,在保留的验证数据集上显示最小误差的单一模型。它得出的平均绝对误差约为28000美元,平均约为119000美元。这并不可怕,尽管我们应该意识到这个模型只能解释工资的大部分变化。解释xgboost模型虽然这个模型可以用来预测未来的薪水,但是问题是这个模型对数据有什么看法。在准确预测薪水时,哪些特征最重要?xgboost模型本身计算了一个特性重要性的概念:进口mlflow.sklearnbest_run_id="…"型号=mlflow.sklearn.load_模型("运行次数:/"+最佳运行时间\"id+"/xgboost")已排序((zip(模型功能重要性_,X.columns)),反转=真)[:6]像多年的专业编码、组织规模和使用Windows等因素是最重要的。这很有趣,但很难解释。这些值反映了相对重要性,而不是绝对重要性。也就是说,效果不是用美元来衡量的。这里的重要性定义(总增益)也特定于如何构建决策树,并且很难映射到直观的解释中。重要的特征甚至不一定与薪水呈正相关。更重要的是,这是一个"全局"的观点,它反映了功能在总体上有多重要。性别和种族等因素直到很久以后才会出现在这份名单上。这并不意味着这些因素并不重要。首先,特征可以相互关联,或者相互作用。有可能性别等因素与树木选择的其他特征相关,这在某种程度上掩盖了它们的影响。更有趣的问题不在于这些因素是否总体上很重要——可能它们的平均影响相对较小——而是它们在某些个别情况下是否有显著影响。在这些例子中,模型告诉我们一些关于个人经验的重要信息,而对于这些个人来说,经验才是最重要的。将包形状应用于开发人员级别的解释幸运的是,在过去五年左右的时间里,一套理论上更合理的模型解释技术已经出现。它们统称为"Shapley加法解释",方便地在Python包shap中实现。给定任何模型,这个库从模型中计算"形状值"。这些值很容易解释,因为每个值都是一个特征对预测的影响,以其为单位。此处的SHAP值1000表示"已解释+预测工资的1000美元"。SHAP值的计算方式也试图隔离相关性和交互作用。导入形状解释者=形状树表达式(型号)形状值=explainer.shap_值(X,y=y值)SHAP值也是针对每个输入计算的,而不是模型作为一个整体,因此这些解释对于每个输入都是可用的。对于每个预测,它还可以从每个特征的主要影响中分别估计特征交互作用的效果。可解释人工智能: