{"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\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n%matplotlib inline","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-01-06T10:38:00.552883Z","iopub.execute_input":"2022-01-06T10:38:00.553312Z","iopub.status.idle":"2022-01-06T10:38:00.570152Z","shell.execute_reply.started":"2022-01-06T10:38:00.553274Z","shell.execute_reply":"2022-01-06T10:38:00.569246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Mô tả bài toán**\n**Input**: Dữ liệu dạng text câu hỏi\n\n**Output**: Phân loại các câu insincere và sincere có trên hệ thống của Quora","metadata":{}},{"cell_type":"markdown","source":"# **Phân tích dữ liệu**\n","metadata":{}},{"cell_type":"code","source":"data_train = pd.read_csv(\"../input/quora-insincere-questions-classification/train.csv\")\ndata_test = pd.read_csv(\"../input/quora-insincere-questions-classification/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:38:00.571849Z","iopub.execute_input":"2022-01-06T10:38:00.572062Z","iopub.status.idle":"2022-01-06T10:38:04.265511Z","shell.execute_reply.started":"2022-01-06T10:38:00.572035Z","shell.execute_reply":"2022-01-06T10:38:04.264581Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Tập dữ liệu train gồm 3 trường, trong đó:\n* **qid**: mã câu hỏi\n* **question_text**: nội dung câu hỏi\n* **target**: gồm hai giá trị \"insincere\" mang giá trị là 1 còn \"sincere\" là 0","metadata":{}},{"cell_type":"code","source":"data_train","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:38:04.266816Z","iopub.execute_input":"2022-01-06T10:38:04.267250Z","iopub.status.idle":"2022-01-06T10:38:04.283474Z","shell.execute_reply.started":"2022-01-06T10:38:04.267204Z","shell.execute_reply":"2022-01-06T10:38:04.282665Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Tập dữ liệu test gồm hơn 300 nghìn dòng","metadata":{}},{"cell_type":"code","source":"data_test","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:38:04.284765Z","iopub.execute_input":"2022-01-06T10:38:04.285092Z","iopub.status.idle":"2022-01-06T10:38:04.306448Z","shell.execute_reply.started":"2022-01-06T10:38:04.285050Z","shell.execute_reply":"2022-01-06T10:38:04.305329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Tính cân bằng của tập dữ liệu**\n\nTa xét tỷ lệ câu sincere và insincere trong tập dữ liệu train","metadata":{}},{"cell_type":"code","source":"# Mô phỏng về độ tương quan giữa các câu insincere và sincere dưới dạng biểu đồ:\nplt.figure(figsize=(7,5))\nax = sns.countplot(x='target', data=data_train)\ntotal = data_train.shape[0]\nfor p in ax.patches:\n    height = p.get_height()\n    ax.text(p.get_x() + p.get_width()/2., height + 3, '{0:.0%}'.format(height/total), ha=\"center\")\nplt.suptitle('Number of Sincere and Insincere Questions')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:38:04.309039Z","iopub.execute_input":"2022-01-06T10:38:04.309526Z","iopub.status.idle":"2022-01-06T10:38:04.583387Z","shell.execute_reply.started":"2022-01-06T10:38:04.309482Z","shell.execute_reply":"2022-01-06T10:38:04.582406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Ta thấy tỷ lệ giữa 2 loại câu hỏi khoảng 15:1. Đây là hiện tượng mất cân bằng nghiêm trọng dẫn tới kết quả dự báo kém chính xác trên nhóm thiểu số.\n\n**Xử lý mất cân bằng dữ liệu**\n\nKhi một bên chiếm đa số và bên còn lại thiểu số, hiển nhiên sẽ có 2 cách để làm cân bằng chúng:\n* Tăng số lượng bên thiểu số (Over sampling): thu thập thêm dữ liệu hoặc chấp nhận mẫu có trùng lặp.\n* Giảm số lượng bên đa số (Under sampling): cân bằng mẫu một cách nhanh chóng, dễ dàng tiến hành thực hiện nhưng kích thước mẫu sẽ giảm đáng kể.\n\nTa sử dụng phương pháp **Under sampling**: giảm bớt sự mất cân bằng (1:4) sao cho không ảnh hưởng đáng kể tới khả năng dự báo của mô hình.","metadata":{}},{"cell_type":"code","source":"from sklearn.utils import resample\n\nsincere = data_train[data_train.target == 0]\ninsincere = data_train[data_train.target == 1]\ndata_train_sampled = pd.concat([resample(sincere, replace = True, n_samples = len(insincere)*4), insincere])\ndata_train_sampled","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:38:04.585524Z","iopub.execute_input":"2022-01-06T10:38:04.585801Z","iopub.status.idle":"2022-01-06T10:38:05.013639Z","shell.execute_reply.started":"2022-01-06T10:38:04.585770Z","shell.execute_reply":"2022-01-06T10:38:05.013048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y = data_train_sampled['target']\ny.value_counts().plot(kind='bar', rot=0)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:38:05.014796Z","iopub.execute_input":"2022-01-06T10:38:05.015541Z","iopub.status.idle":"2022-01-06T10:38:05.154464Z","shell.execute_reply.started":"2022-01-06T10:38:05.015502Z","shell.execute_reply":"2022-01-06T10:38:05.153609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Mô tả thuật toán**\n## **1.Tiền xử lý dữ liệu**\nBước đầu tiên ta phải loại bỏ những tác nhân gây nhiễu hoặc không cần thiết, có thể gây ảnh hưởng đến kết quả:\n* Loại bỏ các tag HTML\n* Loại bỏ các dấu nháy đơn, nháy kép\n* Loại bỏ các số thực, số phức\n* Loại bỏ các kí tự La Mã\n* Thay thế các dấu, các kí tự đặc biệt với khoảng trắng\n* Đưa tất cả các chữ cái viết hoa, viết thường về dạng chung là viết thường","metadata":{}},{"cell_type":"code","source":"import re, string\n\ndef clean_text(text):\n\n  # Remove HTML Tags\n  text = re.sub(re.compile('<.*?>'), '', text)\n\n  # Remove [\\], ['], [\"]\n  text = re.sub(r'\\\\', '', text)\n  text = re.sub(r'\\\"', '', text)\n  text = re.sub(r'\\'', '', text)\n\n  # Remove number\n  text = re.sub('[0-9]{5,}','#####', text);\n  text = re.sub('[0-9]{4,}','####', text);\n  text = re.sub('[0-9]{3,}','###', text);\n  text = re.sub('[0-9]{2,}','##', text);\n\n  ## Remove Roman words\n  roman = re.compile(r'^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$');\n  text = roman.sub(r'', text);\n\n  # Convert all text to lowercase\n  text = text.strip().lower()\n\n  # Replace punctuation chars with spaces\n  filters = '!\"\\'#$%@&*()+_-;:<=>.?{}|`\\\\^\\t\\n'\n  translate_dict = dict((c, \" \") for c in filters)\n  translate_map = str.maketrans(translate_dict)\n  text = text.translate(translate_map)\n\n  return text","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:38:05.156225Z","iopub.execute_input":"2022-01-06T10:38:05.156746Z","iopub.status.idle":"2022-01-06T10:38:05.165067Z","shell.execute_reply.started":"2022-01-06T10:38:05.156697Z","shell.execute_reply":"2022-01-06T10:38:05.164219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## **2.Vector hóa dữ liệu**\n* Sử dụng CountVectorizer để trích xuất các từ, biến words thành dạng vectors ở dạng Bag-of-Words bằng cách đếm số lần xuất hiện của các từ trong bộ dữ liệu.\n* TF-IDF (Term Frequency – Inverse Document Frequency) là 1 kĩ thuật sử dụng trong khai phá dữ liệu văn bản. Trọng số này được sử dụng để đánh giá tầm quan trọng của một từ trong một văn bản. Giá trị cao thể hiện độ quan trọng cao và nó phụ thuộc vào số lần từ xuất hiện trong văn bản nhưng bù lại bởi tần suất của từ đó trong tập dữ liệu.\n\nTa chuyển đổi dữ liệu từ text sang thể hiện vector thông qua TfidfVectorizer.","metadata":{}},{"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(data_train_sampled['question_text'])\nx = vectorizer.transform(data_test['question_text'])","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:38:05.166384Z","iopub.execute_input":"2022-01-06T10:38:05.167112Z","iopub.status.idle":"2022-01-06T10:39:06.894579Z","shell.execute_reply.started":"2022-01-06T10:38:05.167068Z","shell.execute_reply":"2022-01-06T10:39:06.893618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Sau khi chuyển đổi tập dữ liệu text thành các vector, các biểu diễn dạng số, ta phân chia bộ dữ liệu thành tập train (dùng để huấn luyện mô hình) và tập test (dùng để kiểm tra mô hình được huấn luyện) theo tỉ lệ 80%, 20%","metadata":{}},{"cell_type":"code","source":"# Chia dataset thành các tập train và test theo tỉ lệ 80%, 20%\nfrom sklearn.model_selection import train_test_split\nX_train, X_test, y_train, y_test = train_test_split(X, data_train_sampled['target'], test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:39:06.896119Z","iopub.execute_input":"2022-01-06T10:39:06.896360Z","iopub.status.idle":"2022-01-06T10:39:06.979106Z","shell.execute_reply.started":"2022-01-06T10:39:06.896332Z","shell.execute_reply":"2022-01-06T10:39:06.978280Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Do ta đang làm việc trên dataset thiếu cân bằng => sử dụng đại lượng **F1-score** trung bình điều hòa giữa precision (độ chính xác) và recall (độ bao phủ)\n\nF1-score được biểu diễn như sau:\n\n![image.png](attachment:96032297-0608-481f-9dce-0d1877277df6.png)\n\nCách tính F1-score sử dụng sklearn:","metadata":{},"attachments":{"96032297-0608-481f-9dce-0d1877277df6.png":{"image/png":"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"}}},{"cell_type":"code","source":"from sklearn.metrics import f1_score, accuracy_score, classification_report\n# Tính 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\n  print('{} model with F1 score = {}'.format(name, f1_score(y_test, y_pred)))","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:39:06.980209Z","iopub.execute_input":"2022-01-06T10:39:06.980916Z","iopub.status.idle":"2022-01-06T10:39:06.986059Z","shell.execute_reply.started":"2022-01-06T10:39:06.980882Z","shell.execute_reply":"2022-01-06T10:39:06.985188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Huấn luyện mô hình**\n","metadata":{}},{"cell_type":"code","source":"import xgboost as xgb\nxgb = xgb.XGBClassifier()\nxgb.fit(X_train, y_train)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:39:06.987655Z","iopub.execute_input":"2022-01-06T10:39:06.987962Z","iopub.status.idle":"2022-01-06T10:41:10.284484Z","shell.execute_reply.started":"2022-01-06T10:39:06.987920Z","shell.execute_reply":"2022-01-06T10:41:10.283605Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"get_f1(xgb, 'XGBClassifier')","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:41:10.286039Z","iopub.execute_input":"2022-01-06T10:41:10.286542Z","iopub.status.idle":"2022-01-06T10:41:12.293416Z","shell.execute_reply.started":"2022-01-06T10:41:10.286499Z","shell.execute_reply":"2022-01-06T10:41:12.292301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Submition**","metadata":{}},{"cell_type":"code","source":"model = xgb\nsubmission = pd.read_csv('/kaggle/input/quora-insincere-questions-classification/sample_submission.csv')\npreds = model.predict(x)\nsubmission.loc[:, 'prediction'] = preds\nsubmission","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:41:12.296573Z","iopub.execute_input":"2022-01-06T10:41:12.297705Z","iopub.status.idle":"2022-01-06T10:41:13.731979Z","shell.execute_reply.started":"2022-01-06T10:41:12.297636Z","shell.execute_reply":"2022-01-06T10:41:13.731257Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-01-06T10:41:13.733322Z","iopub.execute_input":"2022-01-06T10:41:13.733582Z","iopub.status.idle":"2022-01-06T10:41:14.272340Z","shell.execute_reply.started":"2022-01-06T10:41:13.733540Z","shell.execute_reply":"2022-01-06T10:41:14.271126Z"},"trusted":true},"execution_count":null,"outputs":[]}]}