TowardsDataScience 博客中文翻译 2021(一百七十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

用虚线绘制图表

原文:https://towardsdatascience.com/charting-with-plotly-dash-ee9334441c11?source=collection_archive---------20-----------------------

2:用于转换的单选项目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马腾·范登赫维尔Unsplash 上拍摄的照片

生物燃料

生物燃料无疑是取代目前用于车辆推进的化石燃料的最有吸引力和最实用的选择。生物乙醇生物柴油从富含糖类和淀粉的农作物中提取,具有减少二氧化碳排放和缓解气候变化不利影响的潜力。

阿根廷的生物燃料部门在过去十年中发展迅速,成为国民经济中一项非常活跃的活动,也是生产发展的一个有趣案例。

在阿根廷,生物柴油完全是以大豆为原料生产的,大豆油是制造这种生物燃料的主要原料。生物柴油的生产吸引了大量国内外投资,在阿根廷生产链中加入了一个新的环节,将生产分为国内市场和出口市场。

阿根廷的生物乙醇生产以糖蜜为基础,糖蜜是制糖的副产品,直接来自甘蔗(Sacharum officinarum L)和谷物,主要是玉米 ( 玉蜀黍)。液体生物燃料的产生对甘蔗转化链是一个有价值的补充。

仪表盘应用

之前的一篇文章中,我们讨论了 Dash 的基本特性:一个开源的免费库,麻省理工学院许可的 python 框架,广泛用于创建基于 web 的、可定制的、交互式的、响应性强的仪表盘和 dataviz 应用程序。

Dash 主要基于 ReactJS,Flask,和 Plotly。Dash 建立在 ReactJS 的顶部作为前端;它使用 Flask 作为后端,Plotly 作为数据可视化工具。

上一篇文章所述,Dash 包括三个主要的库:(1) dash_html_components ,它提供了多种 html 标签的 python 版本,可以在标题、段落、图形等应用中使用。;(2) dash_core_components ,提供下拉菜单、单选按钮、图表、滑块、按钮等多种元素;(3)*dash _ bootstrap _ components,*用于样式化用户界面。

本质上,Dash 应用程序( Dash Apps )由两部分组成:(1)描述应用程序外观的应用程序的“布局”和(2)允许应用程序交互的“回调”。

我们的仪表板外观(我们的布局)由以下内容组成:在左上角,一个条形图显示了阿根廷的生物乙醇总产量,另一个图表(转换)显示了甘蔗产量和玉米产量之间的比例。在右上角,一个条形图显示了阿根廷的生物柴油总产量,另一个图表(转换)显示了出口和国内市场产量之间的关系。在左下方,我们包括了一个堆积面积图,显示了 2015 年至 2020 年期间主要生物乙醇生产国的发展情况。最后,在我们布局的右下方,我们包括了一个面积图,显示了 2010 年至 2019 年期间世界生物柴油生产的发展。

我们的仪表板的转换是通过使用由 dash_core_components 库提供的组件 RadioItems 来实现的。功能 dcc。来自 Dash 库 dash_core_components 的 RadioItems() 允许我们呈现一组复选框。我们必须编写类似 dcc 的代码。放射性项目(选项=[{}…],value=) ,其中选项是带有字典列表,是当前选择的值。

Dash App 的交互性是通过使用回调函数来实现的。在我们的仪表板中,我们必须创建一个回调函数来指示哪些图表显示在布局的顶部。如前一篇文章所述,回调函数有两个主要部分:(1)装饰器,使用 @app.callback() 初始化;(2)用 def 关键字初始化的函数。

带破折号的图表

我们与四个公共领域数据集 : (1)阿根廷,系列 Históricas,Indicadores del Sector energyético,Biocombustibles,Cuadro 3.1: 生物柴油; (2)阿根廷,Históricas 系列,能源部门指数,生物燃料,Cuadro 3.2: 生物乙醇;(3) 世界燃料乙醇年产量; (4) EIA,美国能源信息署,国际,生物燃料

首先,我们将 Pandas 库导入为 pd,将 Plotly Express 导入为 px,将 plotly.graph_objects 导入为 go,并将我们的第一个 csv 文件转换为 dataframe:

import pandas as pd
import plotly.express as px
import plotly.graph_objects as go# Step 1: Argentine bioethanol production (units in m3)
df_bioet = pd.read_csv(path + 'produccion_de_bioetanol.csv', 
                       index_col = False,  sep = ';',
                       engine = 'python',
                       header = 1, skiprows = 2, skipfooter = 3)

下面这张截图( df_bioet )展示了一个数据科学家最糟糕的噩梦:一个数据帧,有缺失数据、冗余数据、重复数据、缺失列名、列名不一致、奇怪字符等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此,我们必须努力将其转换为适合制图的数据框架:

df_bioet = df_bioet.drop(0)df_bioet.columns = ['Year','Period', 'Tot_Prod', 'Perc_Tot', 'Cane_Prod','Perc_SCT', 'Corn_Prod', 'Perc_Corn', 'Market', 'Perc_Mkt']cols_to_drop = ['Perc_Tot', 'Perc_SCT', 'Perc_Corn', 'Perc_Mkt']df_bioet = df_bioet.drop(cols_to_drop, axis = 1)
df_bioet['Year'] = df_bioet['Year'].str.replace('*', ' ')df_bioet['Tot_Prod']   = df_bioet['Tot_Prod'].str.replace(',', '')
df_bioet['Cane_Prod']  = df_bioet['Cane_Prod'].str.replace(',', ''
df_bioet['Corn_Prod']  = df_bioet['Corn_Prod'].str.replace(',', '')
df_bioet['Corn_Prod']  = df_bioet['Corn_Prod'].str.replace('-', '0')
df_bioet['Market']     = df_bioet['Market'].str.replace(',', '')
df_bioet['Market']     = df_bioet['Market'].str.replace('-', '0'
df_bioet.reset_index()f = df_bioet['Year'].notnull()
serie = df_bioet.loc[f, "Year"] = df_bioet['Year'].ffill()
df_bioet['Year'] = seriedf_bioet['Year']      = df_bioet['Year'].astype(int)
df_bioet['Tot_Prod']  = df_bioet['Tot_Prod'].astype(int)
df_bioet['Cane_Prod'] = df_bioet['Cane_Prod'].astype(int)
df_bioet['Corn_Prod'] = df_bioet['Corn_Prod'].astype(int)
df_bioet['Market']    = df_bioet['Market'].astype(int)
df_bioet['Period']    = df_bioet['Period'].apply(str)tipo1 = df_bioet.dtypespvt1 = pd.pivot_table(df_bioet, index = ['Year'],
                values = ['Tot_Prod','Cane_Prod','Corn_Prod' ],
                aggfunc = 'sum')

以下截图对应于名为 pvt1 的数据帧:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据框架中仍有一些干预措施:将生产值减半(它们在原始文件中是重复的)并删除 2009 年和 2021 年的记录,因为这两个记录都不完整:

pvt2 = pvt1/2
pvt2 = pvt2[1:]
pvt2 = pvt2[:-1]pvt2.reset_index(level = 0, inplace = True)

现在我们为图表做好了准备。一个标准条形图是我们讲故事最符合逻辑的选择。

# First Figure: Total Argentine Bioethanol Production fig1 = go.Figure(data=[go.Bar(x=pvt2['Year'], y= pvt2['Tot_Prod'],
                       marker_color = 'DarkSlateGrey')])fig1.update_layout(title= {'text':"Argentine BioethanolProduction",
                           'font': {'size': 15}},
                   title_x = 0.5,
                   xaxis_title= 'Year', 
                   yaxis_title = 'Production (m3)',
                   width =  700, height = 500)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:阿根廷生物乙醇的生产。作者用 Plotly 制作的图表。

绘制阿根廷生物柴油生产图表的 ETL 过程与之前的过程完全相似,在初始数据库中存在相同的问题,并且增加了单位转换(从吨到立方米)。

# Step 2: Argentine biodiesel production (values in tons)df_biodsl = pd.read_csv(path + 'produccion_de_biodiesel.csv',
                        index_col = False,  sep = ';', 
                        engine = 'python',header = 1, 
                        skiprows = 1, skipfooter = 4)df_biodsl = df_biodsl.drop(0)
df_biodsl.columns = ['Year','Period', 'Tot_Prod',
                     'Perc_Tot', 'Market',
                     'Perc_Mkt', 'Export', 'Perc_Exp']cols_to_drop = ['Perc_Tot', 'Perc_Mkt', 'Perc_Exp']df_biodsl = df_biodsl.drop(cols_to_drop, axis = 1)df_biodsl['Year']    = df_biodsl['Year'].str.replace('*', ' ')
df_biodsl['Tot_Prod']= df_biodsl['Tot_Prod'].str.replace(',', '')
df_biodsl['Export']  = df_biodsl['Export'].str.replace(',', '')
df_biodsl['Export']  = df_biodsl['Export'].str.replace('-', '0')
df_biodsl['Export']  = df_biodsl['Export'].str.replace('s', '0')
df_biodsl['Market']  = df_biodsl['Market'].str.replace(',', '')
df_biodsl['Market']  = df_biodsl['Market'].str.replace('-', '0')
df_biodsl.reset_index()f = df_biodsl['Year'].notnull()
serie = df_biodsl.loc[f, 'Year'] = df_biodsl['Year'].ffill()
df_biodsl['Year'] = seriedf_biodsl['Year']      = df_biodsl['Year'].astype(int)
df_biodsl['Tot_Prod']  = df_biodsl['Tot_Prod'].astype(int)
df_biodsl['Export']    = df_biodsl['Export'].astype(int)
df_biodsl['Market']    = df_biodsl['Market'].astype(int)
df_biodsl['Period']    = df_biodsl['Period'].apply(str)
tipo2 = df_biodsl.dtypespvt3 = pd.pivot_table(df_biodsl, index = ['Year'],
                      values = ['Tot_Prod','Export','Market' ],
                      aggfunc = 'sum')pvt4 = pvt3/2
pvt4 = pvt4[:-1]# From tons to cubic meters
pvt4[['Tot_Prod','Export','Market']]=
               pvt4[['Tot_Prod','Export','Market']]* 1.1325
pvt4.reset_index(level = 0, inplace = True)

同样,标准条形图是我们讲故事的最合理选择:

# Third Figure: Total Argentine Biodiesel Productionfig3 = go.Figure(data=[go.Bar(x= pvt4['Year'], y= pvt4['Tot_Prod'],
                              marker_color = 'DarkSlateBlue')])fig3.update_layout(title={'text': "Argentine Biodiesel Production ",
                          'font': {'size': 15}},
                   title_x = 0.5,
                   xaxis_title = 'Year',
                   yaxis_title = 'Production (m3)',
                   width =  700, height = 500)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:阿根廷生物柴油的生产。作者用 Plotly 制作的图表。

下图与世界乙醇产量有关。我们决定用堆积面积图来表示两个是主要生产国,占全球产量的 85%以上。

## Step 3: World Bioethanol production (values in Mgal)df_wrld_et = pd.read_csv(path + 'world_ethanol.csv',
                         index_col = False,  sep = ';',
                         engine = 'python',
                         header = 0, skipfooter = 3)df_wrld_et_T = df_wrld_et.transpose()
df_wrld_et_T.columns = df_wrld_et_T.iloc[0]
df_wrld_et_T = df_wrld_et_T[1:]
df_wrld_et_T.index.names = ['Year']
df_wrld_et_T.reset_index(level = 0, inplace = True)# Sixth figure: stacked area chart for world bioethanol production
# 3785.4411 is the factor of conversion from Mgal to cubic meterfig6 = go.Figure()
fig6.add_trace(go.Scatter(x = df_wrld_et_T['Year'],
                          y = df_wrld_et_T['USA']*3785.4411,
                          name = 'USA',
                          mode = 'lines', 
                          line=dict(width=0.5, color='orange'),
                          stackgroup = 'one'))fig6.add_trace(go.Scatter(x= df_wrld_et_T['Year'],
                          y= df_wrld_et_T['BRAZIL']*3785.4411,
                          name = 'BRAZIL',
                          mode = 'lines', 
                          line=dict(width=0.5,color='darkgreen'),
                          stackgroup = 'one'))fig6.add_trace(go.Scatter(x=df_wrld_et_T['Year'],
                         y=df_wrld_et_T['EUROPEAN UNION']*3785.4411,
                         name = 'EUROPEAN UNION',
                         mode = 'lines', 
                         line=dict(width=0.5, color='blue'),
                         stackgroup = 'one')fig6.add_trace(go.Scatter(x= df_wrld_et_T['Year'], 
                          y=df_wrld_et_T['CANADA']*3785.4411,
                          name = 'CANADA',
                          mode = 'lines',  
                          line=dict(width=0.5,color='crimson'),
                          stackgroup = 'one'))fig6.add_trace(go.Scatter(x=df_wrld_et_T['Year'],
                          y=df_wrld_et_T['THAILAND']*3785.4411,
                          name = 'THAILAND',
                          mode = 'lines',
                          line=dict(width=0.5,color='lightblue'),
                          stackgroup = 'one'))fig6.add_trace(go.Scatter(x = df_wrld_et_T['Year'],
                          y=df_wrld_et_T['CHINA']*3785.4411,
                          name = 'CHINA',
                          mode = 'lines', 
                          line=dict(width=0.5, color='red'),
                          stackgroup = 'one'))fig6.add_trace(go.Scatter(x=df_wrld_et_T['Year'],        
                          y=df_wrld_et_T['ARGENTINA']*3785.4411,
                          name = 'ARGENTINA',
                          mode = 'lines', 
                          line=dict(width=0.5, color='yellow'),
                          stackgroup = 'one'))fig6.add_trace(go.Scatter(x = df_wrld_et_T['Year'], 
                          y=df_wrld_et_T['INDIA']*3785.4411 ,
                          name = 'INDIA',
                          mode = 'lines', 
                          line=dict(width=0.5, color='darkgrey'),
                          stackgroup = 'one'))fig6.add_trace(go.Scatter(x=df_wrld_et_T['Year'],
                         y=df_wrld_et_T['REST OF WORLD']*3785.4411,
                         name = 'REST OF WORLD',
                         mode = 'lines',
                         line=dict(width=0.5, color='darkred'), 
                        stackgroup = 'one'))fig6.update_layout(template = 'plotly_dark',
              title = dict(text = "World Bioethanol Production ",
              x = 0.5, y = 0.95),
              title_font= dict(family = 'Arial', size = 25),
              font = dict(size = 10, family = 'Verdana'),
              hovermode = False,
              width  = 700, height = 400)fig6.update_xaxes(title_text = 'Year',
        title_font=dict(size =15, family='Verdana', color='white'),
        tickfont=dict(family='Calibri', color='white', size=15))fig6.update_yaxes(title_text = "Production (m3)",
        title_font=dict(size=15, family='Verdana', color='white'),
         tickfont=dict(family='Calibri', color='white', size=15))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:世界生物乙醇产量。作者用 Plotly 制作的图表。

最后,我们使用面积图展示了生物柴油的世界产量。同样,我们有 ETL 任务,包括列转置、列重命名和行删除。我们还必须将每天数百万桶原油转换成立方米。

## Step 4: World Biodiesel productiondf_wrld_di = pd.read_csv(path + 'world_biodiesel.csv',
                         index_col = False,  sep = ';', 
                         engine = 'python', header = 1)df_wrld_di = df_wrld_di.iloc[0:2]
df_wrld_di = (df_wrld_di.iloc[1: , : ]).set_index("API")
lista = df_wrld_di.columns.values.tolist()
df_wrld_di_T = df_wrld_di.transpose()
df_wrld_di_T['Year'] = lista
df_wrld_di_T = df_wrld_di_T.iloc[11:22]
df_wrld_di_T.rename(columns={'INTL.81-1-WORL-TBPD.A': 'DieselProd'}, inplace=True)# conversion from Mb/d to cubic meterdf_wrld_di_T['DieselProd']= df_wrld_di_T['DieselProd'].astype(float)df_wrld_di_T[['DieselProd']] = df_wrld_di_T[['DieselProd']]*365 * 0.158990df_wrld_di_T['DieselProd'] = df_wrld_di_T['DieselProd'].round(2)df_wrld_di_T.reset_index(drop = True, inplace = True)# Seventh figure: area chart for world biodiesel productionfig7 = px.area(df_wrld_di_T, x = 'Year', y = 'DieselProd')fig7.update_layout(template = 'plotly_dark',
             title = dict(text = "World Biodiesel Production",
             x = 0.5, y = 0.95),
             title_font= dict(family = 'Arial', size = 25),
             width = 700, height = 400)fig7.update_xaxes(title_text = 'Year',
      title_font=dict(size=15, family='Verdana', color='white'),
      tickfont=dict(family='Calibri', color='white', size=15))fig7.update_yaxes(title_text = "Production (Mm3)", 
                  range = (0, 50000),
      title_font=dict(size=15, family='Verdana', color='white'),
      tickfont=dict(family='Calibri', color='white', size=15))

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:世界生物柴油产量。作者用 Plotly 制作的图表。

现在,是时候对仪表板进行编码了。

我们假设您安装了 Dash 如果没有,遵循这些指令

首先需要导入一些库:dash,主库;*dash _ html _ components(*html)用于构建布局;dash _ core _ components(DCC)来呈现一组复选框和 plotly 图形;输出,输入函数来自模块 dash.dependencies 进行回调。

*import dash
from dash import html
from dash import dcc
from dash.dependencies import Output, Input*

dcc.graph 组件有三个参数:(1) id ,每个图的唯一标识符;(2) ,每一个 plotly 图的具体名称;(3) style ,字典定义了图的某些方面如宽度和高度。

以下代码描述了该应用程序的外观。

