{"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":"markdown","source":"# Thêm các thư viện","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd \nimport matplotlib.pyplot as plt\n\nimport re\nimport nltk\nimport string\nfrom unidecode import unidecode\nfrom nltk.tokenize import word_tokenize\nfrom nltk.corpus import stopwords\nfrom nltk.stem import WordNetLemmatizer\n\nfrom sklearn.feature_extraction.text import CountVectorizer\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import accuracy_score, f1_score,recall_score, classification_report, confusion_matrix\nfrom sklearn.model_selection import train_test_split","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-01-08T02:17:19.277854Z","iopub.execute_input":"2022-01-08T02:17:19.278585Z","iopub.status.idle":"2022-01-08T02:17:20.776644Z","shell.execute_reply.started":"2022-01-08T02:17:19.278392Z","shell.execute_reply":"2022-01-08T02:17:20.775731Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mô tả bài toán\n* **Mục tiêu:** Phân loại các câu hỏi trên Quora là toxic hay non-toxic\n* **Input:** Câu hỏi tiếng anh được cho dưới dạng text\n* **Output:** 0/1 (non-toxic/toxic)","metadata":{}},{"cell_type":"markdown","source":"# Phân tích dữ liệu\n# 1. Lấy dữ liệu của Quora","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv(\"../input/quora-insincere-questions-classification/train.csv\")\ntest_data = pd.read_csv(\"../input/quora-insincere-questions-classification/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:20.779892Z","iopub.execute_input":"2022-01-08T02:17:20.780531Z","iopub.status.idle":"2022-01-08T02:17:26.063469Z","shell.execute_reply.started":"2022-01-08T02:17:20.780488Z","shell.execute_reply":"2022-01-08T02:17:26.062470Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. Tập train\nDữ liệu gồm 3 giá trị: qid, question_text, target\n* qid: unique id của câu hỏi\n* question_text: câu hỏi cần phân loại được cho dưới dạng text\n* target: label 0/1 của câu hỏi (non-toxic/toxic)\n\n\nKhi phân loại, ta dùng question_text là đầu vào X, target là label y","metadata":{}},{"cell_type":"code","source":"train_data","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.066094Z","iopub.execute_input":"2022-01-08T02:17:26.066464Z","iopub.status.idle":"2022-01-08T02:17:26.093743Z","shell.execute_reply.started":"2022-01-08T02:17:26.066422Z","shell.execute_reply":"2022-01-08T02:17:26.092619Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Kiểm tra tập train","metadata":{}},{"cell_type":"code","source":"train_data.info()","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.095513Z","iopub.execute_input":"2022-01-08T02:17:26.095827Z","iopub.status.idle":"2022-01-08T02:17:26.378820Z","shell.execute_reply.started":"2022-01-08T02:17:26.095783Z","shell.execute_reply":"2022-01-08T02:17:26.377720Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Lấy ra câu có nhãn 0\nnon_toxic_data = train_data[train_data.target == 0]\n# Lấy ra câu có nhãn 1\ntoxic_data = train_data[train_data.target == 1]","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.382696Z","iopub.execute_input":"2022-01-08T02:17:26.382945Z","iopub.status.idle":"2022-01-08T02:17:26.492629Z","shell.execute_reply.started":"2022-01-08T02:17:26.382914Z","shell.execute_reply":"2022-01-08T02:17:26.491644Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Quan sát một số câu hỏi có nhãn 0 (non-toxic)","metadata":{}},{"cell_type":"code","source":"# Lấy mẫu 5 câu hỏi nhãn 0\nfor sentence in non_toxic_data.question_text.sample(5):\n    print(sentence)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.494567Z","iopub.execute_input":"2022-01-08T02:17:26.494870Z","iopub.status.idle":"2022-01-08T02:17:26.532702Z","shell.execute_reply.started":"2022-01-08T02:17:26.494802Z","shell.execute_reply":"2022-01-08T02:17:26.531591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Quan sát một số câu hỏi có nhãn 1 (toxic)","metadata":{}},{"cell_type":"code","source":"# Lấy mẫu 5 câu hỏi nhãn 1\nfor sentence in toxic_data.question_text.sample(5):\n    print(sentence)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.534137Z","iopub.execute_input":"2022-01-08T02:17:26.535030Z","iopub.status.idle":"2022-01-08T02:17:26.547207Z","shell.execute_reply.started":"2022-01-08T02:17:26.534987Z","shell.execute_reply":"2022-01-08T02:17:26.546030Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Kiểm tra phân bố dữ liệu","metadata":{}},{"cell_type":"code","source":"# Pie chart biểu diện tỉ lệ câu hỏi\nlabels = 'Non-toxic', 'Toxic'\nsizes = [\n    (non_toxic_data.shape[0]/train_data.shape[0])*100,\n    (toxic_data.shape[0]/train_data.shape[0])*100\n]\nplt.pie(sizes, labels=labels, autopct=\"%.2f%%\", startangle=180)\nplt.axis('equal')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.549035Z","iopub.execute_input":"2022-01-08T02:17:26.549441Z","iopub.status.idle":"2022-01-08T02:17:26.680794Z","shell.execute_reply.started":"2022-01-08T02:17:26.549396Z","shell.execute_reply":"2022-01-08T02:17:26.679852Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Tập test\nDữ liệu gồm 2 giá trị: qid, question_text\n* qid: unique id của câu hỏi\n* question_text: câu hỏi cần phân loại được cho dưới dạng text","metadata":{}},{"cell_type":"code","source":"test_data","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.682387Z","iopub.execute_input":"2022-01-08T02:17:26.683163Z","iopub.status.idle":"2022-01-08T02:17:26.697165Z","shell.execute_reply.started":"2022-01-08T02:17:26.683123Z","shell.execute_reply":"2022-01-08T02:17:26.695892Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Kiểm tra tập test","metadata":{}},{"cell_type":"code","source":"test_data.info()","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.699333Z","iopub.execute_input":"2022-01-08T02:17:26.699665Z","iopub.status.idle":"2022-01-08T02:17:26.795982Z","shell.execute_reply.started":"2022-01-08T02:17:26.699621Z","shell.execute_reply":"2022-01-08T02:17:26.794908Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4. Nhận xét\n* Dữ liệu không có giá trị null\n* Tập train: 1306122 dòng x 3 cột (qid, question_text, target)\n* Tập test: 375806 dòng x 2 cột (qid, question_text)\n* Trong dữ liệu train có tới 93.81% câu hỏi đánh nhãn 0 mà chỉ có 6.19% câu hỏi đánh nhãn 1 => Mất cân bằng về dữ liệu. Đó là lý do mà đề yêu cầu đánh giá bằng F1 Score\n\n\n![image.png](attachment:2de04f62-a0a5-4db3-9146-eb5e628d1e4a.png)","metadata":{},"attachments":{"2de04f62-a0a5-4db3-9146-eb5e628d1e4a.png":{"image/png":"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r4QQjFbDGruIIRruD22rgCY+jz32WG1tLTqc4Gwzmczzzz+PQeMrVqyoqKhQKpUY54muKRfr/PtTpGghRwjheX716tUcx2HaHWTfvn3RaHTs2LEajQbTH30+n91u37lzJ5oBjBs3zul0kuwUSUJIR0eHxWJhWfbQoUP79+/XarV1dXVFRUUYjpGXlzds2LDnnnvut7/97fDhw2UyWSQSye1qAIeepjDgKG/YsEGv12NOJIZm2O12lUpFJ8Wck6BBAh180dTUVFFRcSb2JgaKw5+BA0YICYVCiKr7X+iEQVgENPlGn28KTCEI1uv1mEOZTCb37t178803U85q/9eJXSyRPP/882i/G4lEbr755uXLl1Ovd9euXU8++eRnn31WV1fndDqRGQ4EAn//+9+3bds2b968pUuXbtq06bLLLsOEDZgKNAN47bXXnnzyyb6+vk8++eTFF1+cNGkS2pZ6vd6ampovv/yS4zjMXEQLalA6gVGEQiHqf+t0uh07dsyePXvTpk2YQ/D222+vX7++vLwc64r2O8X1/J9mFctGo9HA9re2tj733HNKpbK8vPy0n/f7/W+88cbBgwcrKyuBSKBBx4V8COciQPoQDsF1xPOCex2NRkVRVCqVmNu0Y8eOe++9V6FQHD9+/LrrrkNWiBaMXaxL6E9hCSHoJrpq1aqamhqgbzCiFRUV1113ndFozM/Px1BnxOl//vOfb7311nQ6/eCDD3722WerV69WqVRGo9Hr9cKq7d27t6ur680333z//ff/9Kc/1dXV3X///YQQlUqVl5eXSCTuvvvuv/71r/B9AWikUik6PBdZt97eXuSWp06dqlAo5s+f/9BDD82dO/edd95ZuHDhxx9/TAjx+/2pVAqALnqI0QuD3cKfML0S3GhCCBosYUY6tiOQlTs7O71eL17AuaIjG00mk8FgSCQSAFvg2CAMoLgyhgLT/6LdRzQaRd5AyMpJgD1tlQagHZ8/yyoVs0O+sZloNBrAXwiQaGNLo9F49OjRUCh04MCB9evX33LLLfAP0anwLM5JJiv4odzMwznlGS4R+f9YRFNTU2lpKbxwijAAYKbupiiK69atq6ioKCkpgU6MHTu2qakJ04y0Wi0AqYKCgu9973vV1dUymaympmby5MmPPfYYIQSDgDUazciRI1taWo4ePYqGi2AqE0LoKCOpVFpYWAjL1NbWlkql6uvr0aCI5/mRI0fyPN/Y2FhcXAxo0u12ozk8ISSdTqOPDMdxNpsNI5oYhsEsG0IIy7KxWCwcDptMpssuu8zhcGBKcl5enlwu53m+tLQUJd+CINhstqeffpoQ4vf7TSZTaWlpMBgEoiyXy7u7uwsLC5EspLA6BIEHIaSjowNbDclp6kc/plAoENhgiPVZkMqzCzJfWD+Il7Zt21ZZWWmxWKqqqjCJnMZFZzkOmsxTBwbYaDqdPo9Q/lIQKSEE4O7u3btvuukmQgi4aQzDYGRELk4Xj8dXrlw5depUTMAghIwfP37x4sWzZ8+22WwGgwH6nTthEA8e+Qg6mAvWbv/+/VOmTEG2mQLemGQSDofpRMmPPvpozJgxo0ePRvu5np6ew4cPY4jM9u3bd+7cOXPmzMLCwvfeey8/P3/kyJGw+ps3b+7o6AgGg/fee29HR0dxcTHHcR9++GEikaiqqhozZkw6nd60adOxY8fq6+sxj2bv3r2NjY1A7keOHDl06NCWlpYjR474/f7bbrsNytrX19fe3t7W1kYIkcvlN954oyiKR48eXbNmzeWXXz558uRly5Zt3759xowZlJuKsORMkBwyR3TqDckOaqQ5ta8piFhojxGe57u7u+fNm2c0GmnXQuD3eI5n0nLMu8PWBIgG3x2gkKIUK763t/fIkSOPPPIIqkKgi8gpwh7g1icSiUOHDs2fP59mWJxO544dOwRBwPOA7mJJYGwVz/MnTpx49NFHcQQ0QYxEIkajsb29Hd2ssSrg2jI5kwMQP61atcpisaCv19KlSx944IGXX375Jz/5CSGktbX1+eefnzlz5p49e+bNm/f+++9fddVVAA2uvfbaGTNmYPbSmDFjNm3a9MUXX9TV1dXW1v7tb39zuVw33XSTXC6/5557XnzxxSFDhsRiseeee+7HP/7xsGHDnn/+eZvNNnz4cJ1Ot2LFCrvdDs+npaVlwYIFBQUF1113nc/nu+WWWwoLC8ePH5+Xl7d48WKe54cOHZpMJleuXGm1WidNmpRMJv1+v9Pp7O3t3bBhA73puVb8yiuvzMvLQ89LzGNgcprxfX2he0I4HM5kMjSJoVAoEEbT2X9wk86k38CyAJQh3REKhSKRCHaAASdSwHlut9vj8VgsFjTiRyaF/O/6Z3hgsVgMNgBeGsI19ORFN0QoN7bvdDq9c+dOu91+zz334BajDg8jtjByRafTwfZgxK1EIgkEAhhl1NfXl0wmOzs7586d+8c//tHr9Vqt1gceeOC+++4DiUClUplMpmg0Wl5evmHDhrKysg8//HDbtm1vvvmmzWZ7//33q6urCwsLt2/f/rvf/e6+++675pprkJNSKBQajWb06NHV1dU333yzQqHw+Xx79+5NJpNFRUWYN0AIKSoqamtrmz59OlT8scce02q1t9xyS0VFRUVFRVdX19q1a+vq6hC0FBcX+3y+adOm/fWvf8UEBaA98XjcYrFgYM2pcTCoUVBrjH+HvTxXigvP8xqNBjMEMZT1P/7jP3CTAcLSFD2sBtT9VKHT7EElUqlUBoPBZDINVPuNaCMSiaAxLsnhWpCcPAJ2T1T7AZVD6tHn81VXV+MJwXeMxWJwdpPJZHd3d0NDw8yZM00mExSLooFmsxm4DXrxE0LQt1wQBDQFZRjGZDK9++677e3t999/v9PpDAaDXq936NChCBICgUBPT4/JZMKosZKSEo7jli9fPnbsWJ7nN23a1Nzc/Ktf/cpoNK5bty4vL6+mpgYJyPvvv1+j0fT19b366qs2m624uDgajebn599///133XXXG2+8MXv2bFxLR0cHkPtMJnP8+PFPPvlk5cqVtbW1TU1N+fn5mNskCMKXX365a9eud9991+FwBINBt9tdXV1NCMF4Mdzoe+65h970XC2nY12j0eju3bvXr18PLsO5pkiRocNgE41GgwAaA9lQxoYxqtiI1Gr1mdYPQFgwFzKZTElJCTbASz+UPK18pcew1uDL57aNA2ZH04oKheKaa65xuVxAUjHMbuLEiRhmjhCE8v5aWlpcLteoUaPgieLGYU44TYXCOyeEwKZmMhnwsVKpFDrt7tq1y+FwOJ3OTCZjNBqNRiMN5rxe75IlSx588EGe5+Fz79mz59133z106FBzc7NKpZo/f35BQQHHcStWrHj00UeVSiVWJi7HZrMdPHjwu9/9LsdxyWQyHA7ffffd77///kcffTRhwgTYrU8++aSysvL666+XSCQff/xxbW1tfX19NBodOnToli1bUqlUXl5eMpns6upCYkWv1y9atMhisRQXFwN+AYfH5/MtWbKEnM5+T5s2Ta/XYzTeuHHjzGazXC7PHW79NSUYDCJChVuiVCoNBgNSb9iQcykPZyll9/l8Op0OqwL7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"}}},{"cell_type":"markdown","source":"# Tiền xử lý dữ liệu\nSử dụng công cụ nltk để tiền xử lý\n* Chuyển về dạng unicode\n* Chuyển về dạng viết thường\n* Bỏ dấu, chữ số và ký hiệu đặc biệt\n* Tách từ\n* Chuẩn hóa các từ viết tắt\n* Loại bỏ stopwords\n* Rút gọn từ\n* Vector hóa từ","metadata":{}},{"cell_type":"code","source":"# Từ điển chuẩn hóa từ viết tắt\ncontraction_dict = { \n\"ain't\": \"am not / are not / is not / has not / have not\",\n\"aren't\": \"are not / am not\",\n\"can't\": \"cannot\",\n\"can't've\": \"cannot have\",\n\"'cause\": \"because\",\n\"could've\": \"could have\",\n\"couldn't\": \"could not\",\n\"couldn't've\": \"could not have\",\n\"didn't\": \"did not\",\n\"doesn't\": \"does not\",\n\"don't\": \"do not\",\n\"hadn't\": \"had not\",\n\"hadn't've\": \"had not have\",\n\"hasn't\": \"has not\",\n\"haven't\": \"have not\",\n\"he'd\": \"he had / he would\",\n\"he'd've\": \"he would have\",\n\"he'll\": \"he shall / he will\",\n\"he'll've\": \"he shall have / he will have\",\n\"he's\": \"he has / he is\",\n\"how'd\": \"how did\",\n\"how'd'y\": \"how do you\",\n\"how'll\": \"how will\",\n\"how's\": \"how has / how is / how does\",\n\"I'd\": \"I had / I would\",\n\"I'd've\": \"I would have\",\n\"I'll\": \"I shall / I will\",\n\"I'll've\": \"I shall have / I will have\",\n\"I'm\": \"I am\",\n\"I've\": \"I have\",\n\"isn't\": \"is not\",\n\"it'd\": \"it had / it would\",\n\"it'd've\": \"it would have\",\n\"it'll\": \"it shall / it will\",\n\"it'll've\": \"it shall have / it will have\",\n\"it's\": \"it has / it is\",\n\"let's\": \"let us\",\n\"ma'am\": \"madam\",\n\"mayn't\": \"may not\",\n\"might've\": \"might have\",\n\"mightn't\": \"might not\",\n\"mightn't've\": \"might not have\",\n\"must've\": \"must have\",\n\"mustn't\": \"must not\",\n\"mustn't've\": \"must not have\",\n\"needn't\": \"need not\",\n\"needn't've\": \"need not have\",\n\"o'clock\": \"of the clock\",\n\"oughtn't\": \"ought not\",\n\"oughtn't've\": \"ought not have\",\n\"shan't\": \"shall not\",\n\"sha'n't\": \"shall not\",\n\"shan't've\": \"shall not have\",\n\"she'd\": \"she had / she would\",\n\"she'd've\": \"she would have\",\n\"she'll\": \"she shall / she will\",\n\"she'll've\": \"she shall have / she will have\",\n\"she's\": \"she has / she is\",\n\"should've\": \"should have\",\n\"shouldn't\": \"should not\",\n\"shouldn't've\": \"should not have\",\n\"so've\": \"so have\",\n\"so's\": \"so as / so is\",\n\"that'd\": \"that would / that had\",\n\"that'd've\": \"that would have\",\n\"that's\": \"that has / that is\",\n\"there'd\": \"there had / there would\",\n\"there'd've\": \"there would have\",\n\"there's\": \"there has / there is\",\n\"they'd\": \"they had / they would\",\n\"they'd've\": \"they would have\",\n\"they'll\": \"they shall / they will\",\n\"they'll've\": \"they shall have / they will have\",\n\"they're\": \"they are\",\n\"they've\": \"they have\",\n\"to've\": \"to have\",\n\"wasn't\": \"was not\",\n\"we'd\": \"we had / we would\",\n\"we'd've\": \"we would have\",\n\"we'll\": \"we will\",\n\"we'll've\": \"we will have\",\n\"we're\": \"we are\",\n\"we've\": \"we have\",\n\"weren't\": \"were not\",\n\"what'll\": \"what shall / what will\",\n\"what'll've\": \"what shall have / what will have\",\n\"what're\": \"what are\",\n\"what's\": \"what has / what is\",\n\"what've\": \"what have\",\n\"when's\": \"when has / when is\",\n\"when've\": \"when have\",\n\"where'd\": \"where did\",\n\"where's\": \"where has / where is\",\n\"where've\": \"where have\",\n\"who'll\": \"who shall / who will\",\n\"who'll've\": \"who shall have / who will have\",\n\"who's\": \"who has / who is\",\n\"who've\": \"who have\",\n\"why's\": \"why has / why is\",\n\"why've\": \"why have\",\n\"will've\": \"will have\",\n\"won't\": \"will not\",\n\"won't've\": \"will not have\",\n\"would've\": \"would have\",\n\"wouldn't\": \"would not\",\n\"wouldn't've\": \"would not have\",\n\"y'all\": \"you all\",\n\"y'all'd\": \"you all would\",\n\"y'all'd've\": \"you all would have\",\n\"y'all're\": \"you all are\",\n\"y'all've\": \"you all have\",\n\"you'd\": \"you had / you would\",\n\"you'd've\": \"you would have\",\n\"you'll\": \"you shall / you will\",\n\"you'll've\": \"you shall have / you will have\",\n\"you're\": \"you are\",\n\"you've\": \"you have\"\n}\n\n# Chuẩn bị bộ xử lý dữ liệu nltk\nnltk.download('stopwords')\nnltk.download('punkt')\nnltk.download('wordnet')\nsw = stopwords.words('english')\n\nsw.remove('not')\n\nlemma = WordNetLemmatizer()","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:17:26.797834Z","iopub.execute_input":"2022-01-08T02:17:26.798061Z","iopub.status.idle":"2022-01-08T02:18:26.919846Z","shell.execute_reply.started":"2022-01-08T02:17:26.798030Z","shell.execute_reply":"2022-01-08T02:18:26.917698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def normalize_text(text):\n    # Chuyển về dạng unicode \n    text = unidecode(text).encode(\"ascii\")\n    text = str(text, \"ascii\")\n\n    # Chuyển về dạng viết thường\n    text = text.lower()\n    \n    # Bỏ dấu, chữ số, ký hiệu đặc biệt\n    text = re.sub('https?://\\S+|www\\.\\S+', '', text)\n    text = re.sub('<.*?>+', '', text)\n    text = re.sub('[%s]' % re.escape(string.punctuation), '', text)  \n    text = re.sub('\\n', '', text)\n    text = re.sub('[’“”…]', ' ', text)  \n    text = ''.join(i for i in text if not i.isdigit())\n    \n    # Tách từ\n    tokens = word_tokenize(text)\n\n    # Chuẩn hóa các từ viết tắt\n    tokens = [contraction_dict.get(word) if (contraction_dict.get(word) != None) else word for word in tokens]\n\n    # Loại bỏ stopwords\n    tokens = [word for word in tokens if not word in sw]\n\n    # Rút gọn từ\n    tokens = [lemma.lemmatize(word, pos = \"v\") for word in tokens]\n    tokens = [lemma.lemmatize(word, pos = \"n\") for word in tokens]\n    text = ' '.join(tokens)\n\n    return text","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:18:26.921421Z","iopub.execute_input":"2022-01-08T02:18:26.921823Z","iopub.status.idle":"2022-01-08T02:18:26.933040Z","shell.execute_reply.started":"2022-01-08T02:18:26.921764Z","shell.execute_reply":"2022-01-08T02:18:26.931941Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Dữ liệu sau khi normalize","metadata":{}},{"cell_type":"code","source":"train_data['normalize'] = train_data['question_text'].apply(normalize_text)\ntrain_data","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:18:26.934992Z","iopub.execute_input":"2022-01-08T02:18:26.935726Z","iopub.status.idle":"2022-01-08T02:25:48.082329Z","shell.execute_reply.started":"2022-01-08T02:18:26.935556Z","shell.execute_reply":"2022-01-08T02:25:48.081393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = train_data['normalize']\ny = train_data['target']\n\n# Chia train_data thành 2 tập dữ liệu train và test (tỉ lệ 4:1)\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:25:48.086351Z","iopub.execute_input":"2022-01-08T02:25:48.086680Z","iopub.status.idle":"2022-01-08T02:25:48.442557Z","shell.execute_reply.started":"2022-01-08T02:25:48.086646Z","shell.execute_reply":"2022-01-08T02:25:48.441496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Vector hóa từ**\n\n\nSử dụng CountVectorizer để trích xuất các từ, biến words thành dạng vectors trên cơ sở tần suất (số lần xuất hiện) của các từ trong bộ dữ liệu.","metadata":{}},{"cell_type":"code","source":"# Khai báo hàm thực hiện\ncount_vectorizer = CountVectorizer(analyzer='word', ngram_range=(1,3))\n\n# Tiến hành tính toán trọng số của các từ trong tập huấn luyện\ncount_vectorizer.fit(X_train)\n\n# Biến đổi các câu trong tập train thành ma trận trọng số của vector hóa\ncv_X_train = count_vectorizer.fit_transform(X_train)\nprint(cv_X_train.shape)\ncv_X_test = count_vectorizer.transform(X_test)\nprint(cv_X_test.shape)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:25:48.444334Z","iopub.execute_input":"2022-01-08T02:25:48.444656Z","iopub.status.idle":"2022-01-08T02:28:14.268956Z","shell.execute_reply.started":"2022-01-08T02:25:48.444611Z","shell.execute_reply":"2022-01-08T02:28:14.267925Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Mô tả mô hình được chọn\n**Logistic Regression**\n* Một mô hình đơn giản, phổ biến cho bài toán phân lớp có phân bố Bernoulli:\n\\begin{align*}\n    Y|X = \\mathbf x \\sim Ber(y|\\sigma(f(\\mathbf x)))\n\\end{align*}\n* Sử dụng đầu ra:\n\\begin{align*}\n    f(\\mathbf x) = \\mathbf w^T\\mathbf x + w_0\n\\end{align*}\n* Sử dụng hàm logistic là sigmoid:\n\\begin{align*}\n    \\sigma(z) = \\frac 1 {1+e^{-z}}\n\\end{align*}\n* Huấn luyện bằng hàm lỗi:\n\\begin{align*}\n    L(\\mathbf w, w_0) &= P(D) = \\prod_{i=1}^n P(y_i|\\mathbf x_i) = \\prod_{i=1}^n \\mu_i^{y_i} (1-\\mu_i)^{1-y_i}\\\\\n    \\ell(\\mathbf w, w_0) &= -\\log L(\\mathbf w, w_0) = \\sum_{i=1}^n -y_i\\log\\mu_i - (1-y_i)\\log(1-\\mu_i)\\\\\n    \\nabla_{\\mathbf w} \\ell(\\mathbf w, w_0) &=\\sum_{i=1}^n (\\mu_i - y_i)\\mathbf x_i\\\\\n    \\nabla_{w_0} \\ell(\\mathbf w, w_0) &= \\sum_{i=1}^n (\\mu_i - y_i)\n\\end{align*}\nTrong đó: $\\mu_i = \\sigma(f(\\mathbf x_i)) = \\sigma(\\mathbf w^T\\mathbf x + w_0)$","metadata":{}},{"cell_type":"markdown","source":"# Thực nghiệm mô hình","metadata":{}},{"cell_type":"code","source":"# Khai báo mô hình\nmodel_LR = LogisticRegression(solver='liblinear', class_weight=\"balanced\")\n\n# Tiến hành huấn luyện\nmodel_LR.fit(cv_X_train, y_train)\n\n# Kết quả dự đoán\ny_pred_LR = model_LR.predict(cv_X_test)","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:28:14.270485Z","iopub.execute_input":"2022-01-08T02:28:14.271491Z","iopub.status.idle":"2022-01-08T02:32:17.990186Z","shell.execute_reply.started":"2022-01-08T02:28:14.271445Z","shell.execute_reply":"2022-01-08T02:32:17.989217Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Logistic Regression\\n\")\nprint('Recall: ', recall_score(y_pred_LR, y_test))\nprint('F1 score :', f1_score(y_pred_LR, y_test), '\\n')\nprint(classification_report(y_test, y_pred_LR))","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:32:17.992067Z","iopub.execute_input":"2022-01-08T02:32:17.992443Z","iopub.status.idle":"2022-01-08T02:32:18.555431Z","shell.execute_reply.started":"2022-01-08T02:32:17.992384Z","shell.execute_reply":"2022-01-08T02:32:18.554156Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"# normalize dữ liệu đầu vào\ntest_data['normalize'] = test_data['question_text'].apply(normalize_text)\n\n# vector hóa dữ liệu\nX_sub = count_vectorizer.transform(test_data['normalize'])\n\n# Kết quả dự đoán\ntest_data['prediction'] = model_LR.predict(X_sub)\n\ntest_data","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:32:18.557472Z","iopub.execute_input":"2022-01-08T02:32:18.557803Z","iopub.status.idle":"2022-01-08T02:34:34.244046Z","shell.execute_reply.started":"2022-01-08T02:32:18.557745Z","shell.execute_reply":"2022-01-08T02:34:34.243084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = test_data[['qid', 'prediction']]\nresult.to_csv('submission.csv', index=False)\nresult","metadata":{"execution":{"iopub.status.busy":"2022-01-08T02:34:34.245859Z","iopub.execute_input":"2022-01-08T02:34:34.246554Z","iopub.status.idle":"2022-01-08T02:34:35.179999Z","shell.execute_reply.started":"2022-01-08T02:34:34.246512Z","shell.execute_reply":"2022-01-08T02:34:35.179114Z"},"trusted":true},"execution_count":null,"outputs":[]}]}