{"cells":[{"metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","code_folding":[],"trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"cell_type":"code","source":"#import package\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n!pip install seaborn==0.10.0.rc0\nimport seaborn as sns\n\nimport missingno as msno \n\n\nimport cufflinks as cf\ncf.set_config_file(theme='ggplot',\n#                    sharing='public',\n                   offline=True,\n                   dimensions=(500,300),offline_show_link=False)\n\nimport plotly.express as px\nimport plotly.graph_objects as go\nfrom plotly.subplots import make_subplots\n\n\nfrom category_encoders.ordinal import OrdinalEncoder\nfrom category_encoders.target_encoder import TargetEncoder\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<a ID='0'> </a>\n<p style=\"color:#296EAA;font-size:150% \"> <b>🌟 EDA with Plotly & Target Encoding</b></p>\n<p style=\"color:#296EAA;font-size:150% \"> <b></b></p>\n\n <br>\n    \n- <a href='#1'>1. Import Data</a>\n- <a href='#2'>2. Feature exploration and visualization</a>\n    - <a href='#2-1'>2.1 Total Distribution</a>\n    - <a href='#2-2'>2.2 Binary Feature</a>\n    - <a href='#2-3'>2.3 Nominal Feature</a>\n    - <a href='#2-4'>2.4 Ordinal Feature</a>\n    - <a href='#2-1'>2.5 Day & Month Feature</a>\n- <a href='#3'>3. Feature Encoding</a>\n    - <a href='#3-1'>3.1 Binary Feature</a>\n    - <a href='#3-2'>3.2 Nominal Feature</a>\n    - <a href='#3-3'>3.3 Ordinal Feature</a>\n    - <a href='#3-4'>3.4 Day & Month Feature</a>"},{"metadata":{},"cell_type":"markdown","source":"> I learn a lot from [Subin's kernal](https://www.kaggle.com/subinium/categorical-data-eda-visualization), and use parts of code in his kernels, please give credit his kernal.<br>Really appreciate your feedback."},{"metadata":{},"cell_type":"markdown","source":"## <a id='1'>1 Import Data</a>"},{"metadata":{},"cell_type":"markdown","source":"<a href='#0'>Top</a>"},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"train = pd.read_csv('../input/cat-in-the-dat-ii/train.csv')\ntest = pd.read_csv('../input/cat-in-the-dat-ii/test.csv')\ntrain.head()","execution_count":null,"outputs":[]},{"metadata":{"scrolled":true,"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"target, train_id = train['target'], train['id']\ntest_id = test['id']\ntrain.drop(['id'], axis=1, inplace=True)\ntest.drop(['id'], axis=1, inplace=True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**feature list**\n\nIt's important to know what each feature is, because you need to check how you encode or distribute based on the feature.\n\n- **bin 0~4** : Binary Feature, label encoding\n- **nom 0~9** : Nominal Feature\n- **ord 0~5** : Ordinal Feature\n- **day/month** : Date, cycle encoding \n"},{"metadata":{},"cell_type":"markdown","source":"## <a id='2'>2 Feature exploration and visualization</a>"},{"metadata":{"heading_collapsed":true},"cell_type":"markdown","source":"###  <a id='2-1'> 2.1 Total Distribution"},{"metadata":{"hidden":true,"trusted":true},"cell_type":"code","source":"#plot the missing values\nmsno.matrix(train);","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[0],"hidden":true,"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# Plot NULL rate of training data\nnull_rate = [train[i].isna().sum() / len(train) for i in train.columns]\ndata = {'train_column':train.columns,'null_rate':null_rate}\ntrain_null_rate = pd.DataFrame(data).drop(23)\n\nfig = px.bar(train_null_rate, x = 'train_column',y='null_rate',\n             text='null_rate',color='null_rate',\n             title = 'Feature Null Rate (Train Data)')\nfig.update_traces(textposition='outside',texttemplate='%{text:.2p}',textfont_size=20)\nfig.update_layout(yaxis_tickformat = '%')\nfig.add_shape(\n        go.layout.Shape(\n            type=\"line\",\n            yref= 'y', y0= 0.03, y1= 0.03,\n            xref= 'x', x0= -1, x1= 23.5,\n            line=dict(\n                color=\"gray\",\n                width=1.5,\n                dash=\"dash\")\n        ))\n \nfig.update(layout_coloraxis_showscale=False) # hide colorscale\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',width=500,height=350) # this size is for kaggle kernal\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[0],"hidden":true,"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# Plot NULL rate of Test data\nnull_rate = [test[i].isna().sum() / len(train) for i in test.columns]\ndata = {'test_column':test.columns,'null_rate':null_rate}\ntest_null_rate = pd.DataFrame(data)\n\nfig = px.bar(test_null_rate, x = 'test_column',y='null_rate',\n             text='null_rate',color='null_rate',\n      title = 'Feature Null Rate (Test Data)')\nfig.update_traces(textposition='outside',texttemplate='%{text:.2p}',textfont_size=20)\nfig.update_layout(yaxis_tickformat = '%')\nfig.add_shape(\n        go.layout.Shape(\n            type=\"line\",\n            yref= 'y', y0= 0.02, y1= 0.02,\n            xref= 'x', x0= -1, x1= 23.5,\n            line=dict(\n                color=\"gray\",\n                width=1.5,\n                dash=\"dash\")\n        ))\nfig.update(layout_coloraxis_showscale=False) # hide colorscale   \nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',width=500,height=350) # this size is for kaggle kernal\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"hidden":true},"cell_type":"markdown","source":"First of all, you can see that the target ratio is unbalanced, percentage of target 1 is about 18.7%"},{"metadata":{"code_folding":[0],"hidden":true,"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"#Plot Target Distribution\ntarget.iplot(kind='histogram',histnorm='probability',title='Total Target Distribution',bargap=0.5)","execution_count":null,"outputs":[]},{"metadata":{"heading_collapsed":true},"cell_type":"markdown","source":"###  <a id='2-2'> 2.2 Binary Feature"},{"metadata":{"code_folding":[0],"hidden":true,"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# Plot binary feature distribution for Training Data\nsub_title = list(train[[col for col in train.columns if col.startswith('bin_')]].columns)\nfig = make_subplots(rows=1, cols=5,subplot_titles=sub_title)\nfor i in range(5): \n    a = train[f'bin_{i}'].value_counts()\n    fig.add_trace(       \n        go.Bar(x=a.index, y=a.values,width=0.2, text=a.values,textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'bin_{i}',showlegend=False,\n               textfont=dict(size=5),textangle=0,constraintext='inside',\n               marker=dict(color=['#732FB0','#2FB09D'],line_width=0.5, line_color='gray')\n              ),row=1, col=i+1)\n    \n\nfig.update_layout(title_text=\"Binary Feature Distribution (Train Data)\")\n\n# Hide the yaxis\nfig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),\n                         yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n# this size is for kaggle kernal\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',width=500,height=350) \n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n\n# fig.show(config={\"showLink\":True})\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[0],"hidden":true,"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# Plot binary feature distribution for Training Data\nsub_title = list(train[[col for col in test.columns if col.startswith('bin_')]].columns)\nfig = make_subplots(rows=1, cols=5,subplot_titles=sub_title)\nfor i in range(5): \n    a = test[f'bin_{i}'].value_counts()\n    fig.add_trace(       \n        go.Bar(x=a.index, y=a.values,width=0.2, text=a.values,textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'bin_{i}',showlegend=False,\n               textfont=dict(size=5),textangle=0,constraintext='inside',\n               marker=dict(color=['#732FB0','#2FB09D'],line_width=0.5, line_color='gray')\n              ),row=1, col=i+1)\n    \n\nfig.update_layout(title_text=\"Binary Feature Distribution (Test Data)\")\n\n# Hide the yaxis\nfig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n# this size is for kaggle kernal\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',width=500,height=350) \n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n\n# fig.show(config={\"showLink\":True})\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-input":true},"cell_type":"code","source":"# Plot Binary Feature Target Distribution for Training Data\nsub_title = list(train[[col for col in test.columns if col.startswith('bin_')]].columns)\n\nfig = make_subplots(rows=1, cols=5,subplot_titles=sub_title)\nfor i in range(5): \n\n    a = train.groupby([f'bin_{i}','target']).size().to_frame().reset_index()\n    a_0 = a[a['target']==0]\n    a_1 = a[a['target']==1]\n    \n    if i == 0:\n        \n        fig.add_trace(       \n            go.Bar( x=a_0[f'bin_{i}'], y=a_0[0],width=0.2, text=a_0[0],textposition='outside',\n                   texttemplate='%{text:.2s}',\n                   name = 'target_0',\n                   legendgroup = 'target_0',\n                   textfont=dict(size=5),textangle=0,constraintext='inside',\n                    marker=dict(\n                        color=['#732FB0','#732FB0'],\n                        line_width=0.5, line_color='gray')\n                  ),row=1, col=i+1)\n\n\n        fig.add_trace(       \n            go.Bar(x=a_1[f'bin_{i}'], y=a_1[0],width=0.2, text=a_1[0],textposition='outside',\n                   texttemplate='%{text:.2s}',\n                   name = 'target_1',\n                    legendgroup = 'target_1',\n                   textfont=dict(size=5),textangle=0,constraintext='inside',\n                    marker=dict(\n                        color=['#2FB09D','#2FB09D'],\n                        line_width=0.8, line_color='gray')\n                  ),row=1, col=i+1)  \n        \n    else:\n        \n        fig.add_trace(       \n            go.Bar( x=a_0[f'bin_{i}'], y=a_0[0],width=0.2, text=a_0[0],textposition='outside',\n                   texttemplate='%{text:.2s}',\n    #                name=f'bin_{i}'+' target_0',\n                   name = 'target_0',\n                   legendgroup = 'target_0',\n                   showlegend=False,\n                   textfont=dict(size=5),textangle=0,constraintext='inside',\n                    marker=dict(\n                        color=['#732FB0','#732FB0'],\n                        line_width=0.5, line_color='gray')\n                  ),row=1, col=i+1)\n        \n        fig.add_trace(       \n            go.Bar(x=a_1[f'bin_{i}'], y=a_1[0],width=0.2, text=a_1[0],textposition='outside',\n                   texttemplate='%{text:.2s}',\n    #                name=f'bin_{i}'+' target_1',\n                   name = 'target_1',\n                    legendgroup = 'target_1',\n                   showlegend=False,\n                   textfont=dict(size=5),textangle=0,constraintext='inside',\n                    marker=dict(\n                        color=['#2FB09D','#2FB09D'],\n                        line_width=0.8, line_color='gray')\n                  ),row=1, col=i+1)\n\n\n        fig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),\n                         yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n        \nfig.update_layout(title_text=\"Binary Feature Target Distribution (Train Data)\",\n                  margin=dict(l=25,t=50,b=0),\n                  legend_orientation='h',width=500,height=300) # this size is for kaggle kernal\n\n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n\nfig.show()\n# fig.show(config={\"showLink\":True})","execution_count":null,"outputs":[]},{"metadata":{"heading_collapsed":true},"cell_type":"markdown","source":"###  <a id='2-3'> 2.3 Nominal Feature"},{"metadata":{"hidden":true,"trusted":false},"cell_type":"code","source":"#Describe nominal features\ntrain[[col for col in train.columns if col.startswith('nom_')]].describe(include=['O'])","execution_count":null,"outputs":[]},{"metadata":{"hidden":true},"cell_type":"markdown","source":"nom_0 - nom_4 have few unique values, So let's plot the detail distribution"},{"metadata":{"code_folding":[0],"hidden":true,"trusted":false,"_kg_hide-input":true},"cell_type":"code","source":"# Plot nominal feature distribution for Training Data\nsub_title = list(train[[col for col in train.columns if col.startswith('nom_')]].columns)\nfig = make_subplots(rows=1, cols=5,subplot_titles=sub_title)\nfor i in range(5): \n    a = train[f'nom_{i}'].value_counts()\n    fig.add_trace(       \n        go.Bar(x=a.index, y=a.values,width=0.2, text=a.values,textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'bin_{i}',showlegend=False,\n               textfont=dict(size=15),\n               marker=dict(\n#                    color=['#732FB0','#2FB09D'],\n                   line_width=0.5, line_color='gray')\n              ),row=1, col=i+1)\n    \n\nfig.update_layout(title_text=\"Nominal Feature (0-4) Distribution (Train Data)\")\n\n# Hide the yaxis\nfig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n# this size is for kaggle kernal\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',width=500,height=350) \n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n#fig.show(config={\"showLink\":True})\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[0],"hidden":true,"trusted":false,"_kg_hide-input":true},"cell_type":"code","source":"# Plot nominal feature distribution for Test Data\nsub_title = list(test[[col for col in test.columns if col.startswith('nom_')]].columns)\nfig = make_subplots(rows=1, cols=5,subplot_titles=sub_title)\nfor i in range(5): \n    a = test[f'nom_{i}'].value_counts()\n    fig.add_trace(       \n        go.Bar(x=a.index, y=a.values,width=0.2, text=a.values,textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'bin_{i}',showlegend=False,\n               textfont=dict(size=15),\n               marker=dict(\n#                    color=['#732FB0','#2FB09D'],\n                   line_width=0.5, line_color='gray')\n              ),row=1, col=i+1)\n    \n\nfig.update_layout(title_text=\"Nominal Feature (0-4) Distribution (Test Data)\")\n\n# Hide the yaxis\nfig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n# this size is for kaggle kernal\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',width=500,height=350) \n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n#fig.show(config={\"showLink\":True})\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[0],"hidden":true,"trusted":false,"_kg_hide-input":true},"cell_type":"code","source":"# Plot Nominal Feature Target Distribution for Training Data\nsub_title = list(train[[col for col in test.columns if col.startswith('nom_')]].columns)\nfig = make_subplots(rows=1, cols=5,subplot_titles=sub_title)\nfor i in range(5): \n\n    a = train.groupby([f'nom_{i}','target']).size().to_frame().reset_index().sort_values(0,ascending=False)\n    a_0 = a[a['target']==0]\n    a_1 = a[a['target']==1]\n    \n    if i == 0:\n        fig.add_trace(       \n            go.Bar( x=a_0[f'nom_{i}'], y=a_0[0],width=0.2, text=a_0[0],textposition='outside',\n                   texttemplate='%{text:.2s}',\n                   name = 'target_0',legendgroup = 'target_0',\n                   showlegend=False,\n                   textfont=dict(size=15),\n                    marker=dict(\n#                         color=['#732FB0'] * a_1.shape[0],\n                        line_width=0.5, line_color='gray')\n                  ),row=1, col=i+1)\n\n        fig.add_trace(       \n            go.Bar(x=a_1[f'nom_{i}'], y=a_1[0],width=0.2, text=a_1[0],textposition='outside',\n                   texttemplate='%{text:.2s}',\n                   name = 'target_1',legendgroup = 'target_1',\n                   showlegend=False,\n                   textfont=dict(size=15),\n                    marker=dict(\n#                         color=['#2FB09D'] * a_1.shape[0],\n                        line_width=0.8, line_color='gray')\n                  ),row=1, col=i+1)\n    else:\n        fig.add_trace(       \n            go.Bar( x=a_0[f'nom_{i}'], y=a_0[0],width=0.2, text=a_0[0],textposition='outside',\n                   texttemplate='%{text:.2s}',\n                   name = 'target_0',legendgroup = 'target_0',\n                   showlegend=False,\n                   textfont=dict(size=15),\n                    marker=dict(\n#                         color=['#732FB0'] * a_1.shape[0],\n                        line_width=0.5, line_color='gray')\n                  ),row=1, col=i+1)\n\n        fig.add_trace(       \n            go.Bar(x=a_1[f'nom_{i}'], y=a_1[0],width=0.2, text=a_1[0],textposition='outside',\n                   texttemplate='%{text:.2s}',\n                   name = 'target_1',legendgroup = 'target_1',\n                   showlegend=False,\n                   textfont=dict(size=15),\n                    marker=dict(\n#                         color=['#2FB09D'] * a_1.shape[0],\n                        line_width=0.8, line_color='gray')\n                  ),row=1, col=i+1)\n    \nfig.update_layout(title_text=\"Nominal Feature (0-4) Target Distribution (Train Data)\")\n\n# Hide the yaxis\nfig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n# this size is for kaggle kernal\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='v',width=500,height=350) \n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n#fig.show(config={\"showLink\":True})\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[],"hidden":true,"trusted":false},"cell_type":"code","source":"# Nominal Feature (0-4) Target Rate Distribution\nfor i in range(5):\n    data = train[[f'nom_{i}', 'target']].groupby(f'nom_{i}')['target'].value_counts().unstack()\n    data['rate'] = data[1]  / (data[0] + data[1] )\n    data.sort_values(by=['rate'], inplace=True)\n    display(data.style.highlight_max(color='lightgreen').highlight_min(color='#cd4f39').format({'rate' : \"{:.2%}\"}))","execution_count":null,"outputs":[]},{"metadata":{"heading_collapsed":true},"cell_type":"markdown","source":"###  <a id='2-4'> 2.4 Ordinal Feature"},{"metadata":{"hidden":true,"trusted":false},"cell_type":"code","source":"train[[col for col in train.columns if col.startswith('ord_')]].describe(include='all')","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[0],"hidden":true,"trusted":false,"_kg_hide-input":true},"cell_type":"code","source":"# Plot Ordinal Feature  (0-3) Target Distribution for Training Data\nsub_title = list(train[[col for col in test.columns if col.startswith('ord_')]].columns)[:4]\n\nfig = make_subplots(rows=1, cols=4,subplot_titles=sub_title)\nfor i in range(4): \n\n    a = train.groupby([f'ord_{i}','target']).size().to_frame().reset_index().sort_values(0,ascending=False)\n    a_0 = a[a['target']==0]\n    a_1 = a[a['target']==1]\n    \n    fig.add_trace(       \n        go.Bar( x=a_0[f'ord_{i}'], y=a_0[0],width=0.2, text=a_0[0],textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'ord_{i}'+' target_0',\n               showlegend=False,\n               textfont=dict(size=15),\n                marker=dict(\n#                     color=['#732FB0','#732FB0'],\n                    line_width=0.5, line_color='gray')\n              ),row=1, col=i+1)\n    \n    fig.add_trace(       \n        go.Bar(x=a_1[f'ord_{i}'], y=a_1[0],width=0.2, text=a_1[0],textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'ord_{i}'+' target_1',\n               showlegend=False,\n               textfont=dict(size=15),\n                marker=dict(\n#                     color=['#2FB09D','#2FB09D'],\n                    line_width=0.8, line_color='gray')\n              ),row=1, col=i+1)  \n    \nfig.update_layout(title_text=\"Nominal Ordinal (0-3) Target Distribution (Train Data)\",\n                  barmode='group')\n\n# Hide the yaxis\nfig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n# this size is for kaggle kernal\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',width=500,height=350) \n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n#fig.show(config={\"showLink\":True})\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[],"hidden":true,"trusted":false,"_kg_hide-input":true},"cell_type":"code","source":"# Plot Ordinal Feature (4) Target Distribution for Training Data\nsub_title = list(train[[col for col in test.columns if col.startswith('ord_')]].columns)[-2:-1]\n\nfig = make_subplots(rows=1, cols=1,subplot_titles=sub_title)\nfor i in [4]: \n\n    a = train.groupby([f'ord_{i}','target']).size().to_frame().reset_index().sort_values(0,ascending=False)\n    a_0 = a[a['target']==0]\n    a_1 = a[a['target']==1]\n    \n    fig.add_trace(       \n        go.Bar( x=a_0[f'ord_{i}'], y=a_0[0],width=0.2, text=a_0[0],textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'ord_{i}'+' target_0',\n               showlegend=False,\n               textfont=dict(size=5),textangle=0,constraintext='inside',\n                marker=dict(\n#                     color=['#732FB0','#732FB0'],\n                    line_width=0.5, line_color='gray')\n              ),row=1, col=1)\n    \n    fig.add_trace(       \n        go.Bar(x=a_1[f'ord_{i}'], y=a_1[0],width=0.2, text=a_1[0],textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'ord_{i}'+' target_1',\n               showlegend=False,\n               textfont=dict(size=5),textangle=0,constraintext='inside',\n                marker=dict(\n#                     color=['#2FB09D','#2FB09D'],\n                    line_width=0.8, line_color='gray')\n              ),row=1, col=1)  \n    \nfig.update_layout(title_text=\"Nominal Ordinal (4) Target Distribution (Train Data)\",\n                  barmode='group')\n\n\n\n# Hide the yaxis\nfig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n# this size is for kaggle kernal\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',width=500,height=350) \n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n#fig.show(config={\"showLink\":True})\nfig.show()\n\n","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[0],"hidden":true,"trusted":false,"_kg_hide-input":true},"cell_type":"code","source":"# Plot Ordinal Feature (5) Target Distribution for Training Data\nsub_title = list(train[[col for col in test.columns if col.startswith('ord_')]].columns)[-1:]\n\nfig = make_subplots(rows=1, cols=1,subplot_titles=sub_title)\nfor i in [5]: \n\n    a = train.groupby([f'ord_{i}','target']).size().to_frame().reset_index().sort_values(0,ascending=False)\n    a_0 = a[a['target']==0]\n    a_1 = a[a['target']==1]\n    \n    fig.add_trace(       \n        go.Bar( x=a_0[f'ord_{i}'], y=a_0[0],width=0.2, text=a_0[0],textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'ord_{i}'+' target_0',\n               showlegend=False,\n               textfont=dict(size=5),textangle=0,constraintext='inside',\n                marker=dict(\n#                     color=['#732FB0','#732FB0'],\n                    line_width=0.5, line_color='gray')\n              ),row=1, col=1)\n    \n    fig.add_trace(       \n        go.Bar(x=a_1[f'ord_{i}'], y=a_1[0],width=0.2, text=a_1[0],textposition='outside',\n               texttemplate='%{text:.2s}',\n               name=f'ord_{i}'+' target_1',\n               showlegend=False,\n               textfont=dict(size=5),textangle=0,constraintext='inside',\n                marker=dict(\n#                     color=['#2FB09D','#2FB09D'],\n                    line_width=0.8, line_color='gray')\n              ),row=1, col=1)  \n    \nfig.update_layout(title_text=\"Nominal Ordinal (5) Target Distribution (Train Data)\",\n                  barmode='group')\n# Hide the yaxis\nfig.update_layout(yaxis=dict(visible=False),yaxis2=dict(visible=False),yaxis3=dict(visible=False),yaxis4=dict(visible=False),yaxis5=dict(visible=False))\n\n# this size is for kaggle kernal\nfig.update_layout(margin=dict(l=25,t=50,b=0),legend_orientation='h',height=350) \n\n# Set the subtitle size\nfor i in fig['layout']['annotations']:\n    i['font'] = dict(size=10,color='black')\n#fig.show(config={\"showLink\":True})\nfig.show()","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":false},"cell_type":"code","source":"# Ordinal Feature (0-4) Target Rate Distribution\nfor i in range(5):\n    data = train[[f'ord_{i}', 'target']].groupby(f'ord_{i}')['target'].value_counts().unstack()\n    data['rate'] = data[1]  / (data[0] + data[1] )\n    data.sort_values(by=['rate'], inplace=True)\n    display(data.style.highlight_max(color='lightgreen').highlight_min(color='#cd4f39').format({'rate' : \"{:.2%}\"}))","execution_count":null,"outputs":[]},{"metadata":{"heading_collapsed":true},"cell_type":"markdown","source":"###  <a id='2-5'> 2.5 Day & Month Feature"},{"metadata":{"code_folding":[0],"hidden":true,"trusted":false},"cell_type":"code","source":"# day & month Target Rate Distribution\ndata = train[['day', 'target']].groupby('day')['target'].value_counts().unstack()\ndata['rate'] = data[1]  / (data[0] + data[1] )\ndata.sort_values(by=['rate'], inplace=True)\ndisplay(data.style.highlight_max(color='lightgreen').highlight_min(color='#cd4f39').format({'rate' : \"{:.2%}\"}))\n\ndata = train[['month', 'target']].groupby('month')['target'].value_counts().unstack()\ndata['rate'] = data[1]  / (data[0] + data[1] )\ndata.sort_values(by=['rate'], inplace=True)\ndisplay(data.style.highlight_max(color='lightgreen').highlight_min(color='#cd4f39').format({'rate' : \"{:.2%}\"}))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## <a id='3'>3 Feature Encoding</a>\n[Categorical-encoding](https://github.com/scikit-learn-contrib/categorical-encoding) is a library of sklearn compatible categorical variable encoders. It contains a set of scikit-learn-style transformers for encoding categorical variables into numeric by means of different techniques."},{"metadata":{"heading_collapsed":true},"cell_type":"markdown","source":"###  <a id='3-1'> 3.1 Binary Feature Encoding"},{"metadata":{"hidden":true,"trusted":false},"cell_type":"code","source":"train[[col for col in train.columns if col.startswith('bin_')]].describe(include='all')","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":false},"cell_type":"code","source":"#  lable Encoding for binary features\n\nfor i in range(5):\n    ord_order_dict = {i : j for j, i in enumerate(sorted(list(set(list(train[f'bin_{i}'].dropna().unique()) + list(test[f'bin_{i}'].dropna().unique())))))}\n    ord_order_dict['NULL']=len(train[f'bin_{i}'].dropna().unique()) # mapping null value\n    print(ord_order_dict)\n    bin_encoding = [{'col': f'bin_{i}', 'mapping': ord_order_dict}]\n    label = OrdinalEncoder(mapping=bin_encoding)    \n    train['lable_' + f'bin_{i}'] =  label.fit_transform(train[f'bin_{i}'].fillna('NULL'))\n    test['lable_' + f'bin_{i}'] =  label.fit_transform(test[f'bin_{i}'].fillna('NULL'))","execution_count":null,"outputs":[]},{"metadata":{"hidden":true,"trusted":false},"cell_type":"code","source":"# Target Encoding for binary features\n\nfor i in range(5):\n    label = TargetEncoder()\n    train['target_' + f'bin_{i}'] = label.fit_transform(train[f'bin_{i}'].fillna('NULL'), target)\n    test['target_' + f'bin_{i}'] = label.transform(test[f'bin_{i}'].fillna('NULL'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"###  <a id='3-2'> 3.2 Nominal Feature Encoding"},{"metadata":{"trusted":false},"cell_type":"code","source":"train[[col for col in train.columns if col.startswith('nom_')]].describe(include='all')","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[],"trusted":false},"cell_type":"code","source":"# Lable Encoding for Nominal features\n\nfor i in range(10):\n    ord_order_dict = {i : j for j, i in enumerate(sorted(list(set(list(train[f'nom_{i}'].dropna().unique()) + list(test[f'nom_{i}'].dropna().unique())))))}\n    ord_order_dict['NULL']=len(train[f'nom_{i}'].dropna().unique()) # mapping null value\n#     print(ord_order_dict)\n    bin_encoding = [{'col': f'nom_{i}', 'mapping': ord_order_dict}]\n    label = OrdinalEncoder(mapping=bin_encoding)    \n    train['lable_' + f'nom_{i}'] =  label.fit_transform(train[f'nom_{i}'].fillna('NULL'))\n    test['lable_' + f'nom_{i}'] =  label.fit_transform(test[f'nom_{i}'].fillna('NULL'))","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[],"trusted":false},"cell_type":"code","source":"# Target Encoding for Nominal features\n\nfor i in range(10):\n    label = TargetEncoder()\n    train['target_' + f'nom_{i}'] = label.fit_transform(train[f'nom_{i}'].fillna('NULL'), target)\n    test['target_' + f'nom_{i}'] = label.transform(test[f'nom_{i}'].fillna('NULL'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"###  <a id='3-3'> 3.3 Ordinal Feature Encoding"},{"metadata":{"trusted":false},"cell_type":"code","source":"train[[col for col in train.columns if col.startswith('ord_')]].describe(include='all')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"# features 'ord_0', 'ord_1', 'ord_2'  follow the order below\nord_order = [\n    [1.0, 2.0, 3.0],\n    ['Novice', 'Contributor', 'Expert', 'Master', 'Grandmaster'],\n    ['Freezing', 'Cold', 'Warm', 'Hot', 'Boiling Hot', 'Lava Hot']]\n\nfor i in range(0, 3):\n    ord_order_dict = {i : j for j, i in enumerate(ord_order[i])}\n    ord_order_dict['NULL']=len(train[f'ord_{i}'].dropna().unique()) # mapping null value\n    print(ord_order_dict)\n    bin_encoding = [{'col': f'ord_{i}', 'mapping': ord_order_dict}]\n    label = OrdinalEncoder(mapping=bin_encoding)    \n    train['lable_' + f'ord_{i}'] =  label.fit_transform(train[f'ord_{i}'].fillna('NULL'))\n    test['lable_' + f'ord_{i}'] =  label.fit_transform(test[f'ord_{i}'].fillna('NULL'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"# features 'ord_3', 'ord_4', 'ord_5'  follow the alphabet order\n\nfor i in range(3, 6):\n    ord_order_dict = {i : j for j, i in enumerate(sorted(list(set(list(train[f'ord_{i}'].dropna().unique()) + list(test[f'ord_{i}'].dropna().unique())))))}\n    ord_order_dict['NULL']=len(train[f'ord_{i}'].dropna().unique()) # mapping null value\n#     print(ord_order_dict)\n    bin_encoding = [{'col': f'ord_{i}', 'mapping': ord_order_dict}]\n    label = OrdinalEncoder(mapping=bin_encoding)    \n    train['lable_' + f'ord_{i}'] =  label.fit_transform(train[f'ord_{i}'].fillna('NULL'))\n    test['lable_' + f'ord_{i}'] =  label.fit_transform(test[f'ord_{i}'].fillna('NULL'))","execution_count":null,"outputs":[]},{"metadata":{"code_folding":[],"trusted":false},"cell_type":"code","source":"# Target Encoding for Ordinal features\n\nfor i in range(6):\n    label = TargetEncoder()\n    train['target_' + f'ord_{i}'] = label.fit_transform(train[f'ord_{i}'].fillna('NULL'), target)\n    test['target_' + f'ord_{i}'] = label.transform(test[f'ord_{i}'].fillna('NULL'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"###  <a id='3-4'> 3.4 Day & Month Feature Encoding"},{"metadata":{"trusted":false},"cell_type":"code","source":"#  lable Encoding for Day & Month features\n\nord_order_dict = { j+1: i for j, i in enumerate(sorted(list(set(list(train['day'].dropna().unique()) + list(test['day'].dropna().unique())))))}\nord_order_dict['NULL']=len(train['day'].unique()) # mapping null value\nbin_encoding = [{'col': 'day', 'mapping': ord_order_dict}]\nlabel = OrdinalEncoder(mapping=bin_encoding)    \n       \ntrain['lable_' + 'day'] =  label.fit_transform(train['day'].fillna('NULL'))\ntest['lable_' + 'day'] =  label.fit_transform(test['day'].fillna('NULL'))\n\n\nord_order_dict = { j+1: i for j, i in enumerate(sorted(list(set(list(train['month'].dropna().unique()) + list(test['month'].dropna().unique())))))}\nord_order_dict['NULL']=len(train['month'].unique()) # mapping null value\nbin_encoding = [{'col': 'month', 'mapping': ord_order_dict}]\nlabel = OrdinalEncoder(mapping=bin_encoding)    \n       \ntrain['lable_' + 'month'] =  label.fit_transform(train['month'].fillna('NULL'))\ntest['lable_' + 'month'] =  label.fit_transform(test['month'].fillna('NULL'))\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"# Target Encoding for Day & Month features\nlabel = TargetEncoder()\ntrain['target_' + 'day'] = label.fit_transform(train['day'].fillna('NULL'), target)\ntest['target_' + 'day'] = label.transform(test['day'].fillna('NULL'))\n\nlabel = TargetEncoder()\ntrain['target_' + 'month'] = label.fit_transform(train[f'ord_{i}'].fillna('NULL'), target)\ntest['target_' + 'month'] = label.transform(test[f'ord_{i}'].fillna('NULL'))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# target features correlations\ndf_target_feature = train[[col for col in train.columns if col.startswith('target_')]]\n\nsns.set(style=\"white\")\n\n# Compute the correlation matrix\ncorr = df_target_feature.corr()\n\n# Generate a mask for the upper triangle\nmask = np.triu(np.ones_like(corr, dtype=np.bool))\n\n# Set up the matplotlib figure\nf, ax = plt.subplots(figsize=(11, 9))\n\n# Generate a custom diverging colormap\ncmap = sns.diverging_palette(220, 10, as_cmap=True)\n\n# Draw the heatmap with the mask and correct aspect ratio\nsns.heatmap(corr, mask=mask, cmap=cmap, vmax=.3, center=0,\n            square=True, linewidths=.5, cbar_kws={\"shrink\": .5})\nax.set_title('Target Features Correlation');","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Model ( to be continue )"},{"metadata":{},"cell_type":"markdown","source":"\n<html>\n<body>\n\n<p><font size=\"4\" color=\"Gray\">If you like my kernel please consider upvoting it</font></p>\n<p><font size=\"3\" color=\"Purple\">Please don't hesitate to give your suggestions in the comment section</font></p>\n\n</body>\n</html>\n"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.3"}},"nbformat":4,"nbformat_minor":1}