*external_stylesheets= ['https://codepen.io/chriddyp/pen/bWLwgP.css']app = dash.Dash(__name__, external_stylesheets=external_stylesheets)app.layout = html.Div(children =[
                html.Div([
                   html.H1(children = 'Biofuels',
                           style = {'textAlign':'center',  
                                    'color':'darkblue',
                                    'fontSize'  : '30px',
                                    'fontWeight': 'bold'}
                           ), html.Div([
                dcc.RadioItems(id ='radio1',
                               options =
                   [{'label': 'Total Prod.  ', 'value': 'figT'},
                   {'label': 'Composition',   'value': 'figC'},],
                               value ='figT',
                             labelStyle ={'display': 'inline-flex'}                              ), html.Div([
                 dcc.Graph(id = 'A-ethanol-graph', figure = fig1,
                         style={'width': '80vh', 'height': '40vh',
                                'display': 'inline-block'}),
                          ], className = 'five columns'), html.Div([
                 dcc.Graph(id = 'A-biodiesel-graph', figure = fig3,
                        style={'width': '80vh',
                               'display': 'inline-block'}),
                          ], className = 'six columns'), ],className='row'), html.Div([
                html.Div([
                  dcc.Graph(id = 'W-ethanol-graph', figure = fig6,
                         style={'width': '80vh', 'height': '10vh',
                                'display': 'inline-block'}),
                          ], className = 'six columns'), html.Div([
                  dcc.Graph(id = 'W-biodiesel-graph', figure = fig7,
                            style={'width': '80vh',
                                   'display': 'inline-block'}),
                         ], className = 'six columns'), ]),
               ]),
        ])*

现在,是回调的时候了。我们有一个输入:组件的值 dcc。放射性同位素;和两个输出:(1)生物乙醇和生物柴油总产量的标准柱状图(图 1 & 图 3 )。(2)一个分组柱状图 ( 图 2 )显示甘蔗和玉米的生物乙醇产量,另一个分组柱状图(图 4 )显示出口和国内市场的生物柴油产量。

*@app.callback(Output('A-ethanol-graph',  'figure'),
              Output('A-biodiesel-graph','figure'),
          [Input(component_id='radio1', component_property='value')]
              )def build_graph(value):
    if value == 'figT':
       fig1 = go.Figure(data=[
                 go.Bar(x=pvt2['Year'], y= pvt2['Tot_Prod'],
                        marker_color = 'DarkSlateGrey')]) fig1.update_layout(title=
                        {'text': "Argentine Bioethanol Production",                               
                                'font': {'size': 15}},
                   title_x = 0.5,
                   xaxis_title = 'Year', 
                   yaxis_title = ' Production (m3)',
                   width =  700, height = 350) fig3 = go.Figure(data=[
          go.Bar(x= pvt4['Year'], y= pvt4['Tot_Prod'],
                 marker_color = 'DarkSlateBlue')]) fig3.update_layout(title =
                      {'text' : "Argentine Biodiesel Production ",  
                                'font': {'size': 15}},
                    title_x = 0.5,
                    xaxis_title = 'Year', 
                    yaxis_title = 'Production (m3)',
                    width =  700, height = 350) return fig1, fig3,else:
       fig2 = go.Figure(data=[
                go.Bar(name='Cane',
                       x=pvt2['Year'],y = pvt2['Cane_Prod'],
                       marker_color = 'goldenrod'),
                go.Bar(name='Corn',
                       x=pvt2['Year'], y= pvt2['Corn_Prod'],  
                       marker_color = 'lightslategray')]) fig2.update_layout(barmode='group') fig2.update_layout(title = 
                    {'text' : "Argentine Bioethanol Production ",   
                              'font': {'size': 15}},
                          title_x = 0.5,
                          xaxis_title = 'Year',
                          yaxis_title = 'Production (m3)',  
                          legend=dict(orientation="h"),
                          width = 700, height = 350)## Fourth Figure: Biodiesel Production for Export or Internal Market fig4 = go.Figure(data=[
                 go.Bar(name='Market', 
                        x=pvt4['Year'], y= pvt4['Market'],
                        marker_color = 'darkblue'),
                 go.Bar(name='Exports',
                        x=pvt4['Year'], y= pvt4['Export'],
                        marker_color = 'crimson')]) fig4.update_layout(barmode='group') fig4.update_layout(title = 
                     {'text' : "Argentine Biodiesell Production ",   
                              'font': {'size': 15}},
                          title_x = 0.5,
                          xaxis_title = 'Year',
                          yaxis_title = 'Production (m3)',  
                          legend=dict(orientation="h"),
                          width = 700, height = 350) return fig2, fig4,* 

运行服务器需要下面两行代码:

*if __name__ == '__main__':
     app.run_server(debug = False, port = 8080)*

你的屏幕上会出现下面一行: Dash 正在http://127 . 0 . 0 . 1:8080/。将其复制到您的浏览器中,您将看到生物燃料仪表板。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:生物燃料总产量。作者用 Dash 做的仪表盘。

点击单选按钮后,会出现“更改”屏幕:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6:转换屏幕。作者用 Dash 做的仪表盘。

总结一下:仪表板的概念是在一个屏幕上显示与研究目标最相关的信息。

在我们的仪表板上,我们在第一个屏幕上显示了阿根廷生物乙醇和生物柴油的总产量,以及这两种生物燃料的全球产量。可以看出,这两种生物燃料的本地产量都有惊人的增长,尤其是在 2016 年至 2019 年期间。我们也可以估计一下阿根廷在世界市场上的产量。

在转换屏幕中,我们区分了从甘蔗生产的生物乙醇和从玉米生产的生物乙醇。由于生物柴油是在阿根廷由单一原料(大豆)生产的,因此我们区分了国内市场生产和出口生产。由此可见,2012 年之前以零玉米为主的产量,是如何在短短两年内成为主要原料的。截至 2018 年,生物柴油出口和国内市场之间的趋势也发生了重大变化。

platform Dash 允许我们轻松地创建一个交互式 web 应用程序来显示这些重要的信息。

如果你对这篇文章感兴趣,请阅读我以前的(https://medium.com/@dar.wtz)

用虚线绘制图表

原文:https://towardsdatascience.com/charting-with-plotly-dash-fa96c171409b?source=collection_archive---------19-----------------------

1:损耗模式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 Unsplash

破折号

Dash 是位于加拿大蒙特利尔的技术计算公司 Plotly 创建的一个 python 框架。这是一个开源的、麻省理工学院许可的免费库,通过它你可以创建基于网络的、交互式的、可定制的、可响应的仪表盘和 dataviz 应用程序。

它的一个主要优势在于无需了解 HTML、CSS 或 Java 就可以创建 web 应用程序(尽管需要基础知识)。你不仅可以用 Python 创建 Dash 应用程序,还可以用 R、Julia 或. NET 创建 Dash 应用程序。Dash 非常简单,只需运行代码,dataviz 应用程序就会立即在 web 浏览器上显示出来。

带破折号的应用

首先,我们必须设计未来应用程序的基本结构(布局)。这是至关重要的一步,因为它决定了我们演示的视觉效果。

在布局中,我们放置应用程序的组件。为此,我们使用了两个库:dash _ core _ components和 *dash_html_components。*最后一个提供了 HTML 组件:用于为 HTML 元素创建标题、段落、图像或容器的 HTML 标签的 python 版本。另一方面, dash_core_components 提供了图形、 **下拉菜单、滑块、按钮、**等仪表盘常用组件。最后,我们必须配置一个样式属性,在这里我们定义一些 CSS 属性,比如字体大小、字体颜色、空白和其他与模板相关的方面。

还有一个名为 dash _ bootstrap _ components的库,用于设计用户界面的样式,其有用性和适用性将在以后的文章中讨论。

如果你的 Dash 应用有交互功能,你需要编写一个回调函数。回调函数有两个部分:

1.decorator,使用 @app.callback() 初始化;

2.-用 def 初始化的函数定义。

在装饰器中,我们指出了可以被用户修改的输入组件和显示应用程序对输入变化的反应的输出组件。在用 def 关键字初始化的函数中,我们编写了接受输入变化并返回相应输出的逻辑。

行动图表:损耗模式

损耗率(流失率,客户流失率)是客户停止与特定商业实体做生意的比率。这是一项业务指标,计算在给定时间内停止购买特定公司产品或服务的客户数量除以剩余客户总数。损耗率是许多公司最重要的 关键绩效指标(KPI)之一,因为它可以用来预测公司的增长或衰退。

跟踪流失率至关重要,但分析数据对于发现模式 解决造成流失的动机也非常重要。这些模式可能与人口统计学有关,也可能出于经济原因。****使这些模式可视化的仪表板将允许公司通过根据人口统计或群体划分现有客户来组织营销活动。这样,就有可能激活个性化消息或特定促销来降低流失率。

为了创建具有这些功能的仪表板,我们从 Kaggle 下载了一个数据集,该数据集由 10,000 名银行客户组成,显示了一个流失标志(现有客户与流失客户),人口统计数据:客户年龄;性别;教育水平;婚姻状况和财务数据:收入类别;卡片类别;与银行的关系期限、闲置月份等。

我们决定绘制四个图表来回答以下问题:

  • 1)婚姻状况和减员情况有关系吗?
  • 2)受教育程度与减员情况有关系吗?
  • 3)客户的年龄和减员情况有关系吗?
  • 4)帐户不活动与流失情况之间有什么关系吗?

让我们做一个仪表盘来回答这些问题。

带破折号的图表

Dash 库*dash_core_components*中的函数*dcc.Graph()*允许我们绘制图形。我们必须编写类似于*dcc.Graph(figure=fig*)的代码,其中*figure* 是函数的参数, *fig* 是用Plotly Express***(Plotly 图形库)制作的图表。***

***首先,我们将 Pandas 库导入为 *pd,plot Express 为 px,并将我们的 csv 文件转换为 dataframe:

*import pandas as pd
import plotly.express as pxpath = 'your path'
df = pd.read_csv(path + 'CreditCardCustomersCols.csv', 
                 index_col = False, header = 0, sep = ';',   
                 engine='python')*

