{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-05-25T10:48:51.144144Z","iopub.execute_input":"2021-05-25T10:48:51.144521Z","iopub.status.idle":"2021-05-25T10:48:51.159062Z","shell.execute_reply.started":"2021-05-25T10:48:51.14448Z","shell.execute_reply":"2021-05-25T10:48:51.15795Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:51.219182Z","iopub.execute_input":"2021-05-25T10:48:51.219538Z","iopub.status.idle":"2021-05-25T10:48:51.225452Z","shell.execute_reply.started":"2021-05-25T10:48:51.219508Z","shell.execute_reply":"2021-05-25T10:48:51.224755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1.DATASET ","metadata":{}},{"cell_type":"code","source":"df_train = pd.read_csv(\"../input/quora-insincere-questions-classification/train.csv\")\nprint(\"Shape of train data: \", df_train.shape)\ndf_train.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:51.293376Z","iopub.execute_input":"2021-05-25T10:48:51.295422Z","iopub.status.idle":"2021-05-25T10:48:54.112002Z","shell.execute_reply.started":"2021-05-25T10:48:51.295383Z","shell.execute_reply":"2021-05-25T10:48:54.110938Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.read_csv(\"../input/quora-insincere-questions-classification/test.csv\")\nprint(\"Shape of test data: \", df_test.shape)\ndf_test.head()","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:54.113748Z","iopub.execute_input":"2021-05-25T10:48:54.114335Z","iopub.status.idle":"2021-05-25T10:48:54.972998Z","shell.execute_reply.started":"2021-05-25T10:48:54.11429Z","shell.execute_reply":"2021-05-25T10:48:54.971876Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2.Data analysis","metadata":{}},{"cell_type":"code","source":"df_train.info()","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:54.975411Z","iopub.execute_input":"2021-05-25T10:48:54.975867Z","iopub.status.idle":"2021-05-25T10:48:55.237192Z","shell.execute_reply.started":"2021-05-25T10:48:54.975824Z","shell.execute_reply":"2021-05-25T10:48:55.236491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train['target'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:55.238411Z","iopub.execute_input":"2021-05-25T10:48:55.238811Z","iopub.status.idle":"2021-05-25T10:48:55.257688Z","shell.execute_reply.started":"2021-05-25T10:48:55.238783Z","shell.execute_reply":"2021-05-25T10:48:55.256759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Equilibrium of the data set\nData imbalance is one of the common phenomena of binary classification problem. Before delving into the analysis of this phenomenon, we need to check the equilibrium of the data set.","metadata":{}},{"cell_type":"code","source":"print(\"Total questions: \", df_train.shape[0])\nprint(\"Sincere questions: {}%\".format(round(df_train[df_train[\"target\"] == 0].shape[0]/df_train.shape[0]*100, 2)))\nprint(\"Insincere questions: {}%\".format(round(df_train[df_train[\"target\"] == 1].shape[0]/df_train.shape[0]*100, 2)))\n\nplt.figure(figsize=(10,9))\nsns.countplot(x='target', data=df_train)\nplt.title('Count of question in each category (insincere =  1)')","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:55.258928Z","iopub.execute_input":"2021-05-25T10:48:55.259217Z","iopub.status.idle":"2021-05-25T10:48:55.594708Z","shell.execute_reply.started":"2021-05-25T10:48:55.259189Z","shell.execute_reply":"2021-05-25T10:48:55.593761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The non-toxic question accounts for nearly 94%, whereby the data ratio between the two classes is about 15:1.\n\nThis is a serious imbalance that leads to inaccurate forecasting results in the minority.","metadata":{}},{"cell_type":"markdown","source":"# Handling data imbalance\nWhen one side has a majority and the other a minority, there are obviously two ways to balance them out:\n\n**Over sampling:** consists of increasing samples in minority class making it eqivalent to majority \n\n**Under sampling**: consists of reducing sample size by removing samples from majority class and making it equal to minority\n\n![image.png](attachment:16cd9af0-a03b-46ac-8092-219e1940f022.png)!\n\noversampling duplicates random records from minority class which causes overfitting. In undersampling removing random records from majority class can cause loss of information.\n\nProblem: The ratio of 50:50 on 2 classes is an equilibrium, but getting there will take a lot of data samples.\n\nSolution: We will reduce the imbalance (1:4) so that it does not significantly affect the predictive power of the model.","metadata":{},"attachments":{"16cd9af0-a03b-46ac-8092-219e1940f022.png":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAAtUAAADVCAYAAACYLAxCAAAgAElEQVR4Ae2dCdhd07nHg0u1yGCIxCwxDzHVNVwSxCyIKaiahSBUgxqSEtSUmkWJmaumUkSpOWY1VXGNVUOlSMwxhAzWfX6rfXf2t799ztlnn3Gd81/Pc76z17zWf63zvv/v3e9eu4tTEAJCQAgIASEgBISAEBACQqAiBLpUVFuVhYAQEAJCQAgIASEgBISAEHAi1doEQkAICAEhIASEgBAQAkKgQgREqisEUNWFgBAQAkJACAgBISAEhIBItfaAEBACQkAICAEhIASEgBCoEAGR6goBVHUhIASEgBAQAkJACAgBISBSrT0gBISAEBACQkAICAEhIAQqRECkukIAW6n6jTfe6K677jr30UcftdK0is7lD3/4g7vlllv8xwredNNNjs93331nSfoWAkJACLQUAlOmTHHvv/+++/rrr1tqXtWezBtvvOFuvvlm6YhqA9ui7YlUN/nCDh8+3C288MJu//337zTSFVZYwS255JLu6aef7pSXJ6FLly6Oz8SJE/NUD7LOXnvt5ed89tlnR+M3HD788MMoTRdCQAgIgVZA4Oqrr3ZrrbWWl3sm69Zdd113ww03tML0qj6HBx980GO15pprRm0bbtIRESS6+A8CItVNvhUg1fyAR4wY0WmkCy64oM+rFqmed955fXvtRKr5ZwV846R6u+22c5tuuqmTwOy05ZQgBIRAwAiccsopXt4ZKezTp4/r0aNHlHbyyScHPLvaDD2NVEtH1AbrVmhVpLrJV9FI9S9/+ctOI11ooYW8MCxGqiHI33zzTae6lvDPf/7TLl0xUk07n332WVS20EWSkE+fPt3Rx8cff1yoips2bVrJMlYZ15TkOOjzq6++siIFv7nVmQxppDpZJhmn/2KEm9up//rXv5LVFBcCQkAINAyBJ554IiLPv/71rzuMAzJtRPuxxx7rkJc1UksdwRiQqUn9kja2auuINFKd1m88TToijkZ7XYtUN/l6l0uqF110UbfMMsu4CRMmuGWXXTYSlElS/r//+79uscUW8/lYvP/0pz+lkurbbrvN9e3bN2pnyy23dG+//XaE2iGHHOIWWGABd++990b9WV/77bdfVA+BjbvK7bffHtXlwtwvTKAvv/zy7o477ojK/PznP3fM6dFHH3U77LBD1B6W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qmdhoSshIASEgBAQAkJACAgBIZALAZHqXLCpkhAQAkJACAgBISAEhIAQmIWASPUsLHQlBISAEBACQkAICAEhIARyISBSnQs2VRICQkAICAEhIASEgBAQArMQEKmehYWuhIAQEAJCQAgIASEgBIRALgREqnPBpkpCQAgIASEgBISAEBACQmAWAiLVs7AoePWH5/7pdh33ZJCfk8b/X8F5KUMICAEhIASEgBAQAkKgOgiIVGfA8dz733BLHvOnID/8M6AgBISAEBACQkAICAEhUFsERKoz4CtSnQEkFRECQkAICAEhIASEQBsjIFKdYfFFqjOApCJCQAgIASEgBISAEGhjBESqMyy+SHUGkFRECAgBISAEhIAQEAJtjIBIdYbFF6nOAJKKCAEhIASEgBAQAkKgjREQqc6w+CLVGUBSESEgBISAEBACQkAItDECItUZFl+kOgNIKiIEhIAQEAJCQAgIgTZGQKQ6w+KLVGcASUWEgBAQAkJACAgBIdDGCIhUZ1h8keoMIKmIEBACQkAICAEhIATaGAGR6gyLL1KdASQVEQJCoK0RCPnNs4xdQQg0BQIfvujcVVuH+3nhurJhDPWN1Wkv1xOpzrD8ItUZQFIRISAE2hqBkOUkY1cQAk2BwDuPOndi13A/E04rG8ZQ31jNuJNBpDqJSEo8ZGWR9p9UyhSVJASEgBCoCIGQ5WS7k+qZM2e6yZMnV7T+qlwlBESqXUgkO7nqItVJRFLiISsLkeqUBVWSEBACVUcgZDnZrqT6/fffd7vvvrvr2rWr6927t1t44YXdaaeVb2lM20xDhw51n376aVpWTdJOOOEEt/XWW7vf/OY3ndqfPn26++KLL3z68ccf76699tpOZZomQaRapLppNqMGIgSEgBAQAg1BQKS6IbDn7vS7775zK664ojvllFMc14SXXnrJp5177rm527WKQ4YMqRupfuaZZ1yvXr3cE0884Z5//nkbQvS90korRaR67733dldddVWU13QXItUi1U23Kas8oJCVxc9GX+b++U89hFPlLaHmhIAQSCAQspxsR0v1iSee6LbZZpvEKjp35513uoEDB3ZIh3R/9dVXHdLikc8//zweLXj95ZdfFszL2kbaWB577DG3+uqrF2x76aWXdh9//LHPh1Sbpfqzzz4rWKdYXsFK1cgQqRaprsY+auY2QlYW/X9xvjvuuOPcN99808wQa2xCQAgEjkDIcrIdSfVqq63mbrjhhpK7bo899nBYejfYYAO3+eabuylTpvg6WIXJ23bbbX364osv7i6//PKoveWXX9598sknPv7yyy+7VVZZxa277rpu7bXXdkcddVRUDneMddZZx2288caub9++bvz48VFe8iJtLHfddZfbaKON3Pzzz+/69+8fWd2t7vbbb+969OjhXUOefvppB6nGEr/sssu6fv36uT59+rinnnrKirtx48Z5N5hNNtnEMYdbbrklyqvLhUi1SHVdNpo6yY3ARRdd5PgoCAEhIARqhYBIda2QrU27P/nJT9yLL75YtPERI0a44cOHR2XOOOMMt/POO/s4pLpLly7uwQcf9PF33nnHLbroou6DDz7wcUiukWrI6c033xy1s8MOO7jLLrvM4dNNnoV77rmnk5Xc8oqN5ZFHHilpqTafakg1hHnGjBm+6dNPP93tuuuu/vrZZ591iyyySDSHN99805P1uj7EKVItUm2bvlW/Q1YWPKiIlRpr9QMPPNCqS6R5CQEh0GAEQpaT7Wipnm+++dzf/va3orsGtwmIpQVOCYFIEyDVWK/jYbvttous1UaqIe4Q50mTJkWfP//5z26rrbbyVu855pjDnXPOOe61116LN9XputhYHnrooYJknIa6d+/ewad67NixUfv8U4ClmzBy5Ej3q1/9KhonY95tt93c1VdfHZWv+YVItUh1zTdZgzsIWVnY6R/4VR944IHyr27wXlL3QqBVEQhZTrYjqcYN46abbkrdjrhUELDaTp06tUMZTgrB3xhSzckh8TBs2DCH5ZdgpPq+++5zSyyxhCe9+GrbB3cPwr333uuwXEPyV1555YJ3VYuNpVxSHX9QkbpGqvfdd19vxbYx2veYMWP8WOvx5+Nnbwv3jGrO19Y51fXYJmH3EbKyMFLNCmCpln912HtRoxcCzYpAyHKyHUn1ySef7AYNGtRpO0GC8UEm4Cf91ltvRWWSlmp8rOOBI+3Mqmuk+rnnnnMrrLBCvJj78MMPowcfX3311SiPhySxhJurRpRRYiylSDVWbmszefpHnFRjpcbHOx7+8Y9/uB9++CGeVLPrF154wV11+giR6mP+FIy1OrkZdE51EpGUeMjKIk6qmZr8q1MWWElCQAhUjEDIcrIdSfXXX3/tIJv4SRtphAAvt9xy7re//a3fD0cccYTjY+Gss86KiLj5VOOHTHj99dfdkksuGflRG6kmb7HFFnM33nijNeP22Wcf72ZBf0sttZSbNm2az+Nc6znnnNN9++23UVm7KDaWUqSaByDx+SYUI9WPPvqo69mzp5s4caIvi/tHt27d3JNPPmnDqNk3d5PB18n9IxhCrTcq5vw5hKwskqRa/tU5N4GqCQEhUBSBkOVkO5JqFhPLKG4YWKZx0cDF4qSTTuqwzjyYuMYaa/hyuEPY0XSQ6gEDBrjNNtvMf6gbJ86QZXtQ8S9/+Ys/bQMf7PXWW8/tuOOOUR/cPV111VXdFlts4U8IKfZQfaGxYF3nBJFCAb/oueaay91xxx2dSPX999/vXT6sLieDgAfjwRfc/sGw/Fp8G6H2p3SJVItU12KTNVObISuLJKkGV/lXN9Pu0liEQGsgELKcbFdSbTuPY/LMOmtp8W/Ol06e2wyp5gg7wkcffRQvXvAako2FPC1kbSNtLGntJdO+//77ZFLReNbxFG0kQyZEGgu1J9SUF6kWqc6wb4IuErKySCPVLIb8q4Pekhq8EGg6BEKWk+1OqvNspjipzlNfdZwn0hBqDF1REKkWqY42Q4tehKwsCpFqlkr+1S26YTUtIdAABEKWkyLV5W8YDDP4RivkR4BTSPBF7xBEqkWqO2yIFoyErCyKkWr5V7fgZtWUhECDEAhZTopUN2jTtHG3EGqs/Z2CSLVIdadN0WIJISuLYqSaZZJ/dYttVk1HCDQIgZDlpEh1gzZNm3aLlZ9PahCpFqlO3RgtlBiysihFqlkm+Ve30GbVVIRAgxAIWU6KVDdo07Rht1in4y+f6QSBSLVIdadN0WIJISuLLKSa5ZJ/dYttWk1HCNQZgZDlpEh1nTdLm3aH/3RRQt2muHDec6if5JLp5S9JRFLiISuLrKRa/tUpC68kISAEMiMQspwUqS68zEOHDnW8lKWagZe18EpwC88//7xdVvxN27/4xS8qbqfaDXQ4i7pY47JUB0Wwk0spUp1EJCUesrLISqqZtvyrUxZfSUJACGRCIGQ5KVJdeImHDBlSdVL9yCOPuL322st3ylsMN9poo8IDKDPnsccec7xkppkCL8zpcBZ1scGJVItUF9sfrZAXsrIoh1SzVvKvboUdqzkIgfojELKcbFdSPXPmzFkvHXHOzZgxo0O82C766quvUrM///zz1HQSp06d2ikPH+NKSDUvdYm/UKYQqU6+vCY+kEJjLlYnXr/Ytb3cxd5EWayszxOpFqkuuUkCLxCysiiXVLNU8q8OfMNq+EKgAQiELCfbjVSvssoq7owzznCrr766W3TRRd2IESPcmDFj/OvIe/Xq5Y488shoB/GqbnvdOPV4bTevBF9sscXclltuGZV7+umn3XLLLedfQ77aaqu5UaNGRXn77befu+6669z888/v1l57bYelGmvy5MmTPaGm3rrrruvGjh3rX4ceVXTObb311u7yyy+PJ0XXvH6cerRFOUKSVB9zzDG+T4j7Msss444++uio/vHHH+/nwqva+/bt68aPH+/z7r77brfSSiv5sYDRscceG9Up96LTy11KNSBSLVJdao+Enh+ysshDquVfHfqO1fiFQP0RCFlOthup7tGjhxs9erTfJLyOu1u3bp5kk/D++++7BRdc0P3www8+HyJspHr22WePypG53nrrueuvv96X6927t7v99tv9NXXXX399d+211/r4gQce6DbddFOHRRjSGye+kHGzVFNvrrnmivrDsj3ffPP5NpJ/8JsePnx4lMz1CSec0KHt++67z6266qpRmX/9619uzjnn9JZt5sk/DBbuueceN3DgQB+FSJuf9/Tp030b7777rhXN/M1DiS+88ELm8r6gSLVIdXk7JrzSISuLPKSaFZJ/dXj7VCMWAo1EIGQ52W6keoEFFnBvv/12tF0g0R988EEUh2R/+eWXPh4n1RBSSLiFgw8+2F144YWegMbJK/mQ7R122MEXHTZsmDv11FOtWgfi+/DDD0ekmgI8wPi73/3Ol8VCfdBBB0X14hd9+vRxr776apTEfHADiRN2Mr/44gtfBjcRCPwcc8zhLeRTpkzx1+ecc4577bXXona4GDRokGPMEyZM6JBeTqTgy11KNSJSLVJdao+Enh+ysshLqlkz+VeHvnM1fiFQPwRClpPtSKrN+swOgWTH4927d08l1XPPPXcH/+VDDjnEXXDBBQ4rL5boeDAXD9IgqBdffHGUHSe+SVKN3sFSTMCNhPy0sNBCC3nLdzIv3jZ5WLCXWmopt9ZaazlOMpltttk8qSbv3nvv9cQfa/jKK6/sXR9JB4vDDz/cu4SABf88lBPwEzdXknLq+bIi1SLVZW+awCqErCwqIdUsk/yrA9usGq4QaBACIctJkerKSDWu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18k9IFKdRCQlHrKyEKlOWdCcSW25D2Spzrlb2q9ayL8Pker2269NO2OR6jaxVDftDtTAhIAQEAJCQAgIASEgBIRAYxHIbqlu7DjVuxAQAkJACAgBISAEhIAQaFoERKqbdmk0MCEgBISAEBACQkAICIFQEBCpDmWlNE4hIASEgBAQAkJACAiBpkVApLppl0YDEwJCQAgIASEgBISAEAgFAZHqUFZK4xQCQkAICAEhIASEgBBoWgSqSqqnT5/uJk+e3LST1cCEgBAQAkKgcQhIRzQOe/UsBIRA7RGoCqn++9//7gYPHuzmmGMO16VLFzfvvPO6/fff302ZMqXoDEaOHOkOPfRQh6DNEg477DB39NFHZylatMxDDz3kaOuaa64pWs4yf/nLX7qDDjrITZ061ZKKfn/55ZduxowZRctUI7Ne/VRjrGpDCAiB9kVAOqLj2tdLdtern46zU0wItC8CFZPqr776yvXp08eT6d12282NHj3aE2zI9brrrlsU2X333df95Cc/cdOmTStazjJ79erltthiC4vm/uYV1YwvK6k+8MADffkspPq8885z3bt3d19//XXu8WWpWK9+soxFZYSAEBAChRCQjuiITL1kd7366Tg7xYRAeyNQManGcgxBPeusszogecwxx/j0Cy64oEM6kc8++8ynvfvuu27ixImd8j///PNOaSS8//777r333kvNszaTmd9//71LtpeVVFu9QqSaPpMW6YMPPtjPm37jIW0clv/tt9+6L774wqKdvtPmVqifTpWVIASEgBBoIALSER3vWhaS3dIRDdyk6loIVAmBikn1Msss42abbbZOw5k0aZInl5tuuqnPQ5Bg0f7Vr37l04877jj385//3C288MKRpfr66693Cy20kM8fOHCgGzVqlFt00UWjtnv27Om22morH3/wwQfdfPPN5+65557IUr7sssu6v/zlL1F5XFIg/Hx+/OMfR8S/FKm+8cYbXe/evX29jTfe2CVJ9SmnnBK1S9tY6Aljx45188wzj8/r0aOHu++++3x6oXF88MEHrn///lFbYAEGFi677DI/R/pg7r///e99VqF+rJ6+hYAQEALNgoB0hHREs+xFjUMI1BqBikk1hG/55ZdPHefcc8/tllpqKZ83bNgwTx4HDBjgxowZ455//nl3wAEH+DTcPz799FN/3a9fP/foo4+6K6+80i222GI+zRrHVztOqul7zTXXdPfff7+76qqrfNmf/exnvvhJJ53k4zfddJN76qmn3HrrrecJL5nFSDV+4DanCRMmeBcR4nxw//i///s/t+CCC7qjjjrKPffcc+7EE0/0effee6+7/PLL3eGHH+7jF154oSfVxcYBJvPPP7978cUX3Ztvvukg8JBsAvjQ53777ef7GTp0qI9j3U/rx1fSHyEgBIRAkyFg8jRtWNIR9znpiLSdoTQhECYCNSfVSy65pEfGSPWzzz4bIRUn1ViHEb7XXXddlL/tttv6NEtII9Vnn322ZXv/bLOMWyK31J544gmH/zbtE4qR6ttuu82Xg9RbsHHEfapnzpzpXn/9dQd5pl3IO8HmmfSpThsHDz9SF4v91Vdf7duzPrHSk/fRRx95FxNcX4jTX7F+rL6+hYAQEALNgAByq5jhRTri36skHdEMu1VjEAKVIVAxqV566aU92UsOA9cGhOkmm2zis4xsxv2D46T6oosu8uVx67Bg1lmLp5FqyKgFXC6MVGP5xao911xzubXXXtvtuOOO0TiLkWpcLhg3biUWjPwaqcYavcACCzhua3LKCeX/8Ic/+OI2TyPVxcbx4YcfukGDBvn6tMFnzz339O1goSbOnO3DXOz0k2Q/NlZ9CwEhIASaCQHpCOmIZtqPGosQqCUCFZNqjpuD/J155pkdxol7BOnnnHOOTzcSyEN5FuKk+o9//KMvj7+whQ033NCnWTyNVF977bWW7eKkeptttvGuFZB7gpFUrouR6ttvv933eemll0bt0hZzgVSbmwkWbQJ+0+QxfoLN85tvvvHxYuOgAKQb15ebb77ZDRkyxLeFZd0e9MQ3nYAVA+u4hWQ/lq5vISAEhEAzISAdIR3RTPtRYxECtUSgYlL9ySef+IcJIZZ77LGHO+200yKrMP7OFowEFiLVEEZIM0fsQcQPOeQQ17VrV08yrY1ySDWEfPbZZ/f+yvhU86AfYyQUI9XfffedL9e3b19PmCHX9tAipBrSTzukY2neeeedfdzcP8ynGpKNn3WxcWy99da+LuPBvePYY4/18TfeeMM9/vjj/hprPXHymM9dd93l55DsxzDStxAQAkKgmRCQjpCOaKb9qLEIgVoiUDGpZnD4Fm+33XaeBEI4OQ0Egv3xxx9HY4dUY0mOk2p8iUmzc6px/VhppZU8mYZM7rXXXr5Na4SHHuMPKkKy42dNk2/uH+PHj/fnRTMeCPK4ceM8aecBQMguZ0nH61offGOF7tatm+8bUsyDlZSHVEO6N9hgA5/HSR+QbP4RgPQSbrnllggH/LKLjYPjBLfccsuoPCeUnHvuudFQ+OeCNObAh4ciLST7sXR9CwEhIASaDQHpCOmIZtuTGo8QqAUCVSHVNjBIJ0Qx6xsSrR7fnICBfzQnbljYZZddPKm0eJ5vc5/IU7fYK9eL5UG8cemIh2LjwP+6WD4PK6aFtH7SyilNCAgBIdAMCEhH/HsV0mR3MR0gHdEMu1djEAKlEagqqS7dXeESCI0555zTW2R5GM/OhrYzoAvXVI4QEAJCQAi0OgLSEa2+wpqfEAgfgaYh1UDJ+dR7772390Pm1BBeEJN8Y2H4kGsGQkAICAEhkAcB6Yg8qKmOEBAC9UKgqUh1vSatfoSAEBACQkAICAEhIASEQDUREKmuJppqSwgIASEgBISAEBACQqAtERCpbstl16SFgBAQAkJACAgBISAEqomASHU10VRbQkAICAEhIASEgBAQAm2JgEh1Wy67Ji0EhIAQEAJCQAgIASFQTQT+H69Ni8u22s8BAAAAAElFTkSuQmCC"}}},{"cell_type":"code","source":"# Class count\ncount_class_0, count_class_1 = df_train.target.value_counts()\ncount_class_0\n","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:55.596018Z","iopub.execute_input":"2021-05-25T10:48:55.596313Z","iopub.status.idle":"2021-05-25T10:48:55.614804Z","shell.execute_reply.started":"2021-05-25T10:48:55.596283Z","shell.execute_reply":"2021-05-25T10:48:55.613591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"count_class_1 ","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:55.616051Z","iopub.execute_input":"2021-05-25T10:48:55.616359Z","iopub.status.idle":"2021-05-25T10:48:55.62125Z","shell.execute_reply.started":"2021-05-25T10:48:55.61633Z","shell.execute_reply":"2021-05-25T10:48:55.620377Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sincere = df_train[df_train.target == 0]\ninsincere = df_train[df_train.target == 1]","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:55.623766Z","iopub.execute_input":"2021-05-25T10:48:55.624064Z","iopub.status.idle":"2021-05-25T10:48:55.805912Z","shell.execute_reply.started":"2021-05-25T10:48:55.624035Z","shell.execute_reply":"2021-05-25T10:48:55.804843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Undersampling over this dataset ","metadata":{}},{"cell_type":"code","source":"sincere_under = sincere.sample(count_class_1)\ndf_train_sampled = pd.concat([sincere_under,insincere], axis=0)\nprint('Random under-sampling:')\nprint(df_train_sampled.target.value_counts())\n\ndf_train_sampled.target.value_counts().plot(kind='bar', title='Count (target)');\n","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:55.80797Z","iopub.execute_input":"2021-05-25T10:48:55.8083Z","iopub.status.idle":"2021-05-25T10:48:56.058038Z","shell.execute_reply.started":"2021-05-25T10:48:55.80827Z","shell.execute_reply":"2021-05-25T10:48:56.057081Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#from sklearn.utils import resample\n\n#sincere = df_train[df_train.target == 0]\n#insincere = df_train[df_train.target == 1]\n#df_train_sampled = pd.concat([resample(sincere,replace = True,n_samples = len(insincere)*4), insincere])\n#df_train_sampled","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:56.059406Z","iopub.execute_input":"2021-05-25T10:48:56.059734Z","iopub.status.idle":"2021-05-25T10:48:56.063631Z","shell.execute_reply.started":"2021-05-25T10:48:56.059704Z","shell.execute_reply":"2021-05-25T10:48:56.062701Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# some visulaization ","metadata":{}},{"cell_type":"code","source":"from wordcloud import WordCloud, STOPWORDS\nstop_words = set(STOPWORDS)","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:56.064782Z","iopub.execute_input":"2021-05-25T10:48:56.065067Z","iopub.status.idle":"2021-05-25T10:48:56.076438Z","shell.execute_reply.started":"2021-05-25T10:48:56.065041Z","shell.execute_reply":"2021-05-25T10:48:56.075706Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Word cloud of sincere questions: \")\nsincere_wordcloud = WordCloud(width=700, height=500, background_color='white', min_font_size=10).generate(str(df_train[df_train[\"target\"] == 0][\"question_text\"]))\nplt.figure(figsize=(10,9), facecolor=None)\nplt.imshow(sincere_wordcloud)\nplt.axis(\"off\")\nplt.tight_layout(pad=0)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:56.077674Z","iopub.execute_input":"2021-05-25T10:48:56.077967Z","iopub.status.idle":"2021-05-25T10:48:56.769268Z","shell.execute_reply.started":"2021-05-25T10:48:56.07794Z","shell.execute_reply":"2021-05-25T10:48:56.768528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Word cloud of insincere question: \")\ninsincere_wordcloud = WordCloud(width=700, height=500, background_color='white', min_font_size=10).generate(str(df_train[df_train[\"target\"] == 1][\"question_text\"]))\nplt.figure(figsize=(10,9), facecolor=None)\nplt.imshow(insincere_wordcloud)\nplt.axis(\"off\")\nplt.tight_layout(pad=0)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:56.770254Z","iopub.execute_input":"2021-05-25T10:48:56.770668Z","iopub.status.idle":"2021-05-25T10:48:57.414232Z","shell.execute_reply.started":"2021-05-25T10:48:56.770637Z","shell.execute_reply":"2021-05-25T10:48:57.413362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"ratio = (df_train.target.sum() / df_train.shape[0]) * 100\nprint(\"Insincere question ratio: \", ratio)","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:57.415448Z","iopub.execute_input":"2021-05-25T10:48:57.415757Z","iopub.status.idle":"2021-05-25T10:48:57.422704Z","shell.execute_reply.started":"2021-05-25T10:48:57.415728Z","shell.execute_reply":"2021-05-25T10:48:57.421376Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocessing","metadata":{}},{"cell_type":"markdown","source":"# data cleaning and converting to vectors","metadata":{}},{"cell_type":"code","source":"import nltk\nimport string\nfrom nltk.tokenize import word_tokenize\nfrom nltk.corpus import stopwords\nfrom nltk.stem import WordNetLemmatizer\n\nnltk.download('stopwords')\nnltk_stopwords = stopwords.words('english')\n\nwordnet_lemmatizer = WordNetLemmatizer()\n\ndef lemSentence(sentence):\n    token_words = word_tokenize(sentence)\n    lem_sentence = []\n    for word in token_words:\n        lem_sentence.append(wordnet_lemmatizer.lemmatize(word, pos=\"v\"))\n        lem_sentence.append(\" \")\n    return \"\".join(lem_sentence)\n\ndef clean_text(message, lem=True):\n    # Remove ponctuation\n    message = message.translate(str.maketrans('', '', string.punctuation))\n    \n    # Remove numbers\n    message = message.translate(str.maketrans('', '', string.digits))\n    \n    # Remove stop words\n    message = [word for word in word_tokenize(message) if not word.lower() in nltk_stopwords]\n    message = ' '.join(message)\n    \n    # Lemmatization (root of the word)\n    if lem:\n        message = lemSentence(message)\n    \n    return message","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:57.424357Z","iopub.execute_input":"2021-05-25T10:48:57.424797Z","iopub.status.idle":"2021-05-25T10:48:57.438386Z","shell.execute_reply.started":"2021-05-25T10:48:57.424752Z","shell.execute_reply":"2021-05-25T10:48:57.437587Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.feature_extraction.text import TfidfVectorizer\nvectorizer = TfidfVectorizer(stop_words=\"english\",\n                             preprocessor=clean_text,\n                             ngram_range=(1, 3))\nX = vectorizer.fit_transform(df_train_sampled['question_text'])\nx = vectorizer.transform(df_test['question_text'])","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:48:57.440342Z","iopub.execute_input":"2021-05-25T10:48:57.4422Z","iopub.status.idle":"2021-05-25T10:53:08.08357Z","shell.execute_reply.started":"2021-05-25T10:48:57.442166Z","shell.execute_reply":"2021-05-25T10:53:08.08236Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Build model","metadata":{}},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_test, y_train, y_test = train_test_split(X, df_train_sampled['target'], test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:53:08.085271Z","iopub.execute_input":"2021-05-25T10:53:08.085724Z","iopub.status.idle":"2021-05-25T10:53:08.129305Z","shell.execute_reply.started":"2021-05-25T10:53:08.085677Z","shell.execute_reply":"2021-05-25T10:53:08.128329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import f1_score, accuracy_score, classification_report\n\n# calculate f1-score\ndef get_f1(model, name):\n    y_train_pred, y_pred = model.predict(X_train), model.predict(X_test)\n    print(classification_report(y_test, y_pred), '\\n')\n    print('{} model with F1 score = {}'.format(name, f1_score(y_test, y_pred)))","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:53:08.131003Z","iopub.execute_input":"2021-05-25T10:53:08.131455Z","iopub.status.idle":"2021-05-25T10:53:08.138302Z","shell.execute_reply.started":"2021-05-25T10:53:08.131388Z","shell.execute_reply":"2021-05-25T10:53:08.137584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# XGBoost Classifier without weigths","metadata":{}},{"cell_type":"code","source":"from xgboost import XGBClassifier\nimport xgboost as xgb1\nxgb1 = xgb1.XGBClassifier(objective=\"binary:logistic\")\nxgb1.fit(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2021-05-25T11:01:57.706193Z","iopub.execute_input":"2021-05-25T11:01:57.706664Z","iopub.status.idle":"2021-05-25T11:03:24.614396Z","shell.execute_reply.started":"2021-05-25T11:01:57.706624Z","shell.execute_reply":"2021-05-25T11:03:24.6136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_f1(xgb1, 'XGBClassifier')","metadata":{"execution":{"iopub.status.busy":"2021-05-25T11:05:03.08542Z","iopub.execute_input":"2021-05-25T11:05:03.086035Z","iopub.status.idle":"2021-05-25T11:05:05.504534Z","shell.execute_reply.started":"2021-05-25T11:05:03.085997Z","shell.execute_reply":"2021-05-25T11:05:05.503436Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# XGBoost Classifier with weigths","metadata":{}},{"cell_type":"code","source":"ratio = ((len(y_train) - y_train.sum()) - y_train.sum()) / y_train.sum()\nratio","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:54:38.548847Z","iopub.execute_input":"2021-05-25T10:54:38.549125Z","iopub.status.idle":"2021-05-25T10:54:38.556513Z","shell.execute_reply.started":"2021-05-25T10:54:38.549098Z","shell.execute_reply":"2021-05-25T10:54:38.555655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import xgboost as xgb\nxgb = xgb.XGBClassifier(objective=\"binary:logistic\", scale_pos_weight=ratio)\nxgb.fit(X_train, y_train)\nget_f1(xgb, 'XGBClassifier')","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:54:38.557728Z","iopub.execute_input":"2021-05-25T10:54:38.558029Z","iopub.status.idle":"2021-05-25T10:55:48.448901Z","shell.execute_reply.started":"2021-05-25T10:54:38.558001Z","shell.execute_reply":"2021-05-25T10:55:48.447936Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# LGBM with weights ","metadata":{}},{"cell_type":"code","source":"import lightgbm as lgb\nlgb = lgb.LGBMClassifier(n_jobs = -1, class_weight={0:y_train.sum(), 1:len(y_train) - y_train.sum()})\nlgb.fit(X_train, y_train)\nget_f1(lgb, 'LGBM weighted')","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:55:48.451715Z","iopub.execute_input":"2021-05-25T10:55:48.452006Z","iopub.status.idle":"2021-05-25T10:56:20.825523Z","shell.execute_reply.started":"2021-05-25T10:55:48.451978Z","shell.execute_reply":"2021-05-25T10:56:20.8245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Result","metadata":{}},{"cell_type":"code","source":"model = xgb1\nsubmission = pd.read_csv(\"../input/quora-insincere-questions-classification/sample_submission.csv\")\npreds = model.predict(x)\n#preds\nsubmission.loc[:, 'prediction'] = preds\nsubmission","metadata":{"execution":{"iopub.status.busy":"2021-05-25T11:05:39.209762Z","iopub.execute_input":"2021-05-25T11:05:39.210157Z","iopub.status.idle":"2021-05-25T11:05:43.127387Z","shell.execute_reply.started":"2021-05-25T11:05:39.210123Z","shell.execute_reply":"2021-05-25T11:05:43.126388Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from lightgbm import *\nmodel1 = lgb\npred_lgb = model1.predict(x)\n#preds\nsubmission.loc[:, 'prediction'] = pred_lgb\nsubmission","metadata":{"execution":{"iopub.status.busy":"2021-05-25T10:56:23.341004Z","iopub.execute_input":"2021-05-25T10:56:23.341308Z","iopub.status.idle":"2021-05-25T10:56:32.748972Z","shell.execute_reply.started":"2021-05-25T10:56:23.341278Z","shell.execute_reply":"2021-05-25T10:56:32.748214Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# #Final Interpretation:-\n \n 1. xgb without weight :-accuracy is 0.83\n 2. xgb with weights :-accuracy is 0.50\n 3. lgb :-accuracy is 0.82\n    \n     prediction values for test data seem to be more accurate by xgb without weight.","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}