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

百度云_如此好用的云主机_多少钱

小七 141 0

通过主动学习实现更好的机器学习

试着用这个笔记本来重现下面概述的步骤机器学习模型看起来像是神奇的学者。他们可以区分热狗和不热狗,但这早已不是一个简单的把戏了。我姑妈的鹦鹉也能做到。但是机器学习的模型给语音激活的助手提供了动力,这些助手可以毫不费力地理解嘈杂的人类语言,汽车也可以或多或少地安全驾驶。难怪我们假设这些在某种程度上是人为的"智能"。他们没有告诉你的是,这些受监督的模型更像鹦鹉,而不是甲骨文。他们通过大量的例子学习,并且学习模仿例子所建议的输入和输出之间的连接。这就是许多公司在接受机器学习时所面临的问题:建模(相对)容易。有正确的例子来学习不是。获得这些例子可能很困难。当然,我们不能从今天开始收集过去五年的数据。在有数据的地方,可能只是"输入",而没有需要学习的"输出"。更糟糕的是,制作标签通常是一个手动过程。毕竟,如果有一个自动化的过程,就没有必要重新学习它作为一个模型!在标签不易获得的地方,一些人工标记是不可避免的。幸运的是,并不是所有的数据都必须被标记。一类通常被称为"主动学习"的技术可以使过程协同工作,其中根据某些数据训练的模型有助于识别最有助于标记下一个数据的数据。本例使用Python库进行主动学习,modAL,以帮助人类为简单的文本分类问题标记数据。它将展示apachespark如何在规模上应用modAL,以及像Hyperopt和mlflow这样的开放源代码工具,在Databricks中与Spark集成在一起,可以起到帮助作用。现实世界学习问题:将消费者投诉归类为"苦恼"美国消费者金融保护局(CFPB)负责监管金融机构与消费者的关系。它处理消费者的投诉。他们公布了这些投诉的匿名数据集。大多数是简单的表格数据,但也包含消费者投诉的免费文本(如果有)。任何处理过客户支持问题的人都不会对它们的外观感到惊讶。complaints_df=完整的_def投诉\选择(col("Complaint ID")。别名("ID")\col("消费者投诉叙述")。别名("投诉")\过滤器("投诉不为空")显示(投诉)想象一下,CFPB想要优先处理或先发制人地处理那些看起来很痛苦的投诉:一个害怕或愤怒的消费者会在电话中发出声音。这是一个简单的文本分类问题-如果这些投诉已经被相应地标记。他们不是。有超过44万的投诉,要把它们全部贴上标签是不现实的。接受这一点,你的作者标注了大约230个投诉(数据集)。标记1_df=spark.read.option("header",True)。选项("inferSchema",True)\csv(数据路径+"/标签.csv")input1_df=投诉_数据框连接(标记为"id")pool_df=投诉_数据框连接(标签1_df,"id",how="left_anti")显示(输入1_df)用Spark-ML建立初始分类模型Spark ML可以构造一个基本的TF-IDF嵌入文本。目前,只有少数带标签的示例需要转换,但整个数据集稍后将需要这种转换。#标记化为单词tokenizer=tokenizer(inputCol="投诉",outputCol="标记化")#删除停止字remover=停止字删除器(inputCol=标记器.getOutputCol(),outputCol="已过滤")#计算术语频率并散列到bucket中hashing_tf=HashingTF(输入列=标记器.getOutputCol(),outputCol="哈希"\numFeatures=1000)#转换为TF-IDFidf=idf(inputCol=hashing)_tf.getOutputCol(),outputCol="功能")pipeline=管道(stages=[标记器,remover,hashing_tf,idf])管道型号=管道.fit(投诉)#需要一个浮点数数组,而不是星火矢量,以后再给熊猫tolist_udf=udf(lambda v:v.toArray().tolist(),数组类型(FloatType())Featureized1_df=管道_模型.转换(输入1_df)\选择("身份证"、"投诉"、"特征"、"苦恼")\withColumn("功能",tolist_udf("功能"))在这个尺度上应用分布式Spark ML是没有价值的。相反,scikitlearn可以在几秒钟内将模型应用到这个微小的数据集上。然而,Spark在这方面仍有作用。拟合一个模型通常意味着在模型上拟合许多变量,改变"超参数",比如或多或少的正则化。这些变体可以通过Spark并行安装。Hyperopt是一个与Spark-in-Databricks集成的开源工具,它可以以一种学习什么组合最有效的方式来驱动对最优超参数的搜索,而不仅仅是随机搜索。随附的笔记本有完整的代码列表,但以下是实现的关键部分的编辑:#在给定训练集和参数的情况下训练模型的核心函数def列车型号(参数、X列车、y列车):lr=逻辑回归(solver='liblinear',max_iter=1000\惩罚=params['premission'],C=params['C'],random_state=seed)返回左后安装(X车,y车)#包装核心建模函数以评估和返回hyperopt的结果def列车型号(参数):lr=列车型号(参数、X列车、y列车)损失=对数损失(y值,预测概率(X值)#mlflow中自动测井的补充准确度=准确度得分(y值,lr.预测(X值)mlflow.log_度量("准确度",准确度)return{'status':status\u OK,'loss':丢失,'accuracity':准确性}惩罚=['l1','l2']搜索空间={"C":惠普loguniform(‘C’,-6,1),"惩罚":惠普选择("惩罚",惩罚)}最佳参数=fmin(fn=列车型号\u fmin,space=搜索空间,阿尔戈=tpe.建议,最大评估值=32,试验=斯巴克特里尔(平行度=4),R状态=随机状态(种子)#需要从输出中的0/1转换回这个值,以便再次用作输入best_params['pendium']=惩罚[最佳参数['惩罚']]#列车+验证集上的列车最终模型最终模型=列车模型(最佳参数\np.连接([X列车,X\u val])\np.连接([火车,货车])...(X_train,X_val,X_test,y_train,y_val,y_test)=构建测试_train_split(特征化1_pd,80)(最佳参数,最佳模型)=找到最佳模型(X_train,X_val,y_train,y_val)(准确度,损失)=log_和_eval_模型(最佳模型、最佳参数、X_检验、y_检验)...精度:0.6损失:0.6928265768789768Hyperopt在搜索中尝试128种不同的超参数组合。在这里,它改变L1和L2的正则化惩罚,以及正则化的强度C。它返回找到的最佳设置,从中最终的模型将在训练和验证数据上重新拟合。注意,如果使用数据块,这些试验的结果会自动记录到mlflow中。上面的清单显示,可以记录额外的指标,比如准确度,而不仅仅是Hyperopt记录的"损失"。很明显,例如,L1正则化更好,顺便说一句:对于最佳损失约为0.7的运行,准确率仅为60%。进一步的调整和更复杂的模型可以改善这一点,但目前只有一个小的训练集可以做到这一点。需要更多的标记数据。主动学习模式的应用这就是通过模态库进行主动学习的地方。这是令人愉快的简单应用。当一个分类器或回归器可以返回其预测的概率估计值时,它可以分析剩余数据并决定哪些数据最有用。"最有用"通常指分类器当前最不确定的输入的标签。与预测非常确定的输入相比,知道标签更有可能改进分类器。modAL通过ActiveLearner支持logistic回归这样的分类器,其输出是一个概率。学习者=主动学习者(估计器=最佳模型,X_训练=X_训练,y_训练=y_训练)需要准备剩余数据的"池"以供查询。这意味着对其余数据进行特征化处理,因此使用Spark ML实现它非常方便:Featureized_pool_df=管道_模型.转换(池逖df)\选择("id"、"complaint"、"features")\withColumn("features",tolist_udf("features")).cache()ActiveLearner的query()方法从未标记的数据集中返回大多数不确定的实例,但它不能通过Spark直接并行操作。然而,Spark可以使用pandas UDF将其并行应用于特征化数据块,该UDF可以有效地将数据表示为熊猫数据帧或序列。每个问题都可以用ActiveLearner独立查询。您的作者只能忍受给大约100多个投诉添加标签,因此本示例尝试选择池中44万个投诉中的0.02%左右:查询_分数=0.0002@pandas_udf("布尔值")def to_查询(features_系列):X_i=np.堆栈(特征_系列())n=X_i.形状[0]查询_idx,=学习者.查询(X,n个实例=数学.ceil(n*查询_分数)#输出具有相同大小的输入;大多数实例未进行采样以进行查询查询结果=pd系列([错误]*n)#在ActiveLearner需要标签的地方设置True查询_结果.iloc[query_idx]=真返回查询结果with_query_df=功能化的_池_df.WITH列("查询",to_query("功能"))显示(带查询_测向滤波器("查询")。选择("投诉")请注意,这与从440000的整个池中选择最佳0.02%进行查询并不完全相同,因为这将分别从每个数据块中选择前0.02%作为pandas数据帧。这不一定会给出最好的查询候选。好处是平行性。这种折衷可能在实际情况下很有用,因为结果仍然比大多数查询更有用。理解主动学习者的疑问实际上,对于查询中的所有投诉,该模型返回的概率在49.9%到50.1%之间。关于