我们的第一个图表是一个 [100%堆积条形图](http://Stacked Bar Graphs, Why & How. Storytelling & Warnings | by Darío Weitz | Towards Data Science),根据客户的婚姻状况显示流失客户的百分比。我们选择列'Attrition_Flag''Marital_Status' 将数据集中的记录从长格式转换为宽格式。然后,我们使用函数*size(*) 和函数lambda来计算相应的百分比。

*df_stack1 = df.groupby(['Attrition_Flag', 
                        'Marital_Status']).size().reset_index()df_stack1['Percentage'] =     df.groupby(['Attrition_Flag','Marital_Status']).size().groupby(level=1).apply(lambda x:100 * x/float(x.sum())).valuesdf_stack1.columns= ['Attrition_Flag', 'Marital_Status', 
                    'Counts', 'Percentage']*

下面的屏幕截图显示了名为 df_stack1 的数据集的记录:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们使用px.bar()barmode = 'stack'生成了一个用 [Plotly 表示的 100%堆积条形图](http://Stacked Bar Charts with Plotly Express | by Darío Weitz | Towards Data Science)(图 1):

*fig1 = px.bar(df_stack1, x = 'Marital_Status', y = 'Percentage',
              color = 'Attrition_Flag', 
              color_discrete_sequence=["crimson", "green"],
              barmode = 'stack', text = 'Percentage')fig1.update_layout(title = "Marital Status Customers' Attrition",
                   xaxis_title = 'Marital Status', 
                   yaxis_title = 'Percentage (%)',width = 800)fig1.update_traces(texttemplate='%{text:.2s}',textposition='inside')*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:作者用 Plotly Express 制作的 100%百分比堆积条形图。

仪表板中的第二个图表(fig2)是另一个 100%堆积条形图,根据客户的教育水平显示流失客户的百分比。代码是相同的,除了我们用原始数据帧中的 ‘Education Level’列替换了‘Marital_Status’ 列。

我们决定使用重叠直方图来回答问题 3 & 4。

因此,仪表板的第三个图表(fig3a)是一个[图表,显示了现有客户和流失客户的年龄频率分布。](http://Histograms with Plotly Express. Themes & Templates | by Darío Weitz | Towards Data Science)

我们使用px.histogram()barmode = ‘overlay’生成了 Plotly Express 重叠直方图(图 2):

*df3a = df[df['Attrition_Flag'] == 'Existing Customer']
df3b = df[df['Attrition_Flag'] == 'Attrited Customer']fig3a = px.histogram(df3a, x="Customer_Age", 
                     nbins = 10, barmode = 'overlay',
                     template = 'seaborn', color = 'Attrition_Flag')fig3b = px.histogram(df3b, x="Customer_Age", 
                     nbins = 10, barmode = 'overlay',
                     template = 'ggplot2', color = 'Attrition_Flag')fig3a.add_trace(fig3b.data[0])fig3a.update_layout(title = "Customers' Age Histogram",
                    title_font_size = 20,
                    xaxis_title = "Customers' Age", 
                    yaxis_title = 'Count',
                    width = 800, height = 350)*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:作者用 Plotly Express 制作的重叠直方图。

仪表板中的最后一个图表(fig4a)是另一个重叠的直方图,比较了现有客户和流失客户的账户不活跃的月数。代码与前一个完全相同,只是我们使用了原始 dataframe 中的*'Months_Inactive_12_mon’* 列。

现在,该是仪表板的时候了。

我们假设您安装了 Dash 如果没有,请遵循这些说明。

首先,我们需要导入三个必要的库:dash,主库;dash _ html _ components(html)用于构建布局;dash_core_components ( dcc)使用 *graph*组件渲染 plotly 图形。

**import dashfrom dash import htmlfrom dash import dcc**

接下来,我们必须通过创建一个实例来初始化仪表板。由于 Dash 应用程序使用 CSS 在 web 浏览器中呈现,因此我们包含了一个外部样式表(‘https://codepen.io/chriddyp/pen/bWLwgP.css’)

**external_stylesheets =['https://codepen.io/chriddyp/pen/bWLwgP.css']app = dash.Dash(__name__, external_stylesheets=external_stylesheets)**

然后我们必须定义我们的应用程序的布局,自然是用带有父组件html.Divapp.layout。前者是布局管理的关键字,后者是封装布局内多个组件的容器

我们的计划是在顶部放置一个标题,然后放置 100%堆积条形图,在其下方放置重叠直方图。对应的 Dash 组件在容器 html.Div children 属性中被表示为 a 列表。

dcc.graph功能中的参数有:

  • id: 每个图形的唯一标识符(字符串)
  • **人物:一个情节性人物的名字
  • style :定义(在我们的例子中)图形高度和宽度的字典
**app.layout = html.Div(children = 
               [html.Div([
                  html.Div([
                     html.H1(children = 'Attrition Data Analysis',
                             style = {'textAlign' : 'center',          
                                      'fontSize'  : '30px', 
                                      'fontWeight': 'bold',
                  html.Div([
                              dcc.Graph(id = 'marit-graph', 
                                        figure = fig1,
                                        style={'width': '90vh', 
                                               'height': '40vh'}),
                           ], className = 'five columns'), html.Div([
                              dcc.Graph(id = 'educa-graph', 
                                        figure = fig2,
                                        style={'width': '90vh', 
                                                'height': '40vh'}),
                           ], className = 'six columns'), ],
                    className='row'), html.Div([html.Div([
                     html.H1(children = ''),
                     dcc.Graph(id = 'hisage-graph', figure = fig3a,
                               style={'width': '80vh', 
                                      'height': '10vh'}),
                                    ], className = 'six columns'), html.Div([html.Div([
                     html.H1(children = ''),
                     dcc.Graph(id = 'hisina-graph', figure = fig4a,
                               style={'width': '80vh', 
                                      'height': '10vh'}),
                                    ], className = 'six columns'), ]),
                   ]),
              ])**

最后,我们添加以下两行代码来运行服务器:

**if __name__ == '__main__':
     app.run_server(debug = True, port = 8080)**

debug=True参数启用应用程序中的热重装选项。这是一个强烈推荐的选择,因为如果代码发生变化,应用程序会自动重新加载,而不需要重启服务器。

如果一切正常,应用程序运行,屏幕上将显示几行。我们真正感兴趣的行应该如下所示:

Dash 正在 http://127.0.0.1:8080/ 上运行

在您的网络浏览器中复制 url,您将看到图表仪表板。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:作者用 Plotly Dash 制作的仪表盘。

可以看出,流失情况和银行客户的婚姻状况之间似乎没有明显的关系。客户年龄或账户闲置时间也没有显示出它们是流失的原因。

为了分析教育水平和损耗状况之间是否存在任何关系,我们使用ascending = True.对相应的数据帧进行了排序。热重装选项允许我们立即获得以下仪表板:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:作者用 Plotly Dash 制作的仪表盘。

似乎受教育程度较高的顾客比受教育程度较低的同行更不满意。然而,应该进行适当的统计研究来证实这一说法。

Dash 使我们能够轻松地生成一个应用程序,让我们能够搜索流失背后的原因。不幸的是,分析的变量似乎都不是我们要寻找的答案。在以后的文章中,我们将分析原始数据框架中包含的任何其他金融变量是否是答案。

如果你对这篇文章感兴趣,请阅读我之前的文章:(https://medium.com/@dar.wtz):

“平行坐标标绘有 Plotly,规范化还是标准化?

****

饼图和甜甜圈图,带有 Plotly,Why & How

****

Chartio 正在关闭:现在怎么办?

原文:https://towardsdatascience.com/chartio-is-shutting-down-what-now-209c8a28d5b4?source=collection_archive---------28-----------------------

这里有 3 个可供分析平台转换的选项

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Chartio 已加入 Atlassian,并将关闭 Chartio 分析平台(图片由作者提供)

你可能听说了,Chartio 被 Atlassian 收购了。收购完成后,看起来他们将淘汰许多公司已经依赖的分析平台。

当前客户将有一年的时间过渡到新的供应商,以满足他们的分析需求。以下是他们在公告/迁移指南中所说的内容:

“如果你还没有看到我们的公告,Chartio 已经加入 Atlassian,该产品将于 2022 年 3 月 1 日关闭。虽然我们对未来的新篇章感到兴奋,但我们理解这可能对您产生的影响,我们希望确保您拥有顺利过渡到 Chartio 所需的一切。”

—摘自 Chartio 网站上的公告/迁移指南

如果您是 Chartio 的现有客户,并且在想“哦,不!我现在该怎么办?”别担心,这里有三个可靠的分析平台可供选择。

1.Knowi

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Knowi 中的仪表板(图片由作者提供)

Knowi 在商业情报界是一个不太知名的名字。他们的重点一直是产品开发和吸引技术受众,直到最近他们才开始成为 Tableau 和 Chartio 等公司的真正竞争对手。

Knowi 的分析平台由三部分组成:HUB、EMBED 和他们的最新产品 ELEVATE。

对于 Chartio 用户来说, Knowi HUB 与他们所熟悉的最为相似。Knowi HUB 拥有您期望从一个健壮的 BI 工具中获得的所有仪表板和图表构建功能。

Knowi EMBED 是一个版本,面向希望在自己的产品中嵌入 Knowi 分析平台的用户。对于希望向客户提供高级分析功能而无需从头构建自己的分析引擎的公司来说,这正成为 BI 工具中更常见的用例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Knowi EMBED 的一个例子,用于将 Knowi 分析引擎插入基于网络的应用程序(作者截图)

Knowi ELEVATE 是该公司的最新产品,旨在解决试图成为数据驱动的公司普遍存在的用户采用问题。

Knowi ELEVATE 产品发布会

这是一个首席信息官和首席数据官都非常熟悉的故事:他们引入了一个新的分析平台,花了大量的预算和精力来构建仪表板和分析以帮助团队,然后没有人真正看他们构建的仪表板。这一点在销售团队中尤为突出,他们仍然依赖 Salesforce 做任何事情,即使它提供的分析较差。

Knowi ELEVATE 旨在通过将数据洞察放在人们已经在工作的地方来解决这个问题:Slack 和 ms 团队内部。这些洞察力来到用户面前,而不是用户需要去寻找它们。然后,用户可以通过用简单的英语提问来跟进,并获得回答他们问题的数据和图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Knowi 数据分析平台的三个部分:ELEVATE、HUB 和 EMBED(作者截图)。

定价

Knowi 对其产品使用企业定价,因此使用 Knowi 的成本将与 Tableau 相当,但比 Power BI 贵。虽然值得注意的是,Knowi 确实为早期创业公司提供折扣。

2.功率 BI

Power BI 是微软知名的商业智能产品。在过去几年中,微软通过将 Power BI 捆绑为微软 Office 的一部分,并接近以前的铁杆 Excel 用户来帮助他们进行转换,从而获得了很多支持。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Power BI 示例仪表板(图片由作者提供)

以下是 Power BI 众所周知的一些特性:

  • 简单的拖放界面。
  • 无代码平台允许用户在 GUI 界面中做任何事情。
  • 有桌面版和云版。
  • 轻松集成到任何以 Microsoft/Windows 为中心的工作流中。
  • 捆绑到 Office 365 中,因此您可能已经拥有许可证。

定价

如果你是 Chartio 的预算计划之一,这可能是你想看的地方,因为它是三个选项中最便宜的。合同可能有所不同,但据报道,Power BI 的成本约为每个用户每月 20 美元。

3.(舞台上由人扮的)静态画面

Tableau 于 2003 年在推出,自此成为商业智能中 800 磅重的大猩猩——本质上定义了这个类别。

Tableau 以其精美迷人的数据可视化和易于构建的拖放界面而闻名。Tableau 最初是一个桌面软件,你可以把它下载到你的电脑上,然后从那里运行(相对于基于云的软件)。此后,他们开发了 Tableau 的云版本,尽管他们的大多数用户仍然运行桌面版本。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

显示图表的 Tableau 工作簿(图片由作者提供)

2019 年初,Salesforce 以价值超过 150 亿美元的纯股票交易收购了 Tableau。幸运的是,与 Chartio 目前的情况不同,Salesforce 似乎没有兴趣停止 Tableau analytics 产品。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Tableau 中按位置显示销售额(图片由作者提供)

包扎

这三个中的任何一个都可能是离开 Chartio 的好选择。如果您对价格敏感,Power BI 显然是最佳选择。如果你正在做老掉牙的分析过程,并且不介意潜在地使用桌面应用程序,Tableau 是一个不错的选择。如果您想要在团队中推动更高的参与度和采用率(Knowi ELEVATE),需要嵌入仪表板(Knowi EMBED),或者只是想要一个具有灵活本机集成的可靠的完全基于云的仪表板平台(Knowi HUB),Knowi 是一个不错的选择。

关于作者

嗨,我是肖恩。我写数据科学、禁欲主义、创业成长,偶尔也写政治。我拥有物理学和数据科学两个学位,我曾在粒子加速器、美国宇航局 JPL 研究核反应堆工作过,现在我正处于创业阶段。

在推特和 T2【Linkedin】上找到我。

聊天机器人:一个完整的 PyCharm 应用程序(第 2 部分,共 3 部分:距离度量)

原文:https://towardsdatascience.com/chatbot-a-complete-pycharm-app-part-2-of-3-distance-metric-46462a9ad4e4?source=collection_archive---------45-----------------------

Chatterbot、Django、Python 和 PyCharm 都统一在这个随时可用的聊天机器人应用程序中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

聊天和距离度量(图片由作者提供)

动机:

第一章中,我们已经在 PyCharm 中成功构建了一个聊天机器人。现在是时候训练我们的聊天机器人回答常见问题了(FAQ,不管这些是你公司的什么)。在这个故事中,我们将学习如何做到这一点(在这种情况下,培训实际上意味着什么?)我们将深入了解为什么我们的聊天机器人知道如何正确回答我们的问题。这样做的原因是,我们确实想尽可能创建最聪明的 FAQ 聊天机器人,所以现在让我们卷起袖子…

解决方案:

在基于检索的聊天机器人模型中,类似 Levenshtein 或余弦相似性的试探法用于从预定义的输入库中选择输出**。这就构成了我们聊天机器人的识**。这听起来像是显式的“if-else”编码,所以你可能会问,Chatterbot 中的机器学习在哪里?好吧,如果只是显式编码,这将意味着我们的聊天机器人将无法给出正确的答案,每次问的问题都与库的编码略有不同。简单地说,如果我们告诉我们的聊天机器人“彩色鞋子重要吗?”传统的编码是“当然,颜色让世界变得明亮”,那么如果一个英国人问我们“彩色的鞋子重要吗?”我们的聊天机器人将无法给出正确的答案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

chats.txt 中的多语言问答映射

幸运的是,当我们使用 Chatterbot 时,我们不必硬编码数万亿条规则。但是我们使用 Chatterbot 的 Levenshtein 包来计算字符串之间的相似性(将用户的输入映射到我们的 FAQ 输入-输出 Chats.txt):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

距离度量的 Levenshtein 和一般闲聊对话的语料库的导入。

我们的机器人将在 Chats.txt 文件和 Chatterbot 语料库上接受训练:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以在这里找到可用聊天机器人语料库的完整列表。

通过训练,我们确保机器人知道给出什么答案:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,由于 NLTK,甚至这个词的上下文都试图被理解。

所以当我们启动聊天机器人,问它一个问题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

…聊天机器人会努力思考:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

…并给出与该问题最相关的答案,例如使用 Levenshtein。

作为一次短暂的旅行,让我们理解一下 Levenshtein 基本上是如何坚持我们简单的“彩色鞋子”Jupyter 笔记本例子的。我们只需要导入:

import Levenshtein

…能够使用莱弗施泰因的距离函数。两个相同句子的结果显然是距离为 0,正如我们在示例中看到的:

Levenshtein.distance(
‘Do colorful shoes matter’,
‘Do colorful shoes matter’)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Levenshtein 距离为 0,因为两个句子是一样的。

现在让我们稍微修改一下这句话,这次用英国的“颜色”一词:

Levenshtein.distance(
‘Do colorful shoes matter’,
‘Do colourful shoes matter’)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Levenshtein 距离现在是 1,因为唯一的变化是字符“u”的颜色。

最后,如果我们在句尾再输入五个单词(包括两个空格),我们得到的 Levenshtein 距离为 8:

Levenshtein.distance(
‘Do colorful shoes matter’,
‘Do colourful shoes matter at all’)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“u”和“根本”之差总共是 8。

Levenshtein(也称为编辑距离)对于比较单词或相似的句子非常有用。

相反,余弦相似度在比较差异更大的完整句子时有意义。如果我们在这些情况下坚持使用 Levenshtein ,Levenshtein 很可能会计算出一个相对较大的距离,尽管这两个句子传达了非常相似的关键信息:

Levenshtein.distance(
‘Do colorful shoes matter’,
‘At all, do colourful shoes really matter’)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管两个句子的上下文非常相似,但还是相对较远。

由于 Chatterbot 的机器学习分类器,我们的聊天机器人可以进一步使用对话的上下文从预定义的消息列表中选择希望的最佳响应。所以我们的聊天机器人不仅知道颜色和色彩很可能是相同的,而且机器人应该进一步知道鞋子和衣服密切相关(即使我们以前从未用衣服这个词训练过我们的聊天机器人)。这方面的理论背景超出了本文的范围,但我们可以理解,主要是由于 NLTK(自然语言工具包)和余弦相似性,我们的聊天机器人语料库理解了鞋子和衣服之间的联系。看看这个令人印象深刻的视觉化图像,了解一下高维单词向量空间的概念:

http://projector.tensorflow.org 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“鞋”被理解为与“衣”、“衣”、“穿”、“穿”非常相似(截图来自projector.tensorflow.org)

简而言之,我们的聊天机器人会查看输入,并搜索它已经训练过的、最接近用户问题的输入。然后,机器人返回与该问题相关的答案。

为了调优这些参数,让我们查看 Views.py,看看我们的逻辑适配器设置。是适配器决定了 ChatterBot 如何选择对给定输入语句的响应的逻辑,并且有多种方式设置它们。我们在应用程序中使用了 BestMatch。BestMatch 将根据与输入(用户问题)最接近的已知响应返回一个响应。我们已经将两个语句之间的最大相似度设置为 90%,使用最大相似度来计算机器人的置信度:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果聊天机器人估计不知道正确答案,它会问“请你用其他的话重复一下你的问题好吗?”

正如生活中经常出现的情况一样,对于如何设置这些参数的问题,没有绝对 100%的对错。这完全取决于你的 FAQ 背景,你想使用哪种逻辑。你的聊天机器人是不是应该只在绝对有把握给出正确答案的情况下才回应?或者它应该表现得更像一个话匣子,每次都给出答案,即使不一定总是最好的答案?我能给你的唯一诚实的建议是在你的数据上尝试一下(参考伟大的聊天机器人网站了解更多细节)。

恭喜,我们现在有一个完整的聊天机器人在运行,我们知道如何训练它来尽可能最好地回答我们的问题!我们仅仅关注基本的问答映射,但是上下文还可以包括特定对话流中的当前位置,或者之前保存的变量,如主题(例如,“您希望聊天机器人回答主题 a 或 b 中的问题吗?”).进行对话流对话将是另一篇文章的主题。

目前,非常感谢阅读!希望这篇文章对你有帮助。请随时在 LinkedInTwitter工作室与我联系。

https://jesko-rehberg.medium.com/membership

最初发表在我的网站 DAR-Analytics

聊天机器人:一个完整的 PyCharm 应用

原文:https://towardsdatascience.com/chatbot-complete-pycharm-app-3517b64075f2?source=collection_archive---------18-----------------------

Chatterbot、Django、Python 和 Pycharm 都统一在这个随时可用的聊天机器人应用程序中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

动机:

你正在寻找一个完全准备好的聊天机器人,它可以很容易地适应你的需求吗?如果你愿意结合使用 Python、Pycharm、Django 和 Chatterbot,就不用再看了。最重要的是,这个应用程序中甚至添加了一个 SQLite 数据库,所以你可以分析用户的输入和聊天机器人的输出。

这篇文章关注的是如何让一个 FAQ 聊天机器人运行起来,而不涉及 chatterbot 的理论背景,这将是另一篇相关文章的主题。

解决方案:

首先,请确保您安装了 PyCharm。如果没有,请现在就做:

www.jetbrains.com安装免费社区版。

之后,在 PyCharm 开始新项目之前,请复制我的 Google Drive 文件夹中的所有文件:https://Drive . Google . com/Drive/folders/1 ixxjznr 8 pbgfsiypwj 92 fxnqx 35 ezoft?usp =共享

…并将其复制到您的 PyCharm 项目文件夹中(通常在您的用户文件夹中):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后打开 PyCharm,点击“新建项目”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择 ChatbotProject 文件夹(您刚刚从我的 Google Cloud 下载的)作为您新的虚拟环境(virtualenv)项目的位置。还要确保 Python 解释器指向 Python 3.7:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

确保文件夹“venv”是空的。如果没有,就删除该文件夹中的所有文件。

确认要从现有来源创建后:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下一步,添加配置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

…点击左上角的加号:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

必须输入这些设置的位置:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从现在开始,您只需点击“运行”按钮即可启动 Manage.py:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

…然后单击本地主机链接,这将在几秒钟后启动:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果现在有导入错误弹出,类似于:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

…您所要做的就是转到 settings 并在 Python 解释器部分导入必要的包:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请确保 Django 2.2 和 Chatterbot 1.0.2。已安装。这将确保我们的聊天机器人能够很好地与 Python 3.7 一起工作:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果您现在再次运行“manage.py ”,您可能会在第一次启动 chatbot 时收到以下消息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这种情况下,请到您的终端并输入:

python manage.py migrate

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在再次运行 manage.py,您的聊天机器人应该可以在您的浏览器中工作了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

输入您的信息,然后点击下面的发布按钮。

你输入一个问题,我们的机器人有望给我们正确的答案:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以输入一个问题,你的聊天机器人会给你这个问题的答案。聊天机器人可能知道正确答案的原因是因为您的 chats.txt,您可以在这里修改它:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们的例子中,我们使用了英语和德语的输入输出映射。

如果您更喜欢 yaml 文件而不是 chats.txt,您也可以改编这些语料库文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请注意,除了 FAQ,其他都是 chatterbot 模块。这是我自己为了学习而创作的:

Chatterbot 是一个非常有趣的聊天机器人,它使用机器学习技术。如果你想了解更多关于 Chatterbot 的细节,请看看 chatterbot 网站。

还有什么要补充的吗?

现在一切都运转良好。但是,如果添加一个数据库连接,这样我们就可以分析 chatbot 的输出和用户的输入,岂不是很酷?

因此,我们必须再次进入设置,但这一次我们将安装在插件部分。搜索数据库导航器并安装插件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后输入新的数据库连接:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择 SQLite 并添加 db.sqlite3 作为数据库文件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单击测试连接,检查它是否正常工作。

在安装了 Database Navigator 之后,我们第一次运行 Chatbot 后,查看“statement”表,我们可以看到所有训练过的对话:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果你想从零开始学习,删除这些文件就行了。

恭喜,我们有一个完整的聊天机器人运行!我们将在的另一篇文章中详细讨论聊天机器人的学习。

目前,非常感谢阅读!希望这篇文章对你有帮助。请随时在 LinkedInTwitter工作室与我联系。

https://jesko-rehberg.medium.com/membership

最初发布于我的网站 DAR-Analytics

QnA Maker 聊天机器人策略

原文:https://towardsdatascience.com/chatbot-strategy-with-qna-maker-9554e5bd7782?source=collection_archive---------27-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由皮克斯拜默罕默德·哈桑拍摄

边学边学,不要丢脸

逐步实现聊天机器人不仅可以为您省去与聊天机器人相关的麻烦,还可以在此过程中为您的组织提供有价值的服务。开始这一旅程的一个极其简单的方法是使用 Microsoft QnA Maker。(本文不是微软赞助的,他们也没有任何编辑影响力。)

众所周知,聊天机器人服务于各行各业,尤其是客户服务。他们与客户“交谈”,这是聊天机器人的一个不错的自助用例,但也是一个“太多太快”的警示故事聊天机器人失败的例子有很多

我提出了一条途径,让你在完成组织内的一个重要目标的同时,更容易地学习别人通过艰难的方式学到的东西,而没有风险;有效分享机构知识。

听起来好得难以置信。

很公平,但事实并非如此。QnA Maker 不太像聊天机器人,更像知识库,但是不要搞错,知识库是作为聊天机器人公开的。想想这意味着什么。想象一下,一个 SharePoint 搜索实际上是可行的,想象一下,在过早公开之前,在你自己的公司内部对它进行测试。

创建 QnA Maker 实例

我首先需要有一个 Azure 帐户。创建一个免费账户并不困难(而且你得到的不仅仅是 QnA Maker)。您可以导航到 https://www.qnamaker.ai 并在那里创建您的帐户,或者您也可以前往https://azure.portal.com。

创建新帐户后,我导航回 QnA Maker 主页,并选择创建知识库

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

注意,我在微软认知服务部门,这是 Azure 的一部分(这种联系很快就会变得更加明显)。创建知识库页面类似于向导,第一步是我连接 Azure 的地方。

选择创建 QnA 服务。(不要忘记我为什么这样做,这是为了 QnA Maker 实例——很容易忘记并认为你只是在做一些 Azure 的东西!)

瞧啊。我被弹出到 Azure Portal 来创建一个 QnA Maker 实例。以下是我对创建屏幕的选择:

  • 我查了一下托管(预览)
  • 我选择了我的订阅
  • 我有一个我选择的测试资源组(如果您没有,创建一个)
  • 我将我的实例命名为 medium-article-qna-maker (需要有命名约定)
  • 我选择了*(美国)美国中南部*作为地点(尽可能选择离你近的地点)
  • 我只能选择*标准 S0(免费预览,每分钟 600 笔交易)*定价层(我认为这就足够了)
  • 对于 Azure 搜索位置,我保留了默认设置,( US) East US (再次选择地理位置离你近的地方)
  • 对于 Azure 搜索定价层,我节俭地选择了免费的 F (3 个索引)
  • 通过勾选“我确认…”复选框,我接受了法律条款

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

然后我选择了屏幕底部的审查+创建(图中未显示),然后在下一个屏幕中选择创建。过了一段时间,我的 QnA Maker 实例就创建好了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这就是为什么记住我为什么这么做很重要。选择进入资源很有诱惑力,但是用海军上将贾尔·阿克巴的不朽名言来说,

这是个陷阱!

不,这真的不是陷阱,但这不是我接下来需要做的。接下来,我返回到创建 QnA Maker 向导并继续。步骤 2 从选择刷新按钮开始(因为有些值是基于刚刚在 Azure 中创建了资源而被填充的)。

我的 Active Directory ID 已被选中(它与我的新 Azure 帐户相关联)。我选择了我的订阅,我的新的 Azure QnA 服务(它被命名为medium-article-QnA-maker),以及英语作为语言。

步骤 3 中,我输入了中型文章知识库作为知识库名称。(注意,微软没有给那个机器人命名为。我跳过步骤 4 (但创建或导入现有知识库是一个很酷的功能),直接进入步骤 5 并选择创建您的知识库

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

使用 QnA Maker

QnA Maker 是一个全功能的应用程序,并且“数据”(问题和答案对)耦合在自然语言处理中,以实现对话式人工智能。您可以按原样使用 QnA Maker,或者让它成为其他东西的基础(例如,网站的聊天机器人)。

知识库用户界面非常简单,它基于一个基本结构:问题和答案。我让启用丰富编辑器开关打开,并选择 +添加 QnA 对

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

没有比下一个屏幕更简单的了。我输入一个包含零到多个备选短语的问题以及问题的答案。

但是请注意,当我在输入一个带有备选措辞的问题后,将光标放在输入答案部分时会发生什么:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这就是富编辑器的用武之地。答案可以被显著地修饰。在我的例子中,我想添加一个超链接。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我输入我的文本以显示URL 。就这些了。如果我正在构建一个强大的知识库,我会输入许多 QnA 对,或者从某个来源(例如,网站—如 FAQ—Excel 电子表格、Word 文档)导入它们。一旦 QnA 对完成,我从顶部选择保存并训练

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

现在我将测试知识库,这是您看到的 QnA Maker 聊天界面。出现的是一个聊天窗口,您可以在其中输入任何文本。我逐字输入我的问题(因为如果它不能逐字做,它能做什么!?).

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

好吧,这是可行的,但 SharePoint 或任何其他基于索引的搜索引擎可以做到这一点,对不对?我同意。我要尝试一些变化…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我不得不努力让它失败。请注意,拼写错误甚至工作,直到我去所有的语音。SharePoint 不会这样做,它当然也不是对话式的。

这里微妙的一点是,你真的不需要明确地有许多不同的备选问题——QnA Maker 做了一件体面的工作,弄清楚被问的是什么。

下一步是什么?

随着您的聊天数据的工作,您可以轻松地将 QnA Maker 附加到实际的聊天机器人上,或者您可以(即使我不建议这样做)直接使用 QnA Maker。用户可以在 QnA Maker 中做很多正确的事情,特别是如果他们是知识库的内容创建者(例如,根据需要添加新的 QnA 对)

但是回到最初的观点——我的新知识库可以在我的庞大的 FranklyAI 帝国内使用(恰好一个人),以帮助员工理解政策和程序、fid 有用信息,或者部门和/或系统特定信息。这是一个低风险、高价值、低成本的提议,更重要的是,你可以在你自己的机器人的舒适环境中理解聊天机器人如何工作(和不工作)。

您可能没有想到其他的东西,但是实际内容可以(也应该)100%由最终用户维护。使用 QnA Maker 对任何计算机用户(即使是新手)来说都很简单。

但是还有什么呢?

QnA Maker 就像汽车的发动机,但它不一定是内饰。然而,为 QnA Maker 建立一个聊天界面非常容易,甚至更容易将其连接到现有的渠道,如微软团队(想象一个可以告诉你东西在哪里的团队机器人)、电子邮件、微软 Power 虚拟代理、API,等等。更何况每个渠道(网络、文字、邮件等。)共享同一个 KB 实例,因此 QnA Maker 中的更改会被填充到所有通道中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我将为您留下一些 QnA Maker 资源以供进一步研究。如果我的时间表允许的话,我会回来告诉你如何连接不同的频道(这些链接也会带你去那里)。

资源

[1]Microsoft.com。微软快速启动:创建、培训和发布你的 QnA Maker 知识库 (2020)。

[2]Microsoft.com。教程:添加你的知识库给虚拟代理 (2020)。

与 Geotab 数据和分析副总裁 Mike Branch 聊天

原文:https://towardsdatascience.com/chatting-with-the-vp-of-data-analytics-at-geotab-mike-branch-1ef04260c9f?source=collection_archive---------27-----------------------

与全球最大的远程信息处理行业领导者之一聊天

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由 Mike Branch 提供

老实说,在决定我想在哪里发展职业生涯时,我是一个非常挑剔的人。也就是说,我非常幸运地在 6 个月前遇到了 Geotab。每天,我都和一群真正的数据迷一起工作,从事真正有趣的项目,并向一位不可思议的导师学习,他也是我的老板!

最重要的是,我有机会与 Geotab 数据和分析副总裁 Mike Branch 合作撰写一篇文章。迈克毫不犹豫地抓住这个机会,写了非常有思想的回应,我想每个人都可以从中学习。

如果你想了解更多关于 Geotab 的信息,了解是什么让这家世界上最大的远程信息处理公司如此成功,以及宝贵的职业建议,请留下来。

说到这里,我向大家介绍 Geotab 数据和分析副总裁 Mike Branch!

关于你

1.在你人生的哪个阶段,你意识到你想进入数据科学/数据分析领域,为什么?

我的职业生涯始于一名计算机工程师和软件开发人员,经营自己的软件开发业务刚刚超过 10 年。我一直对创建视觉上吸引人的软件有着着迷和热情,在这样做的过程中,战斗的一部分总是如何以一种对他们有意义和可操作的方式向我们的客户传达数据。

直到我卖掉公司,转到 Geotab,我才完全沉浸在数据科学领域,并立即爱上了它。这是 5 年前的事情,我之前做的一切都是由分析驱动的,而不是基于机器学习概念或任何与人工智能无关的东西。

我立即被机器学习的世界所吸引,因为它改变了我的思维模式(因为它与人们对传统软件开发的思考方式如此不同),并且它开辟了一个新的机会世界,以更简化的方式提供更高层次的洞察力。现在我可以用我的爱来创造视觉上吸引人的软件,并结合强大的 ML 驱动的洞察力。

2.你最喜欢的数据科学概念是什么,为什么?

强化学习(RL)领域对我来说非常有趣,因为这里有很多未开发的潜力,并且它不围绕着拥有大量标记数据,而这些数据是传统监督学习方法所必需的。过去,我们在很大程度上看到它应用于游戏和机器人,但随着基于云的 RL 平台开始通过提供必要的 RL 环境来进一步民主化这一领域,这对于这些利基用例之外的行业来说变得越来越令人兴奋。

3.我觉得这个疫情给了我们很多额外的时间。你在空闲时间喜欢做什么?

我不确定我是否同意这个疫情给我的“更多时间”)我和我的妻子在 3 月 15 日这个疫情开始的时候有了我们的第三个小孩(一个女孩)。我仍然记得走进医院对面的星巴克,看到所有的座位都被推到一边,还有新冠肺炎的警告标志。这是我们今天的标准,但在当时是令人震惊的。所以,我在疫情的生活围绕着我的两个儿子和一个刚出生的女儿(都是 5 岁或更小的:)的家庭时光。我的妻子应该在这里获得一枚奖章!

关于 Geotab

3.对于那些不知道什么是远程信息处理的人,你将如何向他们解释它,它与数据科学有什么联系?

非常广泛地说,远程信息处理领域捕获车辆运动和健康数据,并将其传输回基于云的环境,以便摄取到软件平台中。

我们在商业远程信息处理领域为规模从 1 到 100K 以上的车队提供服务。我们从全球超过 200 万辆商用车辆中获取数据,每天处理超过 400 亿条记录。然后,我们 80 人的数据科学团队从这些数据中产生洞察力,以帮助我们的客户。我们会回答这样的问题:从燃油经济性的角度来看,哪种车最适合我?我车上的电池什么时候会失效?我的哪些车辆没有得到充分利用?哪些车辆可以过渡到电动车?

Geotab 拥有世界上最丰富的车辆数据集,可以为我们的客户提供从位置数据到大量发动机诊断数据的价值,包括 RPM、挡风玻璃雨刷激活、电动汽车充电状态。对于希望有所作为的数据科学家来说,处理如此大量和多样的数据具有巨大的吸引力,正如我的一位同事所说→“他们为数据而来,但为文化而留。”

4.ABI 研究公司去年将 Geotab 列为第一名——从数据分析的角度来看,是什么使 Geotab 独一无二,从而成为世界上排名第一的远程信息处理公司?

我们的核心是数据驱动的文化。这一信息在我们的企业口号“通过测量进行管理”中非常明确,并由我们的首席执行官推动,他在如何运营组织和他所创造的文化中体现了数据驱动的含义。

我认为我们的不同之处在于我们处理数据问题的方式——我们专注于为客户创造价值,而不是货币化。这似乎是一个微小的差别,但如果你过度关注数据货币化,它可能会导致你创造出不符合客户长期利益的产品。我们还坚信利用数据做好事,并在我们的开放数据门户 Geotab Ignition 上提供了大量聚合数据集,供开发人员和数据科学家用来创建更安全驾驶和更安全城市的应用程序——从城市中的危险驾驶区到超局部降水(来自雨刷激活)。我们的团队还非常重视快速实验和创建基于数据的 MVP(最小可行产品),这真正促进了新想法的孵化,并进一步巩固了 Geotab 作为市场领导者的地位。

分享建议

5.你认为最重要的数据科学概念是什么,为什么?

将数据视为产品。我指的不仅仅是数据清理。在组织中,数据常常被视为另一个过程的副产品,人们必须认识到,数据是为人工智能提供动力的燃料,为了让我们拥有好的人工智能并做出好的预测,我们必须拥有好的数据。这从将数据视为组织中的产品开始。我指的是数据目录、数据沿袭、数据可发现性、使用策略、异常检测、监控、驻留、摄取管道、隐私等。有一大堆工作有时不那么光彩,但对于可持续的数据实践来说绝对是必不可少的,这些数据实践可以产生良好的模型,并推动更好的洞察力。

6.你认为人们忽略了什么技能,但应该在数据行业花更多的时间?

SQL。这可能看起来相对简单,但是数据科学家(在我看来)通常在 Python 和 R 方面有很好的造诣,但是 SQL 经验一般。对于 SQL,我不仅仅指编写 select 语句的能力,我还指复杂的连接、窗口、地理空间操作、在高效查询中处理大量数据等。有了像 Google BigQuery 和 Snowflake 这样的平台,我们越来越多地看到,仅仅利用 SQL,实际上可以做多少准备和预处理数据的工作。事实上,在许多情况下,您可以利用高级 SQL 语法来创建和训练基本模型(其中许多模型可以满足您 90%的业务需求)。

7.最后,你对那些刚刚开始数据科学/数据分析职业生涯的人有什么建议吗?

在我看来,我相信那些将软件工程实践融入其数据科学职业生涯的人处于最佳位置,因为他们知道如何将模型从初始阶段带到生产阶段,并且他们知道如何将模型扩展到整个生态系统。不仅如此,这些人还能够在他们新开发的模型周围包装一个软件或 API,并能够迅速向最终用户强调其优势,更快地实现采用。否则,模特们会冒着呆在实验室里看不到阳光的风险。

感谢阅读!

我希望你觉得这篇文章很有见地,很有趣!再次感谢迈克与我们分享你的经验和智慧。

如果这激起了你对 Geotab 的兴趣,我们发展得真的很快,我强烈建议你去 看看我们的 。如果您有任何问题,我也非常乐意在 LinkedIn 上与您联系!

不确定接下来要读什么?我为你挑选了另一篇文章:

还有一个:

特伦斯·申

  • 如果你喜欢这个, 跟我上媒 了解更多
  • 有兴趣合作吗?让我们连线上LinkedIn
  • 报名我的邮箱列表 这里

检查熊猫数据帧列中的子字符串

原文:https://towardsdatascience.com/check-for-a-substring-in-a-pandas-dataframe-column-4b949f64852?source=collection_archive---------0-----------------------

大蟒

寻找字符串来减少用于分析和机器学习的数据集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·温克勒在 Unsplash 上的照片

熊猫图书馆是一个全面的工具,不仅用于处理数字,也用于处理文本数据。

对于许多数据分析应用和机器学习探索/预处理,您可能希望从文本数据中过滤或提取信息。为此,Pandas 提供了广泛的内置方法,您可以使用这些方法来添加、删除和编辑数据帧中的文本列。

在本文中,让我们具体看一下在 DataFrame 列中搜索子字符串。当您需要基于现有数据创建新类别时(例如在训练机器学习模型之前的特征工程期间),这可能会很方便。

如果你想继续,在这里下载数据集。

import pandas as pddf = pd.read_csv('vgsales.csv')

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们开始吧!

注意:在这篇文章中我们会用到很多 *loc* ,所以如果你不熟悉这种方法,可以看看这篇文章底部的第一篇文章。

使用“包含”在熊猫数据帧中查找子串

Pandas 中的 contains 方法允许您在一列中搜索特定的子字符串。contains 方法返回系列的布尔值,如果原始系列值包含子字符串,则为 True,否则为 False。contains 的一个基本应用程序应该看起来像Series.str.contains("substring")。但是,我们可以通过增加两项内容立即将此提升到下一个级别:

  1. 使用case参数指定是否匹配字符串大小写;
  2. 使用返回的一系列布尔值作为掩码来获得数据帧的子集。

应用这两个应该是这样的:

pokemon_games = df.loc[df['Name'].str.contains("pokemon", case=False)]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用loc方法允许我们只获取 DataFrame 中包含字符串“pokemon”的值。我们简单地使用了contains方法,根据“名称”列是否包含我们的子字符串来获取真值和假值,然后只返回真值。

在 Pandas 中使用 regex 和“contains”方法

除了匹配常规子串,我们还可以使用contains匹配常规表达式。我们将使用与之前完全相同的格式,只是这次让我们使用一点 regex 来只查找基于故事的口袋妖怪游戏(即排除口袋妖怪弹球之类的游戏)。

pokemon_og_games = df.loc[df['Name'].str.contains("pokemon \w{1,}/", case=False)]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面,我只是使用了一些简单的正则表达式来查找匹配“pokemon”+“一个或多个字符”+“/”模式的字符串。新面具的结果返回行包括“口袋妖怪红/口袋妖怪蓝”,“口袋妖怪金/口袋妖怪银”,等等。

接下来,让我们做另一个简单的例子,使用 regex 查找名称中带有“football”或“soccer”的所有体育游戏。首先,我们将使用一个简单的条件语句来过滤掉所有带有“sports”类别的行:

sports_games = df.loc[df['Genre'] == 'Sports']

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您会注意到,上面并没有真正需要匹配子串或使用正则表达式,因为我们只是根据类别选择行。然而,当匹配行名时,我们需要在不同类型的字符串中搜索子字符串,这正是 regex 派上用场的地方。为此,我们将执行以下操作:

football_soccer_games = sports_games.loc[df['Name'].str.contains("soccer|football", case=False)]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,我们已经得到了一个数据框架,其中只包含名称包含“足球”或“橄榄球”的游戏。我们简单地使用了“|”regex“or”操作符,它允许您匹配包含一个或另一个子字符串的字符串。

因此,我们成功地得到了一个数据帧,它的名字包含“football”或“soccer ”,但我们实际上不知道它包含这两个字符串中的哪一个。如果我们想知道它包含两个中的哪一个,我们可以在 name 列上使用findall方法,并将返回值赋给 DataFrame 中的一个新列。

findall方法返回正则表达式模式的匹配,该模式是在调用它的序列的每个字符串中指定的。该格式与 contains 方法基本相同,除了您需要导入re以不匹配字符串大小写。

import re
football_soccer_games['Football/Soccer'] = football_soccer_games['Name'].str.findall('football|soccer', flags=re.IGNORECASE)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

您将在返回的数据帧的末尾看到一个包含“Soccer”或“Football”的新列,这取决于视频游戏名称包含两者中的哪一个。如果您需要基于现有列并使用这些列中的值来创建新列,这可能会很有帮助。

最后,为了快速排除字符串,只需在基本的contains方法上增加一个操作符,让我们尝试得到所有名称中不包含“FIFA”的足球和英式足球游戏。

not_fifa = football_soccer_games.loc[~football_soccer_games['Name'].str.contains('FIFA')]

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如你所见,我们简单地使用了~操作符,它允许我们在loc方法中获取掩码的所有假值。

仅此而已!

使用字符串可能有点棘手,但内置的 Pandas 方法是通用的,允许您以几乎任何需要的方式分割数据。containsfindall方法允许您做很多事情,特别是当您能够编写一些正则表达式来真正找到特定的子字符串时。

祝你好运!

**More by me:** - C[onditional Selection and Assignment With .loc in Pandas](/conditional-selection-and-assignment-with-loc-in-pandas-2a5d17c7765b?sk=e5672d859a3964c1453a1c09edca22cf)
- [Squeezing a New Trick Into Your Pandas Repertoire](/squeezing-a-new-trick-into-your-pandas-repertoire-d8ae3f338246?sk=a9d67d24b1ef469a88090b647f15ea50)
- [2 Easy Ways to Get Tables From a Website With Pandas](/2-easy-ways-to-get-tables-from-a-website-with-pandas-b92fc835e741?sk=9981ddaf0785a79be893b5a1dd3e03dd)
- [Top 4 Repositories on GitHub to Learn Pandas](/top-4-repositories-on-github-to-learn-pandas-1008cb769f77?source=friends_link&sk=d3acc38062490a86ecb46875342224e6)
- [Learning to Forecast With Tableau in 5 Minutes Or Less](/learning-to-forecast-effectively-with-tableau-in-6-minutes-or-less-3d77a55930a0?source=friends_link&sk=9abdfd7533ee9a31ab8a036413450059)

使用二进制扩展测试(BET)检查依赖性

原文:https://towardsdatascience.com/checking-for-dependency-using-binary-expansion-testing-bet-5234a818a18?source=collection_archive---------41-----------------------

统计独立性的一种新的非参数检验

夜空中的星星是均匀分布的吗?星系在宇宙中是均匀分布的吗?T 细胞是否为了杀死癌细胞而渗透到整个肿瘤?草原上的植被怎么样?在许多情况下,我们希望确定样本是否均匀地从感兴趣的空间中抽取。尽管这个问题听起来很简单,但是没有一个通用的解决方案可以满足所有的目的。最近,来自北卡罗来纳大学教堂山分校的张开为此引入了一个称为二进制扩展测试(BET)的优雅框架。这篇文章旨在为 BET 提供直观的解释。

让我们假设数据点分布在一个单位正方形内。然后每个点由两个随机变量 XY 指定。为了确定均匀性,有两个问题需要解决:1 . XY 是否遵循均匀分布?2. XY 在统计上是否独立?BET 是为问题 2 制定的,因此让我们先关注问题 2,然后再回到问题 1。

看一下实数 x= 0.375 *。*当然,按照通常的十进制形式写,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是在二进制数字系统中,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一般来说,任何实数 x 使得 0≤x≤1 都可以表示为一个序列{ b ᵢ}与 b ᵢ=0 或 1。认识到ᵢ}可以被描绘成一系列二元决策是很重要的。第一项意味着区间[0,1]被划分成大小为 1/2 的 2 个仓,并且被询问 x 是位于左仓( b ₁=0)还是右仓( b ₁=1).)由于答案是“左”,第二项意味着区间[0,1/2]然后被进一步划分成大小为 1/4 的 2 个箱,并且被询问 x 是位于左箱( b ₂=0)还是右箱( b ₂=1).)这一次答案是“正确的”,它进入第三项,其中区间[1/4,1/2]被分成大小为 1/8 的两个箱,并且我们有另一个决策树 b ₃.

二进制展开可以被视为使用二进制变量划分单位区间的一种方式,而不是关注如何将实数映射到二进制数序列。一般来说, d 二元变量可以将单位区间分成 2 个ᵈ区间,每个长度为 d 的二元序列对应一个区间。给定从[0.1]中提取的随机变量 X ,我们可以通过 d 二进制随机变量来近似 X ,其中 d 确定面元大小,从而确定分辨率。很快就会清楚,用 aᵢ =2 bᵢ -1 代替 bᵢ 会更方便。换句话说,二进制变量取值为 1。

现在来看两个随机变量 XY 的相关性,这两个随机变量取自一个单位区间。我们选取某一深度的 d 并通过两个二进制随机变量序列来近似 Xy{xᵢ}和{ Xⱼ }其中 ij 从 1 运行到 *d,*和 XᵢXⱼ 取值回想一下 d 二元变量可以将单位区间划分为 2ᵈ箱,两组这样的变量将单位正方形划分为 2 个ᵈ小正方形,一个数据点 (X,Y) 将落在其中一个小正方形上。然而,BET 的关键不仅仅是将单个数据点分配给一个网格。BET 的目标是检查分布在网格上的数据点集合的均匀性。为了实现这一目标,BET 将网格一分为二,并计算每一半中的数据点数量。基于二进制变量的一个巧妙的技巧实现了对分。

为了说明这一点,让我们考虑一下情况 *d=2。*随机变量 XY 被映射到 4 个二元变量 X₁、X₂、Y₁、Y₂ 上,这些变量将单位正方形分成 4×4 的网格。有许多不同的方法可以将网格一分为二,例如,将网格分成左半部分和右半部分,或者分成上半部分和下半部分,或者分成棋盘。使用的关键观察:所有可能的二等分都可以被 X₁、X₂、Y₁、Y₂ 以及它们的组合捕获。例如,变量 X₁ 将网格分为左半部分( *X₁=-1,*蓝色)和右半部分( *X₁=+1,*白色);变量 Y₂ 将网格切割成水平带( *Y₁=-1,*蓝色; *Y₁=+1,*白色);并且棋盘可以通过组合 X₂Y₂= 1 来获得(这实际上是我们更喜欢值 1 到 1 或 0 的原因)。通过列举二元变量所有可能的选择,不难看出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这种二分法的例子如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二元函数对分(蓝色:-1,白色:+1)KKY 图像

列举了所有可能的二等分,一致性的推论是简单的。本质上,给定一个等分线,我们计算落在蓝色和白色区域的数据点的数量, n=nᵇ+nʷ 。由于蓝色和白色区域的面积相等,因此在 XY 之间缺少相关性将导致 nᵇ≈nʷ 。我们可以简单地用二项分布 B (n,p= 1/2 ) 作为空值,给观测值赋一个 P 值。由于二等分的数量呈指数级增长,p 值应针对多重假设检验进行调整,例如,乘以因子 2 ᵈ-1.

让我们看看张开手稿中的一个具体例子。他和他的同事已经在 R 包中实现了 BET。绝对值得一试。在下图中。红点表示天球上恒星的分布,其中 XY 是两个坐标参数。使用 d=2, BET 对所有等分线进行了测试,发现所示等分线呈现出一种具有最显著 q 值的不对称性。因此,BET 得出结论,恒星并不是均匀分布的,这当然是事实,因为恒星密集地分布在银河系的中心。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

天空中星星的分布(数据来源:Ref 2,KKY 使用 Ref 生成的图。2)

到目前为止,我们已经概述了 BET 背后的直觉。一个问题不清楚: d 的值是多少?张开提出了一种迭代方法,在这种方法中,人们可以逐渐增加 T2 d T3。当然,根据数据点的数量, d 不能太大,否则会有很多面元是空的;还有,大的 d 会造成假设数量的爆炸,不对称不会很显著。最后,人们可能会注意到,BET 的目标是显示 XY之间缺乏相关性。如果将 XY 视为空间坐标,则缺乏相关性意味着单位正方形内数据点的一致性。然而,反过来总是正确的吗?这两个概念是否相同很重要,因为 BET 所采用的宁滨和计数程序仅仅显示了一致性。我们将在下一篇文章中研究这些细微的差别以及 BET 解决它们的方法。

参考:

  1. 张开,赌独立(2019)。美国统计协会杂志
  2. 张莞,赵志根,迈克尔·拜奥奇,张开,BET:二进制扩展测试(2020),R 包版本 0.2.0

人工智能产品经理从设计冲刺中获得最大收益的清单

原文:https://towardsdatascience.com/checklist-for-ai-product-managers-to-get-the-most-from-the-design-sprints-d681456b1be9?source=collection_archive---------46-----------------------

不要让顾问愚弄你!

如何用一个伟大的产品满足所有利益相关者

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

插图来自上卷

将“数字化”、“创新”和“大数据”等流行词汇转化为有生命力且有利可图的产品非常困难。通常,失败的不是技术本身,而是所有者、管理者、客户、员工,有时还有社会之间的协调。对于人工智能产品来说,这甚至更难,因为这是一个相对较新的领域,其中有:

  • 要么是通才顾问,他们可以在没有具体数字和下一步措施的情况下讲述光明的未来和经济影响;
  • 或者是深度专家,他们知道这项技术的潜力和局限性,但是他们缺乏系统的商业和社会视野。

在这篇文章中,我想分享我们在神经元实验室与合作伙伴一起精心设计的方法,该方法融合了以用户为中心的算法、经济增长和社会影响,从而协调了产品生命周期中的所有利益相关者。它基本上是基于设计冲刺的想法,然而,主要步骤是从零开始重新构建,以符合行业的具体情况。

为 AI 设计冲刺?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

经典设计冲刺的典型步骤,图片来自https://medium . com/I-want-to-be-a-product-manager-when-I-grow-up/the-design-sprint-92f 61 b 18 FB 72

原始设计冲刺的主要思想是快速验证想法:了解市场需求,头脑风暴解决问题的新方法,原型第一数字解决方案,并与客户一起测试。理想情况下,它甚至可以在 5 天内完成。此类活动的典型成果是:

  • 来自头脑风暴的发现(用户故事、技术应用、优先新颖用例)
  • 一个交互式的原型,它展示了用例并得到了涉众的验证
  • 具有所需资源和风险的发展战略路线图

你可以在这里阅读更多关于这些短跑的历史和最佳实践。这些结果通常会满足所有重要的利益相关者,如传统数字产品的所有者、管理者和客户。在接下来的部分中,我将描述活动和实践,这些活动和实践将创建上述可交付成果,这些可交付成果将协调参与开发和使用以人工智能技术为核心的产品的每个人。

顾客想要什么

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Streamlit 可视化计算机视觉模型性能的实例。交互演示用户故事不是比演示 PowerPoint 演示或模板模型更好吗?插图来自流线型

引用蠢朋克的话,你的客户想要解决他们的问题:

更难、更好、更快、更强

人工智能相关技术确实可以让事情变得更准确、更快速,从我们的生活中删除常规或危险的任务。但是如何正式确定我们到底能为客户做些什么呢?我可以推荐谷歌使用的两个框架:

  • 艾画布出自《预测机器》一书。它将帮助你将客户的想法转化为使用人工智能的用户故事
  • 人+ AI 指导手册。它将有助于定义数据、度量、可解释性的需求,并支持上述用户情景的

你也想展示一些演示,并在几个小时内准备好,而不是几个星期,对吗?

因此,在这里,您将有一个按优先顺序排列的用例列表,并有几个小演示向用户展示它将会是什么样子。

企业想要什么

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在神经元实验室准备的一个过程自动化项目的 PnL 计算样本,包括发布点、盈利起点和盈利转折点。作者图片

当然,以用户为中心的方法是核心,但从商业模式的角度来看,产品还必须是盈利的,并且在市场上具有竞争力。这在设计冲刺阶段通常会被忽略,从我的角度来看,这是一个可怕的疏忽。这部分是非常定制的,但是你想把它缩小到单个预测的单位经济学。使用上述“预测机器”中的人工智能画布,您可以计算使用人工智能功能的经济效果:

  • 由于速度加快/质量提高/风险降低,每次预测你会节省多少钱
  • 您可以预期的精确度是多少,有多大把握?

您需要减去相关成本,包括但不限于:

  • 开发成本(内部/顾问/外包)
  • 维护,人力支持,以及成本与风险

这个过程很棘手,我建议和那些在你的领域内已经交付了 10 多个项目的专家一起工作。因此,您将有一个业务模型草案,并根据经济情况重新确定用例的优先级——也许您最喜欢的用例从现在起 5 年后开始盈利,而您需要第二个更快上市的用例!

经理想要什么

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

克里斯普-DM,TDSP 和敏捷数据科学哲学插图。结构化方法和敏捷方法——哪个更适合你的项目?图片来自数据科学中心微软被烧毁的

好了,现在我们调整了用户和业务的需求,但是仍然会有人负责将这个交付给市场。他们应该如何监控发展?他们应该使用哪些指标?哪种资源燃烧速率可以接受,哪种不可以?如何管理 R & D 相关不确定性?如何以一种灵活敏捷的方式交付产品,让客户满意,同时又不增加额外的资本?

经典的 R&D 和数据科学流程,如 CRISP-DMTDSP 考虑孤立的数据、建模和部署工作,而客户必须等待数月

数据科学团队正在处理数据并训练模型,这是一个高度不可预测的过程

听起来很像借口,对吧?备选的 敏捷数据科学 方法将每个最小的 R & D 阶段视为子产品(参见上图中的金字塔),可以为客户带来即时价值。我们可以开发什么样的用户故事和相关指标?

  • **数据获取:**如果客户尚未收集任何数据,您需要定义数据收集和组织如何立即简化生活和一些流程(业务指标)
  • **数据探索:**原始的统计洞察应该导致原始的预测决策和基于规则的系统,这些系统已经可以自动化一些工作!检查第一部分中基于客户端的指标
  • **建模:**在制作越来越好的模型的同时,检查业务和基于客户的指标,您应该在这个阶段使用部署的模型达到盈利点
  • **可操作的见解:**嗯,这是大家最后想要的:)

同事想要什么

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

插图来自突发事件

我们,管理者,喜欢透明和可预测的过程,但是必须有人在总体计划后面做实际的工作:)做有意义的工作有不同的动机,但是根据这个结构,它们是自主、掌握和目的

  • 自主性可以通过委派更多的责任和决策,从任务跟踪系统转换到结果跟踪系统来实现。分散的组织结构是你想要寻找的东西
  • 精通来自基础知识和最先进的技能和技术。第二个可以通过使用像 PapersWithCodeAI Index 这样的门户网站来规划,在那里你可以找到大多数领域的最新发展
  • 目的是一个有点敏感的问题,但通常,它与给予世界它需要的东西有关。下一部分是关于人工智能背景下的 it,你的商业策略和文化也必须负责任:)

这是一种在设计冲刺阶段考虑同事的非传统方法,然而,对于现代以人为中心的组织来说,这是必须的。

世界想要什么

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自https://www.uxai.design/design-strategy

人工智能是一种有缺点的技术——与人类智能一样,它可能会有偏见、模糊,并且容易受到外部攻击。我们可以做些什么来使人工智能的采用变得正确和有目的?在设计冲刺阶段,我们需要让利益相关者意识到这些问题,定义产品中的敏感时刻,并提供潜在的解决方案:

  • **公平公正的人工智能:**我推荐使用 PAIR 的“假设工具”和一个更技术性的 Themis-ML 库来进行公平检验
  • 可解释 AI: 对于解释 ML 预测,已经有多种策略和解决方案,如 TCAVSHAP
  • 受保护的 AI: 你肯定需要在基础设施层面上保护你的训练数据,并且,潜在地用联合学习 ( TFPyTorch )。此外,机器学习模型可能会受到对抗性攻击,迫使模型做出错误的预测。检查这些 作为潜在的解决方案。

外卖食品

在本文中,我们重新评估了基于人工智能的产品的经典设计 sprint 结构和可交付成果。作为主要思想,我们已经回顾了在开发和利用项目的过程中,每个项目涉众希望对项目满意的方面:

  • **最终客户:**通过互动演示带来切实积极变化的解决方案
  • **业务所有者:**具有单一预测单位经济性、燃烧率和相关风险的业务模型
  • **管理者和员工:**前者有清晰的流程和衡量标准,后者有工作的实现
  • **社会:**一个伟大的人工智能技术应用,它是公平的、透明的,并被保护免受误用

我没有提到在设计冲刺阶段有时会做的市场营销和竞争对手分析,因为我希望事先做广泛的竞争对手和市场分析。设计冲刺对于头脑风暴和测试技术产品的不同想法来说是很棒的,但是定义一个公司的总体愿景和战略是一个有点不同的话题。如果你有任何问题,或者你想分享你做这种设计冲刺的经验,请告诉我。祝你的人工智能产品好运!

附言
如果你觉得这个内容有用,有观点,可以在 Bitclout 上支持我。关注我还可以在脸书上看到太短的人工智能文章,在 Instagram 上看到个人资料,在 Linkedin 上看到!如果你想在设计冲刺或其他 ML 项目上合作,请联系我。

chef boost——基于树的模型的替代 Python 库

原文:https://towardsdatascience.com/chefboost-an-alternative-python-library-for-tree-based-models-f46af028a348?source=collection_archive---------14-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由张克帆·马塞多Unsplash 上拍摄

与 scikit-learn 的主要区别概述

我在我的 Twitter feed 中随机遇到了chefboost,鉴于我以前从未听说过它,我决定快速浏览一下并测试一下。在本文中,我将简要介绍这个库,提到它与首选库scikit-learn的主要区别,并展示一个实践中的chefboost的快速示例。

chefboost 简介

我认为最好的描述是在库的 GitHub repo 中提供的:“chefboost 是 Python 的一个轻量级决策树框架,支持分类特性”。

scikit-learn相比,chefboost有三个突出的特点:

  • 支持分类特征,这意味着我们不需要使用例如一键编码对它们进行预处理。
  • 使用chefboost训练的决策树被存储为专用 Python 文件中的 if-else 语句。通过这种方式,我们可以很容易地看到树做出了什么决定来达到一个给定的预测。
  • 我们可以选择多种算法中的一种来训练决策树。

遵循最后一点,chefboost为分类树(ID3、C4.5 和 CART)提供了三种算法,为回归树提供了一种算法。老实说,我并不完全确定哪一个是当前在scikit-learn中实现的,所以我查看了文档(它也提供了算法的简明摘要)。原来scikit-learn用的是优化版的 CART 算法,没有分类特征的支持。

在我们已经介绍的基础上,chefboost还提供了一些更高级的基于树的方法,比如随机森林、梯度增强和 Adaboost。

Python 中的一个例子

和往常一样,我们从导入库开始。

对于这个例子,我们将使用成人数据集。你可能已经遇到过,但简单来说,目标是预测一个成年人的年收入是高于还是低于 5 万美元。为此,我们从 1994 年人口普查数据库中选择了一些数字和分类特征。你可以在这里找到原始数据集

chefboost中的一个怪癖是对目标变量的处理——它必须存储在与特征相同的数据帧中,它必须被称为Decision,并且必须是数据帧的最后一列。很奇怪,但这可能是有原因的。

我们还将把数据分成训练集和测试集。然而,数据的非标准结构要求scikit-learntrain_test_split函数有一点不同的用法。即使数据集不是高度不平衡的,我们也使用了目标列的分层分割。

通常,我们也会将分类特征编码为布尔虚拟对象,但是chefboost可以直接处理它们。这就是我们开始训练模型的原因。

为了训练模型,我们使用了fit函数,并传递 dataframe(包含正确格式的数据)和config字典作为参数。这一次,我们只表明我们想要使用 CART 算法。

假设我们的数据包含分类和数字特征,我们也可以使用 C4.5 算法,但不能使用 ID3,因为它不能处理数字特征。

培训完成后,我们得到了以下总结。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

很高兴看到这么多现成的指标,但最突出的是培训时间。这一棵树花了 10 多分钟来训练!可以通过在config字典中设置enableParallelismTrue来并行化训练。这样,树的分支被平行地训练。然而,这样做并没有带来实际的训练速度的提高,至少在我的机器上没有。

另外,与scikit-learn的另一个区别是chefboost主要使用函数而不是类。

训练模型导致创建一个新文件-> rules.py。如简介中所述,它以嵌套的 if-elif-else 语句的形式包含了决策树的整个结构。

下面你可以看到脚本的一部分,整个脚本有 20.5 千行长。一方面,使用这样的嵌套结构,决策的逻辑非常清晰。但是另一方面,如果不限制树的最大深度(我认为这对于chefboost中的决策树是不可能的),遵循决策路径根本不容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

训练好一个模型后,我们可以将它存储在 pickle 文件中,或者使用restoreTree函数直接从rules.py文件中加载它。

为了获得预测,我们使用了predict函数。

您可能已经注意到,我们只向函数传递了一行数据。不幸的是,这是chefboost做预测的唯一方法。我们可以自然地循环整个数据帧,但这不如scikit-learn的 predict 方法方便。

我们可以做的是使用evaluate函数运行评估。

我们得到了一个类似于我们从训练中得到的输出。但是我们不会花太多时间来分析树的性能,因为这不是本文的目的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

该库提供的另一个特性是特性重要性分析。我就不赘述它是如何计算的了(你可以在这里找到它们)。为了获得重要性,我们需要使用feature_importance函数并提供rules.py文件的路径作为参数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

结果表明,年龄是预测一个人年收入是否超过 5 万美元的最重要的特征。

作为最后一件事,我想比较一下chefboostscikit-learn的速度。自然,后一个库中的决策树需要不同格式的数据,所以我们相应地准备了数据。

我们使用与之前相同的分割设置,以确保公平的比较。然后,我们使用%time魔法来看看训练模型需要多长时间。

CPU times: user 1e+03 ns, sys: 0 ns, total: 1e+03 ns 
Wall time: 3.1 µs

这是一个相当大的差异…我不确定是什么原因,我打赌会创建树的 if-else 表示。

外卖食品

  • chefboost是用于训练基于树的模型的备选库,
  • 突出的主要特性是对分类特性的支持和以嵌套 if-else 语句形式的模型输出,
  • scikit-learn相比,训练要慢得多,并且要调整的超参数的选择非常有限。

你可以在我的 GitHub 上找到本文使用的代码。此外,欢迎任何建设性的反馈。你可以在推特或评论中联系我。

如果您喜欢这篇文章,您可能还会对以下内容感兴趣:

三行代码的化学预测

原文:https://towardsdatascience.com/chemical-predictions-with-3-lines-of-code-c4c6a4ce7378?source=collection_archive---------17-----------------------

使用 Chemprop & graph 神经网络的最新结果

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由宏向量设计—www.freepik.com

在这篇文章中,我们使用机器学习/人工智能来预测小分子的属性(这项任务被称为 QSAR )。这是通过使用来自开源库 Chemprop 的最先进的图形神经网络来完成的。

典型的药物以小分子的形式出现,可以调节我们体内的一些生物过程。不幸的是,在这个过程中可能会出现难以想象的问题;这些化合物可能是有毒的,从我们体内清除非常缓慢,与非预期的其他分子相互作用,等等。因此,我们希望在这些小分子被注射到人体之前,非常仔细地对它们进行检测。

在药物发现的早期阶段,通常在实验室规模的实验中测试小分子的许多不同变体的各种性质,例如溶解度、不同形式的毒性、结合亲和力等。这个过程可能非常费力,所以使用 ML 来根据已经完成的实验预测这些特性不是很好吗?这项任务在化学信息学中是众所周知的,近年来由于深度学习的进步而受到越来越多的关注。

有大量的库可以进行这种分析。在本文中,我们将使用名为 ChemProp 的开源库,该库由麻省理工学院的一个研究小组不断更新,它在广泛的基准数据集上取得了出色的结果,同时使用起来极其简单。

输入数据是什么?

预测化学性质传统上被称为定量结构-活性关系(QSAR)模型。这些模型的输入是分子的字符串表示,也称为“微笑”字符串。例如,这可能看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不同的微笑字符串可以代表同一个分子,但是每个微笑字符串只对应一个分子。作者图片

从本质上讲,我们的数据集由用微笑字符串表示的分子和我们想要预测的每个分子的一组属性组成。这可以看起来如下:属性是一个分子是否被 FDA 批准和是否通过毒性测试的二元变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

每个样本都是一个分子,由它的微笑字符串和一个或多个属性表示——图片由作者提供。

这个 Chemprop 模型是什么?

Chemprop 模型于 2019 年在[1]发表,但此后一直在不断更新,并在一系列后来的出版物中显示出其价值,最引人注目的是在[2]中,他们用它来发现新的潜在抗生素化合物。

底层的 Chemprop 是在 Pytorch 中实现的消息传递神经网络,这意味着模型的输入是分子的图形表示。然而,除了直接在图表上工作之外,Chemprop 还自动使用更经典的衍生化学特征,这意味着它通常在小型和大型数据集上都表现良好(与其他模型相比)。要了解更多信息,我推荐阅读论文[1]。

Chemprop 可以从 PyPI: pip install chemprop.安装

让我们开始吧:3 行代码

假设我们有一个如上所示的数据集,带有一些微笑字符串和两个我们希望预测的属性;FDA 是否批准了该化合物,以及它是否通过了临床试验期间的毒理学测试。

大量类似的数据集可以在网上找到,例如,查看这些基准。在 Chemprop 的典型使用中,我们将经历以下步骤:1)优化模型的超参数,2)训练模型,以及 3)对一组新的分子进行预测。

步骤 1:调整超参数。

Chemprop 有一些可调的超参数,可以调整这些参数以在给定数据集上获得最佳结果。安装 chemprop 后,我们可以运行 50 次 TPE 超参数调整迭代:

第二步:训练模型

有了在data/config.json中识别和保存的理想超参数,我们就可以用这些参数训练模型:

这里有几个值得注意的有趣参数:

  • num_folds:我们创建 5 个折叠(不同的训练/测试)分割,并在每个折叠上训练/评估模型。
  • ensemble_size:我们用不同的初始化创建了一个 3 个模型的集合,这将提高平均性能。请注意,这 3 个模型每个都有 5 个折叠,所以我们总共训练了 15 次模型!
  • split_type在创建我们的内部训练/测试分裂时,我们确保将相似的分子放入相同的折叠中,以获得更真实的泛化度量。

在我的训练运行中,我收到了下面的输出:Overall test AUC: 0.871 +/- 0.036——即来自训练交叉验证的非常有希望的结果。

步骤 3:根据新数据评估模型。

既然我们已经训练了模型,下一步就是在测试数据集上评估它的性能。从交叉验证中我们已经知道,性能应该是大约 0.84 的 AUC,但是让我们看看:

这将生成一个文件predictions.csv,其中包含我们测试数据集中化合物的预测。请注意,这些预测是上一步中训练的总共 15 个模型的平均值。将此与真实值进行对比,我们得到以下结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在测试数据集上评估已训练的 chemprop 模型。由作者策划。

非常适合最小的努力!👏

更进一步:解释

有时仅仅得到点预测是不够的;我们可能想知道为什么模型返回一个给定的预测。例如,如果预测该分子是有毒的,那么知道该分子的哪一部分引起所述毒性将是有价值的。通过从这里获取我的 Chemprop 分支,我们可以使用 BayesGrad 方法的变体创建这样的解释:

对于由interpret_local.py脚本评估的每种化合物,算法将返回一个解释图,例如,在上面训练的溶解度模型的情况下,它将显示亲水原子(氧)如何增加分子的溶解度:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

解释溶解度预测的热图。图片由作者提供。

简而言之,这里分子中给定原子或键的“重要性分数”被计算为预测目标相对于来自该原子或键的特征的梯度;即,归因于给定键/原子的梯度的绝对和越大,假定该键/原子对预测越重要。众所周知,以这种方式直接生成的灵敏度图噪声很大。因此,BayesGrad 建议使用 dropout 对网络参数 W 的后验分布 p(W|D) 进行采样,允许我们计算所有这些采样网络的梯度平均值,从而平滑结果。我们没有依赖 Chemprop 中包含的 dropout,而是通过简单地使用交叉验证折叠和集合模型中的权重 Wp(W|D) 进行采样,即,对于一组 20 个模型,我们计算每个原子和键的梯度的平均和。

结束语

能够预测化学性质是极其强大的;想象你有一组 100 个潜在的分子候选者。合成它们中的每一个都是一项艰巨的任务。如果我们可以根据它们满足各种特性的可能性来对它们进行排序,我们就可以首先综合出最有希望的候选者。此外,通过解释模型预测,我们可以了解更多关于分子工作或不工作的原因,因此甚至可以根据这些信息开发出更有前途的候选分子。

使用 3 个命令来训练和预测这些模型可能会给人一种这是一个已解决问题的印象。事实并非如此。我推荐阅读 Andreas Bender 的这篇文章,思考从这些模型中得出结论是多么的危险和困难。

[1] Kevin Yang J. Chem .Inf。模型。 2019,59,8,3370–3388

[2]乔纳森·m·斯托克斯,抗生素发现的深度学习方法(2020),细胞,180,4,P688–702。E13

胸部 x 光和肺炎:使用 TensorFlow 进行深度学习

原文:https://towardsdatascience.com/chest-x-ray-pneumonia-deep-learning-with-tensorflow-a58a9e6ade70?source=collection_archive---------24-----------------------

处理班级失衡并有效使用预先训练的模型

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

疾控中心Unsplash 拍的胸部 x 光照片

在过去的几年里,我们已经看到以各种形式使用深度学习进行医学诊断的快速增长,特别是在医学图像的分析中。这里我们将建立一个管道,对肺炎患者和非肺炎患者的胸部 x 光图像进行分类。在知识共享许可下,完整的数据集可以在 Kaggle 获得。在我们建立管道之前,让我们看看你能从这篇文章中学到什么

  • 使用深度神经网络(DNN)进行二元分类。
  • 使用 TensorFlow 数据集创建更快的数据分析管道。
  • 更好的数据预处理技术(例如:标准化)。
  • tensor flow 模型中的 lambda 层的扩充、重新缩放等。
  • 阶层失衡与建筑自定义加权交叉熵损失。

不要耽搁,让我们开始吧!【这里用到的所有代码都可以在 Kaggle 笔记本中找到】。

熟悉数据结构:

因为我们将直接访问 Kaggle 输入目录中的数据,所以让我们来看看标签“正常”和“肺炎”在 Train、Validation 和 Test 文件夹中的分布。下面是我用来检查每个文件夹中文件数量的代码块

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1: X 标签代表文件夹名称。训练、测试、验证,N 代表正常,P 代表肺炎。来源:作者笔记

首先,我们看到训练图像*是类别不平衡的,标记为“肺炎”的图像比“正常”的图像多得多。*此外,验证文件夹包含的示例非常少(准确地说是 8 个正常图像和 8 个肺炎图像)。

tot_normal_train = len(train_im_n) + len(valid_im_n) 
tot_pneumonia_train = len(train_im_p) + len(valid_im_p)
print ('total normal xray images: ', tot_normal_train)
print ('total pneumonia xray images: ', tot_pneumonia_train)>>> total normal xray images:  1349
total pneumonia xray images:  3883

我们也可以想象一些正常和肺炎的图像,如下所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

“正常”X 射线图像:原始数据来源:在 Kaggle 中可用。

类似地,我们也可以查看“肺炎”图像—

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

肺炎的 x 光图像:原始数据来源:可在 Kaggle 获得。

在阅读了一些在线资源后,比如这个,我注意到发现肺炎的通常方法是搜索胸部 x 光片中的阴影。从上面的图片来看,与普通 x 射线相比,这些图像通常看起来不透明。但同样重要的是要记住,胸部 x 光检查可能不会一直告诉我们全部情况,有时视觉结果可能会产生误导。

预处理;标准化:

我们将调整图像数据,使数据的新平均值为零,数据的标准偏差为 1。稍后,我们将使用 TensorFlow 数据集,并定义一个函数,在该函数中,图像中的每个像素值都将替换为一个新值,该新值通过减去平均值并除以标准偏差(*x**μ)/σ计算得出。*让我们看看标准化如何帮助我们在一些随机示例中分配像素值——

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于一些随机图像,标准化(A)之前(B)之后(A)的像素强度分布。来源:作者笔记。

为了包括这种类型的标准化,我们创建了一个函数,该函数将在模型构建中用作 lambda 层。因此,GPU 的能力也将用于这个过程—

#### define a function that will be added as lambda layer later
def standardize_layer(tensor):
    tensor_mean = tf.math.reduce_mean(tensor)
    tensor_std = tf.math.reduce_std(tensor)
    new_tensor = (tensor-tensor_mean)/tensor_std
    return new_tensor

使用 TensorFlow 数据集构建输入管道:

在之前的一篇帖子中,我详细描述了如何使用 TensorFlow 数据集 API 构建包括增强在内的输入管道来加速 DNN 训练。我将遵循类似的步骤。由于图像数据存在于训练、测试和验证文件夹中,我们可以从[image_dataset_from_directory](https://keras.io/api/preprocessing/image/)功能开始——

正如我们之前检查的,验证目录中只有 16 个文件,只使用 16 个图像进行验证并不是一个好主意。因此,我们需要添加训练和验证数据集,然后按照合理的百分比对它们进行拆分。首先,让我们检查“训练”和“有效”数据集中的元素数量。

num_elements = tf.data.experimental.cardinality(train_dir).numpy()
print (num_elements)
num_elements_val = tf.data.experimental.cardinality(val_dir).numpy()
print (num_elements_val)>>> 82
1

我们看到有 82 个训练批次和 1 个验证批次。为了增加验证批次,首先,让我们连接“训练”和“验证”数据集。然后,我们将总数据集的 20%分配给验证,并使用下面的代码块使用dataset.takedataset.skip来创建新的数据集—

new_train_ds = train_dir.concatenate(val_dir)

print (new_train_ds, train_dir)

train_size = int(0.8 * 83) *# 83 is the elements in dataset (train + valid)*
val_size = int(0.2 * 83)

train_ds = new_train_ds.take(train_size)
val_ds = new_train_ds.skip(train_size).take(val_size)

*#### check the dataset size back again* 
num_elements_train = tf.data.experimental.cardinality(train_ds).numpy()
print (num_elements_train)
num_elements_val_ds = tf.data.experimental.cardinality(val_ds).numpy()
print (num_elements_val_ds)>>> <ConcatenateDataset shapes: ((None, 300, 300, 1), (None, 1)), types: (tf.float32, tf.float32)> <BatchDataset shapes: ((None, 300, 300, 1), (None, 1)), types: (tf.float32, tf.float32)>
66
16

我已经描述了 【预取】技术 以及它比 ImageDataGenerator 快多少。让我们加上这个—

autotune = tf.data.AUTOTUNE ### most important function for speed up training

train_data_batches = train_ds.cache().prefetch(buffer_size=autotune)
valid_data_batches = val_ds.cache().prefetch(buffer_size=autotune)
test_data_batches = test_dir.cache().prefetch(buffer_size=autotune)

我还将添加一个重缩放层和一些增强层,这些都将作为 lambda 层包含在模型中。让我们把它们定义如下—

from tensorflow.keras import layers

rescale_layer = tf.keras.Sequential([layers.experimental.preprocessing.Rescaling(1./255)])

data_augmentation = tf.keras.Sequential([
  layers.experimental.preprocessing.RandomFlip(),
  layers.experimental.preprocessing.RandomRotation(10), 
  layers.experimental.preprocessing.RandomZoom(0.1) ])

加权二元交叉熵损失;

使用加权 BCE 损失背后的想法是,由于我们有比“正常”更多的“肺炎”x 射线图像,该模型对它们的错误分类进行了加权。因此,我们改变了这种偏见,并试图迫使模型对正常和肺炎图像进行同等加权。我们根据每个类别的图像数量除以图像总数来计算频率项。这些权重随后用于构建定制加权 BCE 损失函数。下面的代码块是用于给定问题的一个例子

建立一个 DNN 模型,包括扩展:

在定义了适当的定制损失函数之后,我们剩下的是构建一个包括作为 lambda 层的重新缩放和增强的模型。对于给定的工作,我使用了 InceptionResNetV2 预训练模型,你可以在这里检查 Keras 模块。在 Kaggle 比赛中,我们不允许使用互联网,所以我需要下载预先训练的重量,这解释了 InceptionResNetV2 函数中的weights参数。在将图像批次馈送到模型之前,重新缩放、标准化&增强都作为 lambda 层添加。让我们看看下面的代码块—

编译后,包括一些“回调”,我们准备好训练模型。为了评估模型对测试数据的性能,我们可以绘制混淆矩阵和 ROC 曲线。

y_pred = model.predict(test_data_batches)
true_categories = tf.concat([y for x, y in test_data_batches], axis=0)

让我们设置一个 0.75 的阈值来分配标签“1”和任何低于标签“0”的值。

y_pred_th = (y_pred > 0.75).astype(np.float32)from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_pred_th, true_categories)class_names = train_dir.class_namesplt.figure(figsize=(8,8))
plt.title('CM for threshold 0.75')
sns_hmp = sns.heatmap(cm, annot=True, xticklabels = [class_names[i] for i in range(len(class_names))], 
                      yticklabels = [class_names[i] for i in range(len(class_names))], fmt="d")
fig = sns_hmp.get_figure()

上面的代码块导致了下面的混乱矩阵—

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二元分类的混淆矩阵。(来源:作者笔记)

类似地,我们也可以绘制 ROC 曲线,结果如下所示—

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ROC 曲线为‘正常’和‘肺炎’图像分类。(来源:作者笔记)

最终注释:

上面使用的所有代码都可以在我的 GitHub 上找到,你也可以查看 Kaggle 笔记本。所使用的数据集在许可知识共享下的 Kaggle 中可用,因此我们可以自由使用和调整。最后,总结一下,我们经历了一个包括类不平衡数据集的数据分析管道,并学会了有效地使用 TensorFlow 数据集。

保持坚强,干杯!

卡方统计和卡方分布

原文:https://towardsdatascience.com/chi-square-statistic-chi-squared-distribution-2499084b5da8?source=collection_archive---------28-----------------------

在本文中,我将解释卡方统计量及其在假设检验中的作用,在假设检验中,数据集具有理论值,需要用实际数据集进行验证

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

约翰·莫塞斯·鲍恩在 Unsplash 上拍摄的照片

卡方统计是一个描述理论假设数据和实际数据之间关系的数字。它通常被认为是用实际数据集验证理论数据集并以数字形式给出结果的数字或统计值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡方统计公式

卡方统计的公式如上所示。这里,观测值是具有实际值的实际观测数据集,预期值是具有理论值的预期数据集。

关于卡方统计值得注意的一点是,该值始终为正值,因为当我们拥有数据集并评估统计时,即使数据集中有正值也可能有负值,这些值也是平方的。这将总是产生一个正值。
同样,卡方统计具有近似的卡方分布。

卡方分布是由 P 值( P )和自由度( DF )分布和分隔的一组值。
卡方分布可用于检查极端值或大于该值的结果的概率。

在这种情况下,我们通常会考虑一个显著性水平,例如我们在这里考虑的 P =10% (0.1)。因此,当我们获得卡方统计值时,我们通过特定的自由度(DF)检查分布中的值。如果分布中卡方统计值的概率( P )为 10%(0.1)及以上,我们无法拒绝零假设,否则我们拒绝它。

下表中的 Pp 值,它基本上是我们得到统计值时在分布表中检查的概率。

DF自由度,它取决于数据集中值的数量。如果在预期观察列的数据集中有 N=4 个值,这 4 个值将应用于卡方统计公式。但是,如果我们注意到,当数据集中有 N=4 个值,并且我们对这 N 个值应用特定的公式时,我们基本上只需要前 3 个值来预测第 4 个值。所以这里的 DF 会是 3。 DF =N-1=3

让我们考虑一个例子,其中我们想知道学生在课堂上的出席情况。假设我们一个班有 5 个学生。因此,N = 5。因此,我们要求班主任告诉我们该班学生的大致出勤率。老师给我们提供了这样的数据:

Expected(%) : [50, 70, 75, 82, 86]

但是,接下来我们会用存储的学生出勤的实际数据来验证老师给出的数据。我们得到这样的结果:

Observed(%) : [55, 65, 73, 82, 80]

现在,我们可以看到两个数据集之间存在差异。所以,如果我们要拒绝或者不能拒绝这个假设(预期(%)),我们就要检验这个假设。

为此,我们将考虑两种可能性:

1st Probability : The teacher's distribution is correct
2nd Probability : The teacher's distribution is incorrect

我们将以 10%(0.1)的显著性进行假设检验。
如果根据预期观察计算的卡方统计值在特定自由度( DF )内具有 10%或以上的 P ,则我们不会拒绝老师的假设,否则我们将拒绝该假设。

现在我们将计算卡方统计量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡方统计公式

现在,我们将这个公式应用于两个数据集:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上所述,我们得到卡方统计值 1.32。
我们有以下数据:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,我们将检查自由度 DF = 4 内卡方分布表中统计值 1.32 的 P 值( P )。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡方分布(来源)

这里,在 DF = 4 的范围内,我们看到统计值 5.989 的概率或 P 值§为 0.2,即 20%。所以,任何小于 5.989 的值都有超过 20%的概率。我们的统计值是 1.32。所以这个值也会有超过 20%的概率,相当高于我们的显著性水平(10%)。
因此,我们将无法拒绝老师的假设(零假设)。

结论

在本文中,我借助一个例子解释了卡方统计量的概念。我解释了卡方统计和卡方分布如何通过假设检验帮助我们评估理论数据集值及其实际值。我很高兴听到你对这篇文章的评论。请随时联系我,在 Linkedin 或评论中给我发消息。

独立性卡方检验

原文:https://towardsdatascience.com/chi-square-test-for-independence-cf2f5057cc35?source=collection_archive---------22-----------------------

使用 pingouin 库实现卡方分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自 unsplash

简介

数据科学家有时需要检查一个分类变量是否与同一人群中的另一个分类变量相关。如果数据是连续的,人们可以简单地计算变量之间的相关性,并根据相关系数确定这些变量是否高度相关。卡方检验是对分类变量进行分析的工具。例如,我们可能想检查性别是否在心脏病中起作用,或者教育是否与婚姻状况有关。在这种情况下,卡方检验是正确的分析工具。

背景

为了进行卡方检验,我想简单回顾一下相关术语的背景。python 中的分析和输出解释需要理解这些术语。

P 值、置信区间和显著性水平

p 值是两个值之间的差异偶然存在的概率。如果 p =值很小,观察到的数据偶然出现的概率很小,因此我们得出结论,观察到的数据和预期的数据之间存在统计上的显著差异。

置信区间是测试结果百分比的范围。如果置信区间设定为 95%,这并不意味着我们对测试结果有 95%的把握。可以认为,如果我们重复测试 100 次,测试结果将在 100 次中有 95 次落入该范围内。通常,CI 在大多数情况下设置为 95%。

另一个名为显著性水平(alpha)的术语是当假设事实上为真时拒绝零假设的概率。大多数情况下通常设定为 5%。

卡方检验

卡方检验有几种类型。一种类型的卡方检验被称为拟合优度检验,它检查一个分类变量是否很好地符合总体数据。另一种类型的检验检查一个分类变量相对于另一个分类变量的独立性,这被称为独立性卡方检验。在本文中,我将通过检验卡方统计量和 p 值来检验一个分类变量是否与另一个分类变量相关。

用 python 实现

让我们导入心脏病的数据。它显示了来自几个人的心脏相关变量的数据,如收缩压和舒张压、糖尿病、身体质量指数、心率葡萄糖水平、吸烟习惯等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

心脏病数据集

Python 有来自scipy.statschi2_contingency模块,我们需要在那里提供列联表。列联表是两个分类变量之间关系的总结。如果我们只提供数据,有一个名为 pingouin 的模块可以提供列联表。

根据我们的数据,假设我们想要检查冠心病(CHD)是否与性别分布有关。使用 pingouin,代码只有一行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 pingouin 获得卡方统计数据

chi2_independence 返回三个表。期望表是列联表,显示了初始数据中两个感兴趣的分类变量之间的关系。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了分析预期数据,我们首先需要获得初始数据中不同性别的比率。我们的数据显示,第 0 组和第 1 组之间的比例为 2420:1820 = 1.329,为了成为冠心病的不良预测因素,冠心病各组之间的性别比例应该相似。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们取第 0 组和第 1 组之间的比率时,我们在期望表中得到不同性别之间相同的 1.329:1 比率。例如,十年期第 0 组的性别比率为 2052.42/1543.56,相当于 1.329(近似值),另一组也是如此。

零假设表明我们期望观察到的表中有相同的比率。我们需要通过卡方统计来验证零假设,卡方统计根据自由度和显著性水平与卡方表中的特定卡方值进行比较。上面的观察值表显示了数据中实际观察到的性别类别和冠心病之间的关系。如果我们从观察到的表中计算性别比例,我们得到 2118.5/1477.5 = 1.433 和 342.5/301.5 = 1.136,这与预期的比例不同。接下来,我们需要从 stats 表中找出测试统计量和 p 值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ch 平方统计量和 p 值

皮尔逊残差的卡方统计量是最常见的统计量。皮尔逊残差被定义为通过期望值的平方根归一化的观察值和期望值之间的差。

皮尔逊残差=(观察值-期望值)/(sqrt(期望值))

对于这个单一自由度和 5%的显著性水平,卡方统计的临界值是 3.841,测试统计是在 32.618 获得的,这要高得多。该统计是对观察数据偏离预期值的程度的度量。我们还观察到一个非常小的 p 值,它基本上提供了反对零假设的证据。p 值越小,观察到的差异只是偶然出现的可能性就越低。因此,在这种情况下,我们有强有力的证据来拒绝零假设,并声明观察到的差异是真实的。本质上,我们可以得出结论,性别是冠心病的一个很好的预测因素。

A/B 测试的扩展

卡方检验可视为简单 A/B 检验的扩展版本,在两组之间进行,以检查两组之间是否存在任何观察到的差异。一组称为对照组,另一组称为治疗组。有时我们感兴趣的是一次检查多个治疗,卡方检验提供了各组与对照组偏离程度的信息。比如查看翻新网页多个版本的点击量,我们实质上可以做两个以上的组,提供给不同的用户组。应急表应反映新版本网页以及初始页面的点击次数或最终购买次数。

结论

在本文中,我描述了卡方测试的背景,并展示了它在 python 中的实现。卡方检验是检查分类变量独立性的简单统计检验。当需要多重处理来检查时,我们需要超越简单的 A/B 检验,进行卡方检验。

Github 页面

参考:

  1. pingouin 文档
  2. 心脏病数据

卡方检验,用 Python

原文:https://towardsdatascience.com/chi-square-test-with-python-d8ba98117626?source=collection_archive---------3-----------------------

执行卡方检验的完全初学者指南(带代码!)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡伦·艾姆斯利在 Unsplash 上的照片

在本文中,我将介绍卡方检验(χ2)的基本原理,卡方检验是一种统计方法,用于推断一个变量的分布或判断总体中两个变量之间是否存在关系。推论依赖于χ2 分布曲线,取决于自由度的数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:不同自由度的卡方分布[1]

χ2 分布曲线是右偏的,随着自由度的增加,χ2 曲线将更接近正态分布。

答:独立性的χ2 检验

它用于确定总体中两个变量之间是否存在关系。在分析两个分类变量的调查结果时很有用。

  • H₀:这两个分类变量有没有关系
    H₁:这两个分类变量之间有一种关系
  • χ2 独立性检验统计量的自由度:
    d.f. = (# rows -1) *(#columns-1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表 1: rxc 两个分类变量的列联表

  • 如果 H₀为真,上表中值的每个单元格将包含理论或预期频率 Eᵢⱼ ,而不是每个单元格的观测值 Oᵢⱼ

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:预期频率的推导

  • 检验统计:比较 Oᵢⱼ & Eᵢⱼ 之间的差异得出χ2 统计,自由度为[(r-1) x (c-1)],其中

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

超过 rxc 列联表中的所有单元格

下表是一项出口民调,显示了对两个分类变量的联合回应:18-29 岁、30-44 岁、45-64 岁和 65 岁以上人群,以及他们的政治倾向,即“保守”、“社会主义”和“其他”。在 5%的显著性水平上,年龄组和他们的政治倾向之间有关系吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表 2:投票后调查[2]

按照假设检验的五步过程:
H₀:的年龄组与他们的政治倾向是否独立,即没有关系
H₁:的年龄组与他们的政治倾向是否有依赖关系,即∃的 a 关系
α = 0.05
遵循χ2 独立性检验统计:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论:我们有足够的证据表明,在 5%的显著性水平上,年龄组和他们的政治倾向之间存在关联。

B: χ2 拟合优度检验

它用于推断变量的分布。

  • H₀:变量有指定的分布,正态
    H₁:变量没有指定的分布,不正态
  • χ2 拟合优度检验统计的自由度数量:
    d.f. = (# categories -1)
  • 它将样品的观察频率 O预期频率 E 进行比较。
    E =事件的概率*总样本量

下表显示了 2013 年德国联邦大选超过 4400 万人的投票结果。41.5%的德国人投票给基督教民主联盟(CDU)25.7%投给社会民主党其余 32.8%投给其他

假设研究者采取随机抽样的方法,选取了 123 名傅柏林的学生进行调查。其中 57 人投票给 CDU,26 人投票给社民党,40 人投票给其他人。这些数字对应于观察到的频率

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

表 3: 2013 年德国联邦大选[3]

按照假设检验的五步流程:
H₀:变量具有规定的分布,即观测频率和期望频率大致相等
H₁:变量不具有规定的分布,不正态
α = 0.05
遵循χ2 拟合优度检验统计量:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论:我们没有足够的证据证明观察到的和预期的频率在 5%的显著性水平上不相等。

推荐阅读

https://levelup.gitconnected.com/how-to-perform-one-sample-hypothesis-tests-with-python-308eae8789fc https://levelup.gitconnected.com/two-sample-hypothesis-tests-with-python-43e1b8c52306

参考

[1]《卡方检验 SOGA 地球科学系》【在线】。可用:https://www . geo . fu-Berlin . de/en/v/soga/Basics-of-statistics/Hypothesis-Tests/Chi-Square-Tests/index . html

[2]《卡方独立性检验 SOGA 地球科学系》【在线】。可用:https://www . geo . fu-Berlin . de/en/v/soga/Basics-of-statistics/Hypothesis-Tests/Chi-Square-Tests/Chi-Square-Independence-Test/index . html

[3]《卡方拟合优度检验 SOGA 地球科学系》【在线】。可用:https://www . geo . fu-Berlin . de/en/v/soga/Basics-of-statistics/Hypothesis-Tests/Chi-Square-Tests/Chi-Square-good-of-Fit-Test/index . html

卡方检验,用于比较两个机器学习模型,并确定它们是否是随机的

原文:https://towardsdatascience.com/chi-squared-tests-to-compare-two-machine-learning-models-and-determine-whether-they-are-random-2a405fc55181?source=collection_archive---------5-----------------------

在评估机器学习模型时,除了预测准确性/测试分数之外,您还应该考虑其他因素

一个具有挑战性的分类问题将你吸引到了你的屏幕上。你已经连续几个小时敲击键盘,分析数据,调试代码,执行算法。你的努力发展成两个机器学习模型。但是在你把显示器摔下来喝一口凉水之前,还有最后一个麻烦。你必须评估模型。通常,评估不仅仅是计算测试准确度。您可能想探究多个模型的性能是否不同。如果有变化,它们在统计上是显著的,还是由于随机性?所以让我们一起寻找这些答案。如果您熟悉概率分布(正态分布、二项式分布和卡方分布)、假设检验、假阳性和假阴性,我们就可以开始了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡方分布(图片由作者提供)

1.单一模型的卡方检验

1.1 我的模型是随机猜测的吗?😦

假设你的分类问题是预测一个人是否患有 covid。你构建的第一个模型,M1,给出了以下结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

M1 观察表(图片由作者提供)

从概率上讲,一个数据实例有 65%的可能性是正面的,否则有 35%的可能性是负面的。一个重要的问题是,这个模型比随机猜测更有效吗?随机猜测意味着预测类和实际类是相互独立的。从本质上讲,这样的模型不会从数据中学习到任何有价值的东西,而仅仅是做出猜测。根据独立概率定律,可以得出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

在卡方检验中,我们将观察值与期望值进行对比。M1 将 69 例标为阳性。现在,如果这是一个随机的猜测,我们可以预计 35%的情况是假阳性。为什么?因为有 35%的可能性测试数据实例是负面的。这个结果也可以通过稍微修改一下问题从上面的等式推导出来。您认为 100 个实例中有多少个是误报?在这种情况下,我们找到 P(预测=+实际= —)。p(预测=+)= 69/100 = 0.69。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

如果 M1 是一个随机的猜测者,总数据实例的 25.15%可能被分类为假阳性。因此,假阳性的数量= 100 的 24.15% = 24.15。同样,我们可以找到一个随机猜测者的所有预期预测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机猜测者期望表(RM 表)(图片由作者提供)

在上面两张表上运行卡方独立性测试将验证 M1 是否是一个随机猜测者。它通过计算卡方统计来实现。好吧,那是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卡方统计方程

在下一节中,我将证明上面的等式是卡方的。测试的其余部分与任何其他假设测试一样。

H0(零假设):M1 是一个随机的猜测者

H1(替代假设):M1 不是一个随机的猜测者

M1 表列出了观察值,而随机猜测表列出了期望值。换句话说,对于我们的零假设,我们期望 M1 产生 RM 表中给出的结果。

为了找到卡方随机变量的值,我们还需要 DOF(自由度)。它是数据表中可以自由变化的值的数量。在计算实际类别和预测类别的概率时,我们固定了四个数字——实际阳性和阴性的数量,以及预测阳性和阴性的数量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

如果你现在观察上表,你会意识到,如果我给你集合 A,B,C,D 中的任何一个值,你可以找到剩下的变量。因此,数据集中的两个变量/值可以自由变化,因此 DOF=1。

从卡方统计量方程中,我们可以发现检验统计量是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.2 详述卡方检验

在继续之前,我想解释一下卡方检验的数学原理。如果你不是数学迷,请随意跳过。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

如果你还在这一节,我相信你一定很想知道为什么上面的项是卡方变量。让我们重新表述这个问题。我们在寻找 M1 是否是随机猜测的证据。为了做到这一点,我们假设这是一个随机猜测,并列出期望值。M1 表中的值是我们观察到的,我们使用卡方检验来检验这两组值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

随机猜测表(图片由作者提供)

好的,现在观察随机猜猜表。想想每一面,预测(+)和预测(-),就像硬币。例如,预测(+)是一个硬币,正面表示正,反面表示负。因此,如果您投掷预测(+)硬币,且正面朝上,则该数据实例被归类为真正。否则,如果它落在尾部,数据实例被分类为假阳性。这让你想起了一个特定的概率分布吗?

将 T 作为随机变量,描述真正的正面实例的数量(硬币类比的头部)。不遵循 p=0.65(正概率)和 n=69(总数据实例)的二项式分布吗?当然了。我假设你知道二项式分布可以近似为正态分布,只要 np 和 n(1-p)都超过 10。相应地,我们得到一个正态变量 z~N(0,1)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

我们可以利用上面的术语得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

就这样,我们挖掘出了隐藏的卡方项。记住 Z 遵循卡方分布。因此,RHS 是卡方分布的。在第一项中,T 是真阳性的数量,我们观察到它是 58,np=69 乘以 0.65=44.85。同样,在第二项中,n-T 是误报的次数,等于 11,n(1-p)等于 24.15。用这些值替换变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

你现在可以把预测的(-)当作另一枚硬币,重复这项繁重的工作。否则,相信我,当我说你的麻烦会产生以下结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

给你。两个 Z 项构成卡方统计量。

1.3 计算

您可以用 python 运行下面的代码来进行剩余的计算。我会讨论结果。

import numpy as np
import pandas as pd
from scipy.stats import chi2_contingency
data=[[58,7],[11,24]] #Model M1 table
#Chi square statistic,pvalue,DOF,expected table
stat, p, dof, expected = chi2_contingency(data) 
print('Chi-square statistic=',stat)
print('Pvalue=',p)
alpha=0.05
if p < alpha:
    print('Not a random guesser')
else:
    print('Model is a random guesser')

结果:

Chi-square statistic= 32.884319981094166
Pvalue= 9.780899116984747e-09

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

从结果中,您可以观察到卡方统计量非常高。因此,与 alpha (0.05)相比,我们的零假设成立的概率(p 值)是微不足道的。因此,我们可以得出结论,M1 不是一个随机的猜测者。但是,请注意,最终决定完全取决于 alpha 值。但是由于我们通常将α取为 0.05,我们可以对我们的发现有信心。

2.使用卡方检验比较两个模型

好了,我们已经评估完你做的第一个模型了。让我们对第二个模型进行一些测试。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

你也可以为这个模型进行一个单独的测试——“它是一个随机的猜测者吗?”。虽然,从上面的值可以明显看出,M2 比 M1 更准确。因此,M2 不可能是一个随机的猜测者。但它真的胜过 M1 吗,或者这种微小的进步源于随机的机遇吗?为了找到答案,我们必须修改我们的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

M1/M2 的正确/不正确矩阵(图片由作者提供)

上表显示了 M1 和 M2 正确和错误预测的分布。(我任意取了这些值。对于真正的问题,您可以通过执行几行代码轻松找到它们。).M1 和 M2 做出相同的预测(正确/不正确)没有什么令人信服的。我们对它们的差异很好奇,所以我们必须留意一个模型正确分类而另一个模型不正确分类的数据字段(B 和 C)。

如果 M1 和 M2 表现相似,B 值和 C 值应该不会相差太多。在这种情况下,两个模型的正确和错误预测比例几乎相等,因此表明同质性。

现在,通过将 B 和 C 想象成一枚硬币的两面,我们可以进行卡方检验来确定这两个值是否不同。我们已经确定上表的自由度是 1。卡方统计为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(图片由作者提供)

同样,不要急于想为什么上面是一个卡方变量。可以通过重复我们上一节所做的来证明。如果你愿意,你可以试试。这种区分两种模型的特殊方法更广为人知的是麦克内马检验。现在让我们进行测试并建立假设。

H0: M1 和 M2 是一样的

H1: M1 和 M2 不一样

import numpy as np
import pandas as pd
from statsmodels.stats.contingency_tables import mcnemar
data=[[77,5],[10,8]]
res = mcnemar(data, exact=False)
alpha=0.05
print('Chi-square statistic:',res.statistic)
print('Pvalue:',res.pvalue)
if res.pvalue < alpha:
    print('Models are different')
else:
    print('Models are same')Chi-square statistic: 1.0666666666666667
Pvalue: 0.30169958247834494

在这里,P 值超过α,所以我们不能丢弃 H0。因此,尽管 M2 似乎比 M1 表现更好,但表现的差异很可能是随机的。我们应该从结果中进行推断,以避免仅仅通过分析分类精度得出任何结论。

结束语

在本文中,我只讨论了两种类型的评估。有统计程序来评估多个问题的众多模型。ROC 曲线在判断众多机器学习算法时极其俏皮。我给你链接了一些资源,让你对上面的解释有一个更全面的回顾。

https://en.wikipedia.org/wiki/McNemar's_test

https://en . Wikipedia . org/wiki/Chi-squared _ distribution #简介

https://www.youtube.com/watch?v=80ffqpZdKiA

芝加哥闯红灯摄像机和交通安全

原文:https://towardsdatascience.com/chicago-red-light-cameras-and-traffic-safety-a6c5f08e5c4?source=collection_archive---------37-----------------------

闯红灯摄像头会减少交通事故吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由加比Unsplash 上拍摄

我最近收到了芝加哥市一张 100 美元的红灯罚单。和罚单一起的还有一个链接,是我的车在红灯右转时没有完全停下来的照片和视频。我成了可怕的芝加哥红灯摄影机的受害者。一个朋友告诉我,一项研究显示闯红灯的摄像头让十字路口变得更加危险。作为一名数据科学家,我很感兴趣。这在芝加哥听起来像是一个可以回答的问题,所以我建立了一个项目试图回答这个问题。

我还创建了一个网络应用程序来配合这个项目。有了它,你可以探索详细的芝加哥红灯摄像头路口和碰撞数据。(点击下图)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击图片访问链接https://chicago-rlc.herokuapp.com/

芝加哥红灯执法

2003 年,芝加哥开始用两个摄像头强制执行闯红灯。从那时起,该计划已经发展到在芝加哥 150 多个十字路口安装 350 多个摄像头。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

摄像头强制交叉路口在所有方向都有清晰的标记

该计划受到丑闻的冲击,包括:贿赂计划,腐败指控,涉嫌针对服务不足的社区,以及软件修补以增加收入。许多芝加哥人认为闯红灯的摄像机不过是创收者,是居民的隐形税收。该计划自启动以来已经产生了惊人的 7.5 亿美元,其中几个著名的路口每年罚款数百万美元。

该计划的起源和目的(如他们的网站上所说)是“通过减少交叉路口最危险的交通事故来提高芝加哥街道的安全性”。虽然所有的碰撞都有潜在的危险,但红灯摄像机的设计是为了减少角度(或“丁字”)碰撞,因为它们对那些涉及的人来说极其危险。随着人们遵守交通信号,严重的车祸和伤害会大大减少。”

摄像头会提高安全性吗?

2018 年在凯斯西大学进行了一项关于红灯相机安全的国家研究。使用休斯顿及其周围的红灯摄像机,得出的结论是,红灯摄像机减少了危险角度碰撞的数量,但也可能增加追尾和其他类型的事故,因此不会提高整体安全性。这项研究和其他研究指出,摄像头实际上改变了交通模式:司机倾向于更猛烈、更突然地刹车,导致不同类型的事故,但并没有减少总数。

我决定看看芝加哥的数据,看看能否对我的城市得出结论;闯红灯摄像头真的能改善交通安全吗?

我的数据

自 2017 年 9 月 1 日起,芝加哥所有警区都在全市范围内强制实施统一的车祸报告。超过 50 万起事故报告可在芝加哥数据门户获得,并且每天更新。详细的事故报告包括事故类型、事故是否发生在红灯路口,以及每起事故的纬度/经度。

https://data.cityofchicago.org/Transportation/Traffic-Crashes-Crashes-Dashboard/8tdq-a5dp

数据门户还包含每个摄像机的每日闯红灯摄像机违规,并包括路口的名称和纬度/经度位置。

https://data.cityofchicago.org/Transportation/Red-Light-Camera-Violations/spqx-js37

在过滤我的数据,只包括 2017 年 9 月至 2021 年 1 月之间发生的撞车事故后,我剩下了超过 60,000 起与交叉路口相关的事故,这些事故发生在芝加哥 3000 多个红灯交叉路口中的一个。

通过使用纬度/经度,我指定了发生在红灯摄像头十字路口中心 30 米内的事故。超过 8000 起事故被标记为闯红灯,发生在一个闯红灯摄像头强制控制的十字路口。这是该项目的主要数据集。

事故类型

如上所述,芝加哥正在寻求减少角(“丁字”)型事故。下面的图表是只用芝加哥的红灯路口生成的。角型事故占所有事故的 16%,但造成 37%的死亡和 31%的受伤。转弯事故(也可以通过闯红灯摄像机减少)是最多的,也是仅次于角度碰撞的第二大红灯伤亡原因。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

没有死亡的碰撞类型未显示。

休斯顿的研究显示,当摄像头被移除时,追尾事故会增加,虽然数量很多,但导致的伤亡却较少。如果更危险的碰撞类型相应减少,追尾事故的增加对一个城市来说是可以接受的。

方法学

休斯顿的研究使用了一项自然实验,该实验发生在该市的一次选民公投中,当时红灯摄像机被拆除。移除摄像头前后的碰撞数据可以进行比较,看看摄像头的存在是否对事故有影响。

我试图在芝加哥做同样的事情。自 2017 年以来,少数摄像头被打开/关闭,或被移至其他路口。这些删除和添加创建了一个类似于休斯顿研究的小规模(7 个交叉点)自然实验。此外,伊利诺伊州众议院的一项法案目前正在立法中,以消除芝加哥所有的红灯摄像机,这将创造一个难以置信的机会,以更大的规模评估这个实验。

七个兴趣点

不幸的是,我只能查看自 2017 年 9 月以来(车祸数据可用时)一直活跃的红灯摄像头路口。在此期间,七个路口要么被添加到闯红灯摄像头违规数据,要么被删除。安装/卸载前后都有崩溃数据。

在这段时间内,七个十字路口同时处于开启和关闭状态:

['FOSTER AND NORTHWEST HIGHWAY' 'FULLERTON AND NARRAGANSETT'
 'HALSTED AND 103RD' 'LAKE AND UPPER WACKER' 'MICHIGAN AND JACKSON'
 'MICHIGAN AND ONTARIO' 'MILWAUKEE AND CENTRAL']

我建立了一个数据集,包含我的每个十字路口的每日事故数量,并使用这些十字路口最早和最新的违规日期将人群分为“关闭摄像头”和“打开摄像头”(实验组和对照组)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第八个交叉路口(富勒顿/纳拉甘西特)可能已被删除,但未包括在以下结果中

Dataset from 7 intersections of interestCameras OFF:
Cumulative days: 1733
Total crashes off: 69Cameras ON:
Cumulative days: 6786
Total crashes: 134

纠正不平衡

数据集是不平衡的,主要集中在 2017 年末和 2018 年初。通常情况下,这不会是一个问题,但是通过我的研究,很明显一些十字路口有更多的撞车,受伤,甚至特殊类型的事故。我不希望一个单独的交叉点(可能有明显的偏差)压倒其他的。为了平衡数据集,我对每台相机的过度代表组进行了随机采样,因此每台相机的开机和关机天数相同。尽管低于预期的检验功效,但有足够的数据进行可靠的 t 检验,将这两个群体与以下结果进行比较。

Balanced dataset hypothesis testing: Null hypothesis: red light cameras have no effect on the number of crashes.alpha: 0.05
Power: 0.62n (cam on): 628 days
n (cam off): 628 daysmean (cam on): 0.03185 crash/day
mean (cam off): 0.04777 crash/day

Actual crashes with cams off: 30
Expected crashes with cams off: 20

Standard deviation: 4.40
z score: 2.27

P value: 0.0115REJECT the null hypothesis

当真实总体平均值为 0.032 时,有 1.2%的概率观察到样本平均值为 0.048。我们拒绝零假设,并接受另一个假设,即红灯摄像头的存在减少了这七个路口的事故数量。

这些结果与休斯顿的研究相反,休斯顿的研究并没有得出相机减少整体事故的结论。

附加测试结果

用同样的技术和平衡的人群,我们可以调查受伤的人数。

Balanced dataset hypothesis testing:Null hypothesis: red light cameras have no effect on the number of injuries.alpha: 0.05
Power: 0.99n (cam on): 628 days
n (cam off): 628 daysmean (cam on): 0.00159 injuries/day
mean (cam off): 0.01752 injuries/day

Actual injuries with cams off: 11
Expected crashes with cams off: 1.0

Standard deviation: 1.00
z score: 10.01

P value: 7.030e-24REJECT the null hypothesis

当真实总体平均值为 0.00159 时,观察到样本平均值为 0.01752 的概率极小。我们拒绝零假设,并接受另一个假设,即红灯摄像机的存在减少了这七个路口的受伤人数。

当执行相同的平衡方法和事故类型过滤时,结果是混杂的和不确定的。测试功率太小,无法确定倾斜事故是否减少,或追尾事故是否增加。然而,当红灯摄像机出现时,所有七个十字路口的所有类型的事故相同或更少。

这项研究的缺点

与 Case Western 的国家研究相比,这项研究在规模和范围上相对有限。他们的研究使用了近 10 倍多的十字路口,还使用了这里没有考虑的关于驾驶员决策、心理方面和全市安全计算的假设。我严格依赖现有的有限数据。当更多的数据可用时,也许是今年,这些数据可能足以对不同的事故类型和整体安全性进行越来越可靠的测试。

由于使用的摄像机数量如此有限,除了红灯的存在之外,还有其他因素可能影响了结果。潜在的偏差可能是:施工日期、交通模式变化、交叉路口改造或少数群体的一年中的采样时间。这同样可以通过额外的数据和交叉点来改善。

结论

对于所研究的十字路口,我们接受这样的假设,即闯红灯摄像机的存在减少了这些十字路口的事故和伤害数量。

这支持了芝加哥市安装摄像头以提高安全性的理由。

首席数据科学家担任指挥

原文:https://towardsdatascience.com/chief-data-scientist-as-a-conductor-e2fba60a74d3?source=collection_archive---------64-----------------------

如何成为您的数据团队的世界级领导者

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阿林达姆·马汉塔在 Unsplash 上拍摄的照片

C hief 数据科学家通常是从一群有才华的数据科学家中招募的。虽然从天才首席的转变听起来是一个小而合理的步骤,但角色非常不同。

数据科学家在一线解决问题。他们每天都在磨砺自己的技术、编码、解决问题和沟通技能。一些人渴望成为首席数据科学家。当他们最终得到这个职位时,他们惊讶于这个新角色的与众不同。

就我个人而言,我整天都在与不建立模型、学习新技术、研究新方法和尝试新方法作斗争,每天都是。我觉得我错过了,整个行业都在前进,而我却停滞不前。简单地说,我习惯于处理——很多!

人们认为这是从专家角色到经理角色的标准、简单的转变。我认为,事实并非如此。你如何努力成为数据科学领导者?您如何为数据科学团队、企业及其客户增加价值?

受音乐启发

我喜欢音乐。主要是爵士乐和古典音乐。当我听管弦乐队演奏时,我对音乐家们的技术技巧印象深刻;我同样对许多数据科学家的技术能力印象深刻。

但是我被一个乐队在一起演奏时发出的强大、庄严和壮观的声音迷住了。

这完全是指挥的功劳,他为观众编织了激动人心的体验。

回到数据科学世界

这对首席数据科学家有什么影响?我相信从世界级的指挥家身上可以学到两点。

  1. 他们如何指挥管弦乐队
  2. 他们如何保持在自己的岗位上不断进步

许多书都写了关于领导团队的内容,指挥/乐队的角色并不新鲜。维基百科上写着:

指挥的主要职责是以反映乐谱中特定指示的方式解释乐谱,设定节奏,确保合奏成员的正确进入,并在适当的时候“塑造”乐句。

这清楚地描述了执行。步伐。领导一个团队。

如果你不知道我在说什么,就看下面的视频:

来源:https://www . ted . com/talks/Benjamin _ Zander _ the _ transformative _ power _ of _ classic _ music?language=en

但是维基百科也提到了(有我的重点):

指挥充当他们指挥的管弦乐队或合唱团的向导。他们选择要表演的作品,研究他们的分数,他们可以对这些分数进行一定的调整(例如速度、发音、乐句、段落的重复),做出他们的诠释将他们的视觉传达给表演者。

这都是关于后台,指挥家工作中“看不见”的部分。我们在祖宾·梅塔的跳跃或者伦纳德·伯恩斯坦舞蹈中体验到这种“隐形”。但是幕后到底发生了什么呢?

除了开一辆像赫伯特·冯·卡拉扬那样的定制保时捷(!),指挥选择要演奏的作品——研究、调整、诠释。

这也是首席数据科学家应该做的。

首席数据科学家应尽最大努力:

  • 通过广泛阅读、追随思想领袖和与专家交流来了解任何值得探索的事物,跟上数据世界的新趋势
  • 通过深入了解业务需求和仔细研究数据的可能性,设计并执行最能支持其业务的数据战略
  • 选择要运行的项目,并根据业务情况调整它们
  • 解释结果同时忠实于业务问题
  • 将数据愿景传达给数据团队和整个企业,观察哪些可行,哪些不可行,并在需要时进行干预

至关重要的是,首席数据科学家需要确保数据团队像一个世界知名的、协调的、合拍的、流畅的管弦乐队一样工作!知道什么时候让人和项目发光,什么时候保持势头,什么时候拉回来。

对于首席数据科学家来说,认为自己是一名指挥而不是一名经理是一种解放(也相当令人愉快)。而且,一个人仍然可以密切关注激情的领域,就像一个指挥家仍然是一个音乐家一样。过渡到主增生:‘和’或非’或’。

美国指挥家(钢琴家兼作曲家)麦可·提尔森·汤玛斯很好地推测了首席数据指挥:

作为一名指挥家是一种混合职业,因为从根本上来说,它是一名教练、培训师、编辑、导演……我的中心格言之一是,指挥家试图做的一个主要部分是让一大群人就“现在”的实际位置达成一致。

所以,找到你团队的“现在”并记住:你做音乐不是为了娱乐自己,而是为了取悦你的听众。

一如既往,我无限感激 切尔西·威尔金森 耐心地将我的想法塑造成可出版的格式。

感谢阅读!

欢迎在评论中分享你的想法或观点。

跟我上 领英 推特

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值