全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
1336 1
2020-12-09
在Python中使用Dash的分类模型模拟器应用程序
我们将使用来自贷款预测的Analytics Vidhya的数据集。让我们创建一个用于加载数据“ definition.py”的单独文件,并创建一个对象obj_Data,该对象可在项目中的各个文件之间访问。首先,让我们看一下数据。
Dash-火车数据
短跑测试数据
前端–添加DCC和DAQ控件
在开始之前,让我们看一下到本博客结束时将要构建的内容。
短跑-最终结果
滑杆:
首先,让我们构建一个滑块,将其用于将数据集拆分为训练和测试。训练集将用于训练模型并测试以验证我们的模型结果。
分割数据
    daq.Slider(
        id ='slider',
        min = 0,
        最大= 100,
        值= 70,
        handleLabel = {“ showCurrentValue”:True,“ label”:“ SPLIT”},
        步长= 10
),
下拉菜单:
接下来,让我们构建两个下拉菜单,一个用于选择目标变量,另一个用于自变量。这里唯一需要注意的是,这些值是从数据集中填充的,而不是硬编码的。
options = [{'label':x,'value':x} for obj_Data.df_train_dummies.columns中的x],
html.P(“选择目标”,className =“ control_label”),
    dcc.Dropdown(
        id =“ select_target”,
        options = [{'label':x,'value':x} for obj_Data.df_train_dummies.columns中的x],
        多=假,
        value ='Loan_Status',
        clearable = False,        
),
带有DAQ的数字输入:
Dash DQ K折叠式
我们还希望用户选择一些拆分来进行模型构建。有关更多信息,请参阅KFOLD。让我们添加一个数字字段,其最小值为1,最大值为10。
   daq.NumericInput(
        id ='id-daq-splits',
        min = 0,
        最大值= 10,
        尺寸= 75,
        值= 2
    ),
带DAQ的LED显示屏:
预先具有某些标准度量标准(例如记录数,许多分类和数字字段等)作为基本信息的一部分也将非常有用。为此,让我们使用dash-daq小部件。我们可以根据布局/主题更改字体,颜色和背景。
Dash DQ的LED显示
    daq.LEDDisplay(
        id ='records',
        #label =“默认”,
        值= 0,
        标签=“记录”,
        size = FONTSIZE,
        颜色= FONTCOLOR,
        backgroundColor = BGCOLOR
    )
我们将使用相同的代码段生成更多此类卡/小部件,以确保ID是唯一的。我们将在后面的部分中研究如何填充值,但现在让我们将值设置为零。
现在已经涵盖了所有用户可输入字段,我们将拥有占位符,用于展示一些模型度量图,例如AUC-ROC,这是分类模型的标准曲线。一旦模型构建在以后的部分中完成,我们将填充图表。
html.Div(
    [dcc.Graph(id =“ main_graph”)],
),
后端–让我们建立模型并衡量指标:
有两个方面的因素可以考虑:
1.建立所有七个分类模型,并根据准确性绘制条形图。我们将在一个名为multiModel.py的单独文件中对此进行编码
2.自动选择性能最佳的模型,并详细说明所选模型的相关指标。我们将在文件models.py中对此进行编码
分类模型:
让我们从第一部分开始-我们将建立七个分类模型,分别是Logistic回归,轻型GBM,KNN,决策树,AdaBoost分类器,随机森林和高斯朴素贝叶斯。这是LGBM的代码段。由于本文是关于构建分析应用程序而非模型构建的,因此您可以参考完整的模型构建代码以获取更多详细信息。
    ...
    ...
    clf = lgb.LGBMClassifier(n_estimators = 1000,max_depth = 4,random_state = 22)
    clf.fit(X_trn,y_trn)
    预测= clf.predict(X_val)
    fun_metrics(预测,y_val)
    fpr,tpr,_ = roc_curve(y_val,预测)
    fun_metricsPlots(fpr,tpr,“ LGBM”)
    fun_updateAccuracy(clf,预测)
    ....
    ....
现在,在第二部分中,我们将针对七个模型中的最佳模型生成度量。这是伪代码段–有关更多详细信息,请参考代码。
如果bestModel =='GNB':
            模型= GaussianNB()
        elif bestModel =='LGBM':
            型号= lgb.LGBMClassifier()
        elif bestModel =='物流':
            模型= LogisticRegression()
        elif bestModel =='KNN':
            型号= KNeighborsClassifier()
        elif bestModel =='随机森林':
            模型= RandomForestClassifier()
        elif bestModel =='DT':
            模型= tree.DecisionTreeClassifier()
        其他:
            型号= AdaBoostClassifier()
衡量模型指标:
我们将跟踪最佳模型的指标-精度,召回率和准确性,为此,我们将使用sklearn.metrics库导出这些数字。这些数字将填充我们的dash-daq小部件。
模型精度
从sklearn.metrics导入roc_curve,roc_auc_score,recall_score,precision_score,accuracy_score
精度=圆(precision_score(testy,yhat),2)
召回=回合(recall_score(testy,yhat),2)
精度=舍入(accuracy_score(testy,yhat)* 100
testy具有测试集中的实际值,而yhat具有预测值。
评价
使用Plotly Express构建AUC-ROC图:
类似地,使用plotly express建立AUC-ROC曲线并将其保存在无花果对象fig_ROC中
ROC曲线
fig_ROC = px.area(
x = lr_fpr,y = lr_tpr,
title = f'ROC曲线(AUC = {lr_auc:.4f})',
标签= dict(x ='假阳性率',y ='真阳性率')

fig_ROC.add_shape(
    type ='line',line = dict(dash ='dash'),
    x0 = 0,x1 = 1,y0 = 0,y1 = 1

fig_ROC.update_yaxes(scaleanchor =“ x”,scaleratio = 1)
fig_ROC.update_xaxes(constrain ='domain')
与回调的交互:
现在,我们已经使用小部件,占位符设计了前端,并为后端设计了一个用于构建分类模型的功能,该功能可以进行预测并生成模型指标。现在,每当用户更改输入时,这两个控件应该彼此交互,这可以使用回调来实现。回调是Python函数,只要输入组件的属性发生更改,Dash就会自动调用这些回调函数。
回调共有3个部分-
1.所有输出的列表(或仅一个输出)
2.所有输入(或仅一个输入)的列表
3.接受输入,执行定义的处理并返回输出的函数。
注意:如果有多个输入或多个输出,则将控件包装在[]下,否则,可以将其跳过。
[
    输出(“ main_graph”,“ figure”),
    Output(“ recall”,'value'),
]
....
[
    输入(“ select_target”,“值”),
    输入(“ select_independent”,“值”),
...   
]
....
在上面的输出代码段中,第一个参数是我们在UI设计期间设置的main_graph。第二个参数是对象类型,在这种情况下为数字。同样,召回控件期望对象的类型为value,在这种情况下为数字。有关回调的更多信息,请参见此处。将我们所有的输入/输出控件放在一起,代码就是这样。
@ app.callback(
    [
        输出(“ main_graph”,“ figure”),
        输出(“ individual_graph”,“ figure”),
        输出(“ aggregate_graph”,“图”),
        Output(“ slider-output-container”,'children'),
        Output(“ precision”,'value'),
        Output(“ recall”,'value'),
        输出(“精度”,“值”),
        输出(“ auc”,“值”),
        Output(“ trainset”,'value'),
        输出(“测试集”,“值”),
        输出('model-graded-bar','value'),
        输出('id-insights','children'),
        输出(“模型图”,“图”),     
        输出(“最佳模型”,“子级”),
        输出(“ id-daq-switch-model”,“ on”),
        输出('auto-toast-model','is_open')
    ],
    [
        输入(“ select_target”,“值”),
        输入(“ select_independent”,“值”),
        输入(“滑块”,“值”),
        输入(“ id-daq-splits”,“值”),
        输入(“ select_models”,“值”)        
    ]

def measurePerformance(目标,独立,滑块,拆分,selected_models):
    fig_ROC,Fig_Precision,fig_Threshold,精度,召回率,准确性,trainX,testX,auc,fig_model,bestModel = multiModel.getModels(目标,独立,滑块,拆分,selected_models)
    auc_toast =如果auc <0.5则为True,否则为False
    return fig_ROC,Fig_Precision,fig_Threshold,'训练/测试分割大小:{} / {}'。format(slider,100-slider),precision,callback,precision,auc,trainX,testX,auc * 100,f'最好表现模型为{bestModel},其精度为{accuracy},精度为{precision},召回率为{auc}的面积下的{recall}。尝试各种K FOLD值以进一步探索。” ,fig_model,f'效果最好的模型是{bestModel}',True,auc_toast
使用PyTest编写一些测试用例:
编写用于典型Web开发的单元测试用例是正常的,但通常,对于具有预测模型和视觉效果的分析应用程序,有一种跳过的趋势,而最后只是手动进行完整性检查。pytest库使配置测试用例,编写用于测试特定输入和输出的函数变得更加容易。简而言之,只需编写一次并继续运行测试,然后再将代码推送到QA / Prod环境即可。请参阅pytest文档以获取更多详细信息。
例如,让我们写一个案例来检查Precision值。我们可以使用相同的框架,并将其扩展到更多案例–积极,消极和临界情况。
#pip安装pytest
导入pytest
def test_buildModels():   
    fig_ROC,fig_precision,fig_threshold,精度,召回率,准确性,trainX,testX,lr_auc = buildModel(目标,独立,滑块,selected_models)
    断言精度<1
assert关键字可确保满足指定条件,并将测试用例指定为“通过”或“失败”。
下拉检查
配置测试用例
执行中的测试用例
一项测试失败
一个测试用例失败
所有测试已清除
所有测试用例均通过
记录错误:
记录错误/警告有助于我们跟踪代码中的问题,为此,我们将使用记录库。我们将通过名称model.log创建一个单独的文件。记录日志不仅是遵循的好习惯,而且在调试过程中也有很大帮助。有些人喜欢使用print()语句,该语句在控制台中记录输出以供参考,但建议人们使用日志记录。
在项目目录中通过名称“ model.log”创建文件,并使用以下代码在该文件中记录错误。
#安装库(如果尚未完成)
#pip安装日志         
导入日志
logging.basicConfig(filename ='model.log',level = logging.DEBUG,format ='%(asctime)s:%(levelname)s:%(filename)s:%(funcName)s:%(message)s ')
可以在model.log文件中跟踪错误。这是一个示例错误:
模型日志
从LogRecord属性引用格式以获取属性名称,它们的含义以及%样式格式字符串中的相应占位符。日志看起来像以下格式YYYY-MM-DD HH:MM文件名。
一旦成功构建了所有UI组件和模型。您可以在本地主机(http://127.0.0.1:8050)中访问该应用程序,并可以使用训练/测试滑块,拆分和变量来查看图和度量标准是否立即更新。
结论:
带有可重复使用的Dash的Python可用于在短时间内构建一些非常复杂的分析应用程序。我个人认为它对于快速原型设计,客户演示,建议和POC很有用。整个过程中最好的部分是,您只需要了解python的基础知识,就可以创建分析应用程序核心的前端,后端,视觉效果和预测模型。如果您利用自己的创造力并专注于用户体验,那么您一定会给您的团队,客户或最终用户留下深刻的印象。
题库
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2020-12-19 15:23:50
By letting go of something, your arms are free to grab hold of something else.
谢谢分享
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群