{"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":"import numpy as np \nimport pandas as pd\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.preprocessing import OneHotEncoder,LabelEncoder\nfrom scipy import sparse\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import log_loss\n\nNFOLDs = 5","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-07-04T20:50:50.489196Z","iopub.execute_input":"2022-07-04T20:50:50.490065Z","iopub.status.idle":"2022-07-04T20:50:51.879186Z","shell.execute_reply.started":"2022-07-04T20:50:50.489938Z","shell.execute_reply":"2022-07-04T20:50:51.878053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_tr = pd.read_csv('/kaggle/input/feedback-prize-effectiveness/train.csv')\ndataset_te = pd.read_csv('/kaggle/input/feedback-prize-effectiveness/test.csv')\n\ndataset_tr['text'] = dataset_tr['essay_id'].apply(lambda x: open(f'/kaggle/input/feedback-prize-effectiveness/train/{x}.txt').read())\ndataset_te['text'] = dataset_te['essay_id'].apply(lambda x: open(f'/kaggle/input/feedback-prize-effectiveness/test/{x}.txt').read())\ndataset_tr.head(2)","metadata":{"execution":{"iopub.status.busy":"2022-07-04T20:50:51.880996Z","iopub.execute_input":"2022-07-04T20:50:51.881334Z","iopub.status.idle":"2022-07-04T20:51:27.043625Z","shell.execute_reply.started":"2022-07-04T20:50:51.881304Z","shell.execute_reply":"2022-07-04T20:51:27.042348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"effectiveness_map = {\"Ineffective\":0, \"Adequate\":1,\"Effective\":2}\ndataset_tr[\"target\"] = dataset_tr[\"discourse_effectiveness\"].map(effectiveness_map)\ndataset_tr = dataset_tr.reset_index(drop=True)","metadata":{"execution":{"iopub.status.busy":"2022-07-04T20:51:43.707879Z","iopub.execute_input":"2022-07-04T20:51:43.708267Z","iopub.status.idle":"2022-07-04T20:51:43.738986Z","shell.execute_reply.started":"2022-07-04T20:51:43.708235Z","shell.execute_reply":"2022-07-04T20:51:43.738018Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"skfold = StratifiedKFold(n_splits=NFOLDs,shuffle=True,random_state=NFOLDs)\nfor i,(train_index, test_index) in enumerate(skfold.split(dataset_tr, dataset_tr[\"target\"])):\n    dataset_tr.loc[test_index,\"fold\"] = i\nprint(dataset_tr.fold.value_counts()) ","metadata":{"execution":{"iopub.status.busy":"2022-07-04T20:52:01.736699Z","iopub.execute_input":"2022-07-04T20:52:01.737062Z","iopub.status.idle":"2022-07-04T20:52:01.772294Z","shell.execute_reply.started":"2022-07-04T20:52:01.737033Z","shell.execute_reply":"2022-07-04T20:52:01.770941Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds = []\n\nfor n_fold in range(NFOLDs):\n    dataset_tr_ = dataset_tr[dataset_tr['fold']!=n_fold] #use all the discourse_ids which are not marked by current fold index\n    dataset_eval_ = dataset_tr[dataset_tr['fold']==n_fold] #use current fold index rows as validation set\n         \n    # Training, Validation, and Test Dataset\n    #discourse_id\n    tf = TfidfVectorizer(ngram_range=(1,2),norm='l2', smooth_idf=True)\n    tr_discourse_tfidf = tf.fit_transform(dataset_tr_[\"discourse_text\"])\n    eval_discourse_tfidf = tf.transform(dataset_eval_[\"discourse_text\"])\n    te_discourse_tfidf = tf.transform(dataset_te[\"discourse_text\"])\n    \n    #text\n    tf = TfidfVectorizer(ngram_range=(1,2),norm='l2', smooth_idf=True) # Load tf another time because it will learn the new vocabulary for 'text'\n    tr_text_tfidf = tf.fit_transform(dataset_tr_[\"text\"])\n    eval_text_tfidf = tf.transform(dataset_eval_[\"text\"])\n    te_text_tfidf = tf.transform(dataset_te[\"text\"])\n    \n    #discourse_type\n    ohe = OneHotEncoder()\n    tr_type_ohe =  sparse.csr_matrix(ohe.fit_transform(dataset_tr_[\"discourse_type\"].values.reshape(-1,1)))\n    eval_type_ohe =  sparse.csr_matrix(ohe.transform(dataset_eval_[\"discourse_type\"].values.reshape(-1,1)))\n    te_type_ohe =  sparse.csr_matrix(ohe.transform(dataset_te[\"discourse_type\"].values.reshape(-1,1)))\n        \n    #Stack each vector representations \n    tr_tfidf = sparse.hstack((tr_type_ohe,tr_discourse_tfidf,tr_text_tfidf))\n    eval_tfidf = sparse.hstack((eval_type_ohe,eval_discourse_tfidf,eval_text_tfidf))\n    te_tfidf = sparse.hstack((te_type_ohe,te_discourse_tfidf,te_text_tfidf))\n    \n    #Model\n    clf = LogisticRegression(max_iter=1000,penalty=\"l2\",C=1.0131816333513533)\n    clf.fit(tr_tfidf, dataset_tr_[\"target\"].values)\n    \n    #Validation \n    ev_preds = clf.predict_proba(eval_tfidf)\n    ev_loss = log_loss(dataset_eval_[\"target\"].values,ev_preds)\n    print(\"Fold : {} EV score: {}\".format(n_fold,ev_loss))\n    \n    #Test\n    preds.append(clf.predict_proba(te_tfidf))","metadata":{"execution":{"iopub.status.busy":"2022-07-04T20:52:35.796866Z","iopub.execute_input":"2022-07-04T20:52:35.797379Z","iopub.status.idle":"2022-07-04T21:14:06.457477Z","shell.execute_reply.started":"2022-07-04T20:52:35.797318Z","shell.execute_reply":"2022-07-04T21:14:06.456169Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_submission = pd.read_csv(\"../input/feedback-prize-effectiveness/sample_submission.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-07-04T21:14:06.459537Z","iopub.execute_input":"2022-07-04T21:14:06.459854Z","iopub.status.idle":"2022-07-04T21:14:06.473574Z","shell.execute_reply.started":"2022-07-04T21:14:06.459825Z","shell.execute_reply":"2022-07-04T21:14:06.472496Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_preds = np.array(preds).mean(0)\nprint(all_preds.shape)\ndataset_submission.loc[:,\"Ineffective\"] = all_preds[:,0]\ndataset_submission.loc[:,\"Adequate\"] = all_preds[:,1]\ndataset_submission.loc[:,\"Effective\"] = all_preds[:,2]\ndataset_submission.head()","metadata":{"execution":{"iopub.status.busy":"2022-07-04T21:14:06.475077Z","iopub.execute_input":"2022-07-04T21:14:06.476141Z","iopub.status.idle":"2022-07-04T21:14:06.494157Z","shell.execute_reply.started":"2022-07-04T21:14:06.47602Z","shell.execute_reply":"2022-07-04T21:14:06.493152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_submission.to_csv('submission.csv',index=None)","metadata":{"execution":{"iopub.status.busy":"2022-07-04T21:14:34.15961Z","iopub.execute_input":"2022-07-04T21:14:34.160014Z","iopub.status.idle":"2022-07-04T21:14:34.166996Z","shell.execute_reply.started":"2022-07-04T21:14:34.159982Z","shell.execute_reply":"2022-07-04T21:14:34.165655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}