{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":19018,"databundleVersionId":2703900,"sourceType":"competition"},{"sourceId":1047378,"sourceType":"datasetVersion","datasetId":570677}],"dockerImageVersionId":30684,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install plotly\n!pip install xgboost\n!pip install imblearn","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv('../input/jigsaw-multilingual-toxic-comment-classification/jigsaw-toxic-comment-train.csv')\ndel(df_train['id'])\ndf_train.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_valid = pd.read_csv('../input/jigsaw-multilingual-toxic-test-translated/jigsaw_miltilingual_valid_translated.csv')\ndel(df_valid['id'])\ndf_valid.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test = pd.read_csv('../input/jigsaw-multilingual-toxic-test-translated/jigsaw_miltilingual_test_translated.csv')\ndel(df_test['id'])\ndf_test.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import plotly.express as px\nimport plotly.graph_objects as go\n\ncols = [col for col in df_train.columns]\ncols.remove('comment_text')\ntoxic_cats = {}\n\nfor i in cols:\n    i1 = i.capitalize()\n    i1 = i1.replace(\"_\", \" \")\n    toxic_cats[i1] = df_train[i].value_counts()[1]\n\n\n\n\n\nfig = px.bar(x=toxic_cats.values(), y=toxic_cats.keys(), text=toxic_cats.values(),\n             width=700, height=400, title='Nº of comments per toxicity level',\n             color=toxic_cats.values(),\n             labels={'x': 'Nº of comments', 'y': 'Level'})\nfig.update_layout(barmode='stack', yaxis={'categoryorder':'total ascending'})\n\nwith_toxic = {}\n\nfor i in cols:\n    i1 = i.capitalize()\n    i1 = i1.replace(\"_\", \" \")\n    with_toxic[i1] = sum(np.where((df_train['toxic'] == df_train[i]) & (df_train['toxic'] == 1),\n                                   True, False))\n\nfig = px.bar(x=with_toxic.values(), y=with_toxic.keys(), text=with_toxic.values(),\n             width=700, height=400, title='Nº of comments per toxicity level',\n             color=with_toxic.values(),\n             labels={'x': 'Nº of comments', 'y': 'Level'})\nfig.update_layout(barmode='stack', yaxis={'categoryorder':'total ascending'})\nfig.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = px.pie(values=toxic_cats.values(), names=toxic_cats.keys(), width=700, height=400,\n            title=\"Distribution of comments' toxicity categories\")\nfig.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = go.Figure(data=[\n    go.Bar(y=[a for a in toxic_cats.values()], x=[a for a in toxic_cats.keys()],\n           name='Total', marker_color='purple'),\n    go.Bar(y=[a for a in with_toxic.values()], x=[a for a in with_toxic.keys()],\n          name='Toxic as well', marker_color='yellow')\n])\n\nfig.update_layout(title='Are comments in other categories in toxic as well?', barmode='group', xaxis={'categoryorder':'total descending'})\n\n\nfig.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"toxic_bfr = df_train.toxic.value_counts()[1]\n\nfor i in range(len(df_train)):\n    if df_train.loc[i,'toxic'] == 0 and (df_train.loc[i, 'obscene'] == 1 or\n                                         df_train.loc[i, 'severe_toxic'] == 1 or\n                                         df_train.loc[i, 'threat'] == 1 or\n                                         df_train.loc[i, 'insult'] == 1 or\n                                         df_train.loc[i, 'identity_hate'] == 1):\n        df_train.loc[i,'toxic'] = 1\n        \ntoxic_after = df_train.toxic.value_counts()[1]\ntoxic_comments = toxic_after - toxic_bfr\nprint('There are %i new toxic comments.' %toxic_comments)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import gc \n\ndel(df_train['obscene'])\ndel(df_train['identity_hate'])\ndel(df_train['insult'])\ndel(df_train['threat'])\ndel(df_train['severe_toxic'])\n\ngc.collect()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"languages_val = {a:b for a,b in zip(df_valid['lang'].unique(), df_valid['lang'].value_counts())}\nlanguages_val['Spanish'] = languages_val.pop('es')\nlanguages_val['Italian'] = languages_val.pop('it')\nlanguages_val['Turkish'] = languages_val.pop('tr')\n\n\nfig = px.pie(values=languages_val.values(), names=languages_val.keys(), width=700, height=400,\n            title=\"Distribution of comments' languages in validation data\")\nfig.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"languages_test = {a:b for a,b in zip(df_test['lang'].unique(), df_test['lang'].value_counts())}\nlanguages_test['Spanish'] = languages_test.pop('es')\nlanguages_test['Italian'] = languages_test.pop('it')\nlanguages_test['Turkish'] = languages_test.pop('tr')\nlanguages_test['Russian'] = languages_test.pop('ru')\nlanguages_test['French'] = languages_test.pop('fr')\nlanguages_test['Portuguese'] = languages_test.pop('pt')\n\nfig = px.pie(values=languages_test.values(), names=languages_test.keys(), width=700, height=400,\n            title=\"Distribution of comments' languages in testing data\")\nfig.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"There are %.2f%% toxic comments in the training data.\"%(df_train['toxic'].value_counts()[1]/df_train['toxic'].value_counts()[0]*100))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"There are %.2f%% toxic comments in the validation data.\"%(df_valid['toxic'].value_counts()[1]/df_valid['toxic'].value_counts()[0]*100))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"The validation dataframe represents a %.2f%% of the training data.\" %(df_valid.shape[0]/(df_train.shape[0]+df_valid.shape[0])))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del(df_valid['lang'])\ndel(df_valid['comment_text'])\ndf_valid = df_valid.rename(columns={'translated':'comment_text'})\n\ngc.collect()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.concat([df_train, df_valid], ignore_index=True, axis=0)\n\ndf","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX = df['comment_text']\ny = df['toxic']\n\nx_train, x_valid, y_train, y_valid = train_test_split(X, y,\n                                                       random_state=1,\n                                                       train_size=0.8\n                                                      )","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.feature_extraction.text import TfidfVectorizer\n\nvec = TfidfVectorizer(decode_error='ignore',stop_words='english', max_df=0.8, max_features=1600)\nx_train = vec.fit_transform(x_train).todense()\nx_train = pd.DataFrame(x_train, columns=vec.get_feature_names_out())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_valid = vec.transform(x_valid).todense()\nx_valid = pd.DataFrame(x_valid, columns=vec.get_feature_names_out())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del(df)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"There are %.2f%% toxic comments in train data.\"%(y_train.sum()/len(y_train)*100))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from imblearn.over_sampling import SMOTE\n\nsm = SMOTE(random_state=1)\n\nx_train, y_train = sm.fit_resample(x_train, y_train)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train.shape","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_train.tail()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from xgboost import XGBClassifier\nfrom sklearn.metrics import f1_score\n\nmodel = XGBClassifier(n_estimators=800,\n                      use_label_encoder=False,\n                      learning_rate=0.1,\n                      max_depth=6,\n                      colsample_bytree=1,\n                      gamma=1,\n                      n_jobs=4,\n                      scale_pos_weight=5,\n                      random_state=1)\n\nmodel.fit(x_train, y_train)\n\npreds = model.predict(x_valid)\n\nf1 = f1_score(preds, y_valid)\n\nprint(\"F1 Score: %.4f\" %f1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay\n\ncm = confusion_matrix(y_valid, preds, labels=model.classes_, normalize='true')\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm,\n                             display_labels=model.classes_)\ndisp.plot() ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"x_test = vec.transform(df_test['translated']).todense()\nx_test = pd.DataFrame(x_test, columns=vec.get_feature_names_out())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds_test = model.predict(x_test)\n\noutput = pd.DataFrame({'id': df_test.index,\n                       'toxic': preds_test})\noutput.to_csv('submission.csv', index=False)\n\noutput.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"output['toxic'].value_counts()","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}