├── report └── Report.pdf ├── README.md ├── 0. Preprocessing.ipynb ├── 4. RNN.ipynb ├── 5. GRU.ipynb └── 8. RoBERTa.ipynb /report/Report.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rohithteja/Twitter-Sentiment-Analysis-and-Tweet-Extraction/HEAD/report/Report.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Twitter-Sentiment-Analysis-and-Tweet-Extraction 2 | Twitter sentiment analysis of the dataset taken from Kaggle competition (https://www.kaggle.com/c/tweet-sentiment-extraction). 3 | 4 | In the social media, Twitter has been the most engaging platform for a long time and many 5 | companies, political personalities, celebrities have their presence in twitter which makes it a great 6 | place for having discussions by millions of users about various topics ranging from laws passed by 7 | the parliament to the new movie releases. This makes it interesting to analyse the sentiments of 8 | the tweets to see if a tweet by a certain user has positive or negative impact on the community. 9 | Going a step further, we can also find which words of the tweet contribute to the sentiment. The 10 | analysis of public reaction can be easily done using the sentiment analysis and the keyword 11 | extraction of the tweets. 12 | In this project, the sentiment analysis of tweets using various deep learning algorithms is tested 13 | and their performance using different metrics was calculated. Also a method to perform keyword 14 | extraction of tweets was explored (https://www.kaggle.com/yutanakamura/dear-pytorch-lovers-bert-transformers-lightning). The dataset that was considered encompasses a broad set of tweets which are classified into 3 different types of sentiments, namely, positive, negative and neutral. 15 | 16 | The deep learning algorithms tested are listed as follows: 17 | 1. Multilayer Perceptron (MLP) 18 | 2. Convolutional neural network (CNN) 19 | 3. Recurrent neural network (RNN) 20 | 4. Long short-term memory (LSTM) 21 | 5. Gated recurrent unit (GRU) 22 | 6. Bi-directional LSTM (Bi-LSTM) 23 | 7. RoBERTa (Transformer architecture) 24 | 8. BERT 25 | 9. XLNet 26 | 27 | Note - The report of the experiments is included in this repo. 28 | -------------------------------------------------------------------------------- /0. Preprocessing.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"0. Preprocessing.ipynb","provenance":[],"collapsed_sections":[],"mount_file_id":"1jT_ju-_wnQgF9XO_vdfu5aQFXi4u9Vlt","authorship_tag":"ABX9TyOQzKMm5vAoyw/Nl6894f7Y"},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"code","metadata":{"id":"TKTziNf2eq_j"},"source":["import numpy as np\n","import pandas as pd\n","from sklearn.model_selection import train_test_split\n","import re\n","from matplotlib import pyplot as plt\n","import nltk\n","from nltk.tokenize import RegexpTokenizer\n","from nltk.stem import WordNetLemmatizer\n","from nltk.corpus import stopwords\n","import string\n","import unicodedata"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"I52HikOxoXDh"},"source":["! sudo apt install openjdk-8-jdk\n","! sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java\n","! pip install language-check\n","! pip install pycontractions"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"wgUmGStToZhZ"},"source":["from pycontractions import Contractions"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"y_7oAsQjqU3s"},"source":["pip install autocorrect"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"ksgf1FsDerB8"},"source":["nltk.download('stopwords')\n","nltk.download('wordnet')\n","nltk.download('punkt')"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"cVqcGbW_erET"},"source":["df = pd.read_csv(\"data/train.csv\")"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"N9na9PIWsAgT"},"source":["df = pd.read_csv(\"data/test.csv\")"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":402},"id":"Xf0Zc7I5erG8","executionInfo":{"status":"ok","timestamp":1607679866544,"user_tz":-60,"elapsed":590,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"f9b4a71a-1d12-4b47-d6f4-58c3a2fb52b9"},"source":["df"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
textIDtextsentiment
0f87dea47dbLast session of the day http://twitpic.com/67ezhneutral
196d74cb729Shanghai is also really exciting (precisely -...positive
2eee518ae67Recession hit Veronique Branquinho, she has to...negative
301082688c6happy bday!positive
433987a8ee5http://twitpic.com/4w75p - I like it!!positive
............
3529e5f0e6ef4bits at 3 am, im very tired but i can`t sleep ...negative
3530416863ce47All alone in this old house again. Thanks for...positive
35316332da480cI know what you mean. My little dog is sinkin...negative
3532df1baec676_sutra what is your next youtube video gonna b...positive
3533469e15c5a8http://twitpic.com/4woj2 - omgssh ang cute n...positive
\n","

3534 rows × 3 columns

\n","
"],"text/plain":[" textID text sentiment\n","0 f87dea47db Last session of the day http://twitpic.com/67ezh neutral\n","1 96d74cb729 Shanghai is also really exciting (precisely -... positive\n","2 eee518ae67 Recession hit Veronique Branquinho, she has to... negative\n","3 01082688c6 happy bday! positive\n","4 33987a8ee5 http://twitpic.com/4w75p - I like it!! positive\n","... ... ... ...\n","3529 e5f0e6ef4b its at 3 am, im very tired but i can`t sleep ... negative\n","3530 416863ce47 All alone in this old house again. Thanks for... positive\n","3531 6332da480c I know what you mean. My little dog is sinkin... negative\n","3532 df1baec676 _sutra what is your next youtube video gonna b... positive\n","3533 469e15c5a8 http://twitpic.com/4woj2 - omgssh ang cute n... positive\n","\n","[3534 rows x 3 columns]"]},"metadata":{"tags":[]},"execution_count":46}]},{"cell_type":"code","metadata":{"id":"ePNBm7GyerNe"},"source":["url = r'''(?i)\\b((?:https?://|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))'''"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"oqo-1H6S7ZtW"},"source":["#for text\r\n","\r\n","df.text = df.text.map(lambda x:str(x).lower()) #lower case\r\n","df.text = df.text.map(lambda x:re.sub(r\"\\b[^\\s]+@[^\\s]+[.][^\\s]+\\b\", \"\", x)) #email\r\n","df.text = df.text.map(lambda x:re.sub(url, \"\", x)) #url\r\n","df.text = df.text.map(lambda x:re.sub(r'[^a-zA-z.,!?/:;\\\"\\'\\s]', \"\", x)) #numbers\r\n","df.text = df.text.map(lambda x:re.sub(r'^\\s*|\\s\\s*', ' ', x).strip()) #white space\r\n","df.text = df.text.map(lambda x:''.join([c for c in x if c not in string.punctuation])) #punctuations\r\n","df.text = df.text.map(lambda x:re.sub(r'[^a-zA-z0-9.,!?/:;\\\"\\'\\s]', '', x)) #special char\r\n","df.text = df.text.map(lambda x:unicodedata.normalize('NFKD', x).encode('ascii', 'ignore').decode('utf-8', 'ignore')) #unicode"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"_CMf_Ip1LMat"},"source":["#for selected_text\r\n","\r\n","df.selected_text = df.selected_text.map(lambda x:str(x).lower()) #lower case\r\n","df.selected_text = df.selected_text.map(lambda x:re.sub(r\"\\b[^\\s]+@[^\\s]+[.][^\\s]+\\b\", \"\", x)) #email\r\n","df.selected_text = df.selected_text.map(lambda x:re.sub(url, \"\", x)) #url\r\n","df.selected_text = df.selected_text.map(lambda x:re.sub(r'[^a-zA-z.,!?/:;\\\"\\'\\s]', \"\", x)) #numbers\r\n","df.selected_text = df.selected_text.map(lambda x:re.sub(r'^\\s*|\\s\\s*', ' ', x).strip()) #white space\r\n","df.selected_text = df.selected_text.map(lambda x:''.join([c for c in x if c not in string.punctuation])) #punctuations\r\n","df.selected_text = df.selected_text.map(lambda x:re.sub(r'[^a-zA-z0-9.,!?/:;\\\"\\'\\s]', '', x)) #special char\r\n","df.selected_text = df.selected_text.map(lambda x:unicodedata.normalize('NFKD', x).encode('ascii', 'ignore').decode('utf-8', 'ignore')) #unicode"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":402},"id":"GHmT9315oNHv","executionInfo":{"status":"ok","timestamp":1607679897526,"user_tz":-60,"elapsed":863,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"bc359afa-f863-47ad-fca3-0d7df8b9df32"},"source":["df"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
textIDtextsentiment
0f87dea47dblast session of the dayneutral
196d74cb729shanghai is also really exciting precisely sky...positive
2eee518ae67recession hit veronique branquinho she has to ...negative
301082688c6happy bdaypositive
433987a8ee5i like itpositive
............
3529e5f0e6ef4bits at am im very tired but i cant sleep but i...negative
3530416863ce47all alone in this old house again thanks for t...positive
35316332da480ci know what you mean my little dog is sinking ...negative
3532df1baec676sutra what is your next youtube video gonna be...positive
3533469e15c5a8omgssh ang cute ng bbypositive
\n","

3534 rows × 3 columns

\n","
"],"text/plain":[" textID text sentiment\n","0 f87dea47db last session of the day neutral\n","1 96d74cb729 shanghai is also really exciting precisely sky... positive\n","2 eee518ae67 recession hit veronique branquinho she has to ... negative\n","3 01082688c6 happy bday positive\n","4 33987a8ee5 i like it positive\n","... ... ... ...\n","3529 e5f0e6ef4b its at am im very tired but i cant sleep but i... negative\n","3530 416863ce47 all alone in this old house again thanks for t... positive\n","3531 6332da480c i know what you mean my little dog is sinking ... negative\n","3532 df1baec676 sutra what is your next youtube video gonna be... positive\n","3533 469e15c5a8 omgssh ang cute ng bby positive\n","\n","[3534 rows x 3 columns]"]},"metadata":{"tags":[]},"execution_count":55}]},{"cell_type":"code","metadata":{"id":"XG9YI5ucqMVb"},"source":["#to use spellcheck\n","\n","from autocorrect import Speller\n","spell = Speller(lang=\"en\")\n","tokenizer = RegexpTokenizer(r'\\w+')\n","\n","df.text = df.text.map(lambda x:tokenizer.tokenize(x)) #remove punctuation and tokenize\n","df.text = df.text.map(lambda x:[spell(i) for i in x]) #spell check"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"IHz0jxZiqMli"},"source":["df.to_csv(\"data/preprocessed_train.csv\",index=False)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"BlM-iKN4rJxj"},"source":[""],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"JMki-KXJrJ0D"},"source":[""],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"00s4XDourJ2c"},"source":[""],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"EsJ2l4yErJ4p"},"source":[""],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"BTjsAPptrJ7G"},"source":[""],"execution_count":null,"outputs":[]}]} -------------------------------------------------------------------------------- /4. RNN.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"accelerator":"GPU","colab":{"name":"4. RNN.ipynb","provenance":[],"collapsed_sections":[],"mount_file_id":"1QhCah_wh5pgIO02spSb8VbYc5n6eVHiR","authorship_tag":"ABX9TyN8W7fgeybj7ZGgBlwrvQOZ"},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"code","metadata":{"id":"XnIpJnkHuT-D"},"source":["import pandas as pd\r\n","import os\r\n","import numpy as np\r\n","from sklearn.model_selection import train_test_split\r\n","import gensim\r\n","from gensim.models.word2vec import Word2Vec\r\n","import gensim.downloader as api\r\n","from keras.utils import to_categorical\r\n","import matplotlib.pyplot as plt \r\n","import keras\r\n","from time import time"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":419},"id":"VijxsP322W3W","executionInfo":{"status":"ok","timestamp":1609346649560,"user_tz":-60,"elapsed":6728,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"06d5b848-efa6-4d5a-c626-d130477da5ad"},"source":["df = pd.read_csv(\"data/preprocessed_train.csv\")\r\n","df"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
textIDtextselected_textsentiment
0cb774db0d1id have responded if i were goingid have responded if i were goingneutral
1549e992a42sooo sad i will miss you here in san diegosooo sadnegative
2088c60f138my boss is bullying mebullying menegative
39642c003efwhat interview leave me aloneleave me alonenegative
4358bd9e861sons of why couldnt they put them on the rele...sons ofnegative
...............
274764eac33d1c0wish we could come see u on denver husband los...d lostnegative
274774f4c4fc327ive wondered about rake to the client has made...dont forcenegative
27478f67aae2310yay good for both of you enjoy the break you p...yay good for both of youpositive
27479ed167662a5but it was worth itbut it was worth itpositive
274806f7127d9d7all this flirting going on the atg smiles yay ...all this flirting going on the atg smiles yay ...neutral
\n","

27481 rows × 4 columns

\n","
"],"text/plain":[" textID ... sentiment\n","0 cb774db0d1 ... neutral\n","1 549e992a42 ... negative\n","2 088c60f138 ... negative\n","3 9642c003ef ... negative\n","4 358bd9e861 ... negative\n","... ... ... ...\n","27476 4eac33d1c0 ... negative\n","27477 4f4c4fc327 ... negative\n","27478 f67aae2310 ... positive\n","27479 ed167662a5 ... positive\n","27480 6f7127d9d7 ... neutral\n","\n","[27481 rows x 4 columns]"]},"metadata":{"tags":[]},"execution_count":3}]},{"cell_type":"code","metadata":{"id":"sEBirsml1Hgu"},"source":["# for case 1 run this code (case 1 = text)\r\n","case = \"case1-rnn\"\r\n","\r\n","#read data\r\n","df = pd.read_csv(\"data/preprocessed_train.csv\")\r\n","df.text = df.text.map(lambda x:str(x))\r\n","df.sentiment = df.sentiment.astype(\"category\")\r\n","df.sentiment = df.sentiment.cat.codes"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"wxc2J9Gr2bQ-"},"source":["# for case 2 run this code (case 2 = selected text)\r\n","case = \"case2-rnn\"\r\n","\r\n","#read data\r\n","df = pd.read_csv(\"data/preprocessed_train.csv\")\r\n","df.text = df.selected_text.map(lambda x:str(x))\r\n","df.sentiment = df.sentiment.astype(\"category\")\r\n","df.sentiment = df.sentiment.cat.codes"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Kiv4fMpy2wVQ"},"source":["# train, val, test split\r\n","x_train, xtest, y_train, ytest = train_test_split(df.text.values, df.sentiment.values,stratify=df.sentiment.values, test_size=0.3,random_state=1)\r\n","y_train = to_categorical(y_train)\r\n","x_val = xtest[0:4122]\r\n","y_val = to_categorical(ytest[0:4122])\r\n","x_test = xtest[4122:]\r\n","y_test = ytest[4122:]\r\n","\r\n","#padding and tokenization\r\n","from keras.preprocessing.text import Tokenizer\r\n","from keras.preprocessing.sequence import pad_sequences\r\n","\r\n","tokenizer = Tokenizer(num_words=5000)\r\n","tokenizer.fit_on_texts(df.text.values)\r\n","\r\n","X_train = tokenizer.texts_to_sequences(x_train)\r\n","X_val = tokenizer.texts_to_sequences(x_val)\r\n","X_test = tokenizer.texts_to_sequences(x_test)\r\n","\r\n","vocab_size = len(tokenizer.word_index) + 1\r\n","\r\n","maxlen = 100\r\n","\r\n","X_train = pad_sequences(X_train, padding='pre', maxlen=maxlen)\r\n","X_val = pad_sequences(X_val, padding='pre', maxlen=maxlen)\r\n","X_test = pad_sequences(X_test, padding='pre', maxlen=maxlen)\r\n","\r\n","word_index = tokenizer.word_index"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"MfchPQ_iuUHb"},"source":["#import glove embeddings\r\n","\r\n","embeddings_index = {}\r\n","f = open(os.path.join( 'glove.twitter.27B.100d.txt'))\r\n","for line in f:\r\n"," values = line.split()\r\n"," word = values[0]\r\n"," coefs = np.asarray(values[1:], dtype='float32')\r\n"," embeddings_index[word] = coefs\r\n","f.close()\r\n","\r\n","embedding_matrix = np.zeros((len(word_index) + 1, 100))\r\n","for word, i in word_index.items():\r\n"," embedding_vector = embeddings_index.get(word)\r\n"," if embedding_vector is not None:\r\n"," # words not found in embedding index will be all-zeros.\r\n"," embedding_matrix[i] = embedding_vector"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Z4oLKEuduUTR"},"source":["#using glove\r\n","\r\n","from keras.models import Sequential\r\n","from keras import regularizers\r\n","from keras.layers.core import Dense, Dropout, Flatten\r\n","from keras import layers\r\n","from sklearn.metrics import accuracy_score, f1_score\r\n","from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D\r\n","\r\n","\r\n","def rnn_glove(activation,optimizer,epochs,batchsize):\r\n"," embedding_dim = 100\r\n","\r\n"," model = Sequential()\r\n"," model.add(layers.Embedding(input_dim=vocab_size, \r\n"," output_dim=embedding_dim, weights=[embedding_matrix],\r\n"," input_length=maxlen))\r\n"," model.add(layers.SimpleRNN(64))\r\n"," model.add(Dense(3,activation='softmax'))\r\n"," model.compile(optimizer=optimizer,\r\n"," loss='categorical_crossentropy',\r\n"," metrics=['accuracy'])\r\n"," history = model.fit(X_train, y_train,\r\n"," epochs=epochs,\r\n"," verbose=0,\r\n"," validation_data=(X_val, y_val),\r\n"," batch_size=batchsize)\r\n"," \r\n"," return history, model"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"DD3YOLNLfVq5"},"source":["activation = [ \"tanh\"]\r\n","optimizer = [\"adam\", \"SGD\", \"RMSprop\", \"Adadelta\"]\r\n","epochs = [5,10,15,20]\r\n","batchsize = [8,16,32,64,128]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"dk16QKlGk3y7","executionInfo":{"status":"ok","timestamp":1609214909898,"user_tz":-60,"elapsed":8825246,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"6a411f05-0098-4efb-c8ca-00c6dade73be"},"source":["#experiments using glove embeddings\r\n","\r\n","# 1. selecting activation fixing - optimizer = adam, epochs = 5, batch = 16\r\n","sel_activation = {}\r\n","for i in activation:\r\n"," history, model = rnn_glove(i,\"adam\",5,16)\r\n"," temp = {i:model.evaluate(X_val,y_val)[1]}\r\n"," sel_activation.update(temp)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_activation_final = max(sel_activation, key=sel_activation.get)\r\n","print(\"best activation function is \",sel_activation_final)\r\n","\r\n","# 2. selecting optimizer by fixing - activation = best, epochs = 5, batch = 16\r\n","sel_optimizer = {}\r\n","for i in optimizer:\r\n"," history, model = rnn_glove(sel_activation_final,i,5,16)\r\n"," temp = {i:model.evaluate(X_val,y_val)[1]}\r\n"," sel_optimizer.update(temp)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_optimizer_final = max(sel_optimizer, key=sel_optimizer.get)\r\n","print(\"best optimizer is \",sel_optimizer_final)\r\n","\r\n","# 3. graph epoch vs accuracy score\r\n","\r\n","acc_train_epoch = {}\r\n","acc_val_epoch = {}\r\n","for i in epochs:\r\n"," history, model = rnn_glove(sel_activation_final,sel_optimizer_final,i,16)\r\n"," temp_train = {i:model.evaluate(X_train,y_train)[1]}\r\n"," temp_val = {i:model.evaluate(X_val,y_val)[1]}\r\n"," acc_train_epoch.update(temp_train)\r\n"," acc_val_epoch.update(temp_val)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_epoch_final = max(acc_val_epoch, key=acc_val_epoch.get)\r\n","print(\"best epoch is \",sel_epoch_final)\r\n","\r\n","df_epoch_train = pd.DataFrame(list(acc_train_epoch.items()), columns=['Epochs', 'Accuracy score'])\r\n","df_epoch_val = pd.DataFrame(list(acc_val_epoch.items()), columns=['Epochs', 'Accuracy score'])\r\n","\r\n","df_epoch_val.Epochs = df_epoch_val.Epochs.map(lambda x:str(x))\r\n","df_epoch_train.Epochs = df_epoch_train.Epochs.map(lambda x:str(x))\r\n","\r\n","\r\n","plt.figure()\r\n","plt.plot(df_epoch_train.iloc[:,0],df_epoch_train.iloc[:,1],c=\"r\",label=\"train\",linestyle='--', marker='o')\r\n","plt.plot(df_epoch_val.iloc[:,0],df_epoch_val.iloc[:,1],c=\"b\",label = \"val\",linestyle='--', marker='o')\r\n","plt.title(\"Accuracy score vs Epochs\")\r\n","plt.ylabel(\"Accuracy score\")\r\n","plt.xlabel(\"Epochs\")\r\n","plt.legend()\r\n","plt.savefig(\"images/acc-epoch-glove-\"+case, bbox_inches='tight',dpi = 200)\r\n","\r\n","\r\n","# 4. graph batch size vs accuracy score\r\n","acc_train_batch = {}\r\n","acc_val_batch = {}\r\n","for i in batchsize:\r\n"," history, model = rnn_glove(sel_activation_final,sel_optimizer_final,sel_epoch_final,i)\r\n"," temp_train = {i:model.evaluate(X_train,y_train)[1]}\r\n"," temp_val = {i:model.evaluate(X_val,y_val)[1]}\r\n"," acc_train_batch.update(temp_train)\r\n"," acc_val_batch.update(temp_val)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_batch_final = max(acc_val_batch, key=acc_val_batch.get)\r\n","print(\"best batchsize is \",sel_batch_final)\r\n","\r\n","df_batch_train = pd.DataFrame(list(acc_train_batch.items()), columns=['Batchsize', 'Accuracy score'])\r\n","df_batch_val = pd.DataFrame(list(acc_val_batch.items()), columns=['Batchsize', 'Accuracy score'])\r\n","\r\n","df_batch_val.Batchsize = df_batch_val.Batchsize.map(lambda x:str(x))\r\n","df_batch_train.Batchsize = df_batch_train.Batchsize.map(lambda x:str(x))\r\n","\r\n","plt.figure()\r\n","plt.plot(df_batch_train.iloc[:,0],df_batch_train.iloc[:,1],c=\"r\",label=\"train\",linestyle='--', marker='o')\r\n","plt.plot(df_batch_val.iloc[:,0],df_batch_val.iloc[:,1],c=\"b\",label = \"val\",linestyle='--', marker='o')\r\n","plt.title(\"Accuracy score vs Batchsize\")\r\n","plt.ylabel(\"Accuracy score\")\r\n","plt.xlabel(\"Batchsize\")\r\n","plt.legend()\r\n","plt.savefig(\"images/acc-batch-glove-\"+case, bbox_inches='tight',dpi = 200)\r\n","\r\n","# 5. best model\r\n","t0 = time()\r\n","history, model = rnn_glove(sel_activation_final,sel_optimizer_final,sel_epoch_final,sel_batch_final)\r\n","pred = np.argmax(model.predict(X_test), axis=-1)\r\n","print(\"test accuracy score = \",accuracy_score(y_pred=pred, y_true=y_test))\r\n","t1 = time()\r\n","print(\"time taken is \", t1-t0)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["129/129 [==============================] - 1s 9ms/step - loss: 0.7991 - accuracy: 0.6747\n","best activation function is tanh\n","129/129 [==============================] - 1s 9ms/step - loss: 0.8368 - accuracy: 0.6737\n","129/129 [==============================] - 1s 9ms/step - loss: 0.9075 - accuracy: 0.5902\n","129/129 [==============================] - 1s 9ms/step - loss: 0.6998 - accuracy: 0.7135\n","129/129 [==============================] - 1s 9ms/step - loss: 1.1566 - accuracy: 0.3719\n","best optimizer is RMSprop\n","602/602 [==============================] - 5s 9ms/step - loss: 0.5717 - accuracy: 0.7684\n","129/129 [==============================] - 1s 9ms/step - loss: 0.6976 - accuracy: 0.7232\n","602/602 [==============================] - 5s 9ms/step - loss: 0.3841 - accuracy: 0.8579\n","129/129 [==============================] - 1s 9ms/step - loss: 0.7638 - accuracy: 0.7023\n","602/602 [==============================] - 5s 9ms/step - loss: 0.2630 - accuracy: 0.9077\n","129/129 [==============================] - 1s 9ms/step - loss: 0.9372 - accuracy: 0.6900\n","602/602 [==============================] - 5s 9ms/step - loss: 0.1313 - accuracy: 0.9575\n","129/129 [==============================] - 1s 9ms/step - loss: 1.2095 - accuracy: 0.6720\n","best epoch is 5\n","602/602 [==============================] - 5s 9ms/step - loss: 0.5847 - accuracy: 0.7687\n","129/129 [==============================] - 1s 9ms/step - loss: 0.7015 - accuracy: 0.7227\n","602/602 [==============================] - 5s 9ms/step - loss: 0.5686 - accuracy: 0.7744\n","129/129 [==============================] - 1s 9ms/step - loss: 0.6971 - accuracy: 0.7096\n","602/602 [==============================] - 5s 9ms/step - loss: 0.5793 - accuracy: 0.7651\n","129/129 [==============================] - 1s 9ms/step - loss: 0.7064 - accuracy: 0.7065\n","602/602 [==============================] - 5s 9ms/step - loss: 0.5641 - accuracy: 0.7789\n","129/129 [==============================] - 1s 9ms/step - loss: 0.7114 - accuracy: 0.7094\n","602/602 [==============================] - 5s 9ms/step - loss: 0.5709 - accuracy: 0.7685\n","129/129 [==============================] - 1s 9ms/step - loss: 0.6851 - accuracy: 0.7120\n","best batchsize is 8\n","test accuracy score = 0.7152558816395829\n","time taken is 824.2185091972351\n"],"name":"stdout"},{"output_type":"display_data","data":{"image/png":"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Xdu10vQ1iQFHIpsiqZI6gyhliEg1VMUkBcXMziQaU//p7s/nOx6RhkxVTCIikpFKECIiklGTaYPo2rWr9+3bN99hiIg0KtOmTVvs7t0ynWsyCaJv376UlpbmOwwRkUbFzOZWd05VTCIikpEShIiIZKQEISIiGTWZNohM1q5dS1lZGatXr6794kaudevW9O7dm5YtW+Y7FBFpIpp0gigrK6NDhw707duXmAesaXJ3lixZQllZGf369ct3OCLSRDTpKqbVq1fTpUuXJp0cAMyMLl26FERJSUTSjBsHfftCs2bxPK66pU02T5MuQQBNPjmkFMrnFJHEuHEwahSsXBn7c+fGPsDIkdXftwmadAlCRKTJuuKKyuSQsnJlHK8jShA5tnz5cm699dZNvm/YsGEsX748BxGJSKO2YgXce2+UGDKZN6/O3koJIl0O6vOqSxAVFdUtMBaefPJJtt66uhUzRaSgrF8PDz4I3/kOdO8eVUjNm2e+tqiozt42pwnCzIaa2XtmNivTQuRmVmxmk8zsDTObYma9086tM7PXksejuYwTqKzPmzsX3Cvr87YwSVx66aW8//77DBo0iD333JMDDjiAb3/72wwYMACAY445hsGDBzNw4EDGjh375X19+/Zl8eLFzJkzh/79+3PmmWcycOBAhgwZwqpVq7YoJhFpBFavhunTY9ssqo7+7//gjDPg+efhrrugbdsN72nbFsaMqbsY3D0nD6A58D6wPbAV8DowoMo1DwKnJNuHAnennftsU95v8ODBXtXbb7+94YGDDtr4ccstca5PH/dIDRs+unSJ8+XlG9+bhdmzZ/vAgQPd3X3y5Mnetm1b/+CDD748v2TJEnd3X7lypQ8cONAXL17s7u7FxcVeXl7us2fP9ubNm/v06dPd3X348OF+9913Z3yvjT6viDQua9a4P/64+/e/796xo/vWW8cxd/fZs90rKja8/p573IuL3c3i+Z57NvktgVKv5u9qLnsx7QXMcvcPAMxsPHA08HbaNQOIRc8BJlP7OsS5U1aW+fiSJXX6NnvttdcGYxX++Mc/8ve//x2A+fPnM3PmTLp06bLBPf369WPQoEEADB48mDlz5tRpTCLSANx3H5x9NixbBltvDccfDyecUFmVlGm26pEj66zHUia5TBC9iJW7UsqAvatc8zpwHPAH4Figg5l1cfclQGszKwUq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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"code","metadata":{"id":"nH3le1L0ApgP"},"source":["#using keras embedding\r\n","\r\n","def rnn_keras(activation,optimizer,epochs,batchsize):\r\n"," embedding_dim = 100\r\n","\r\n"," model = Sequential()\r\n"," model.add(layers.Embedding(input_dim=vocab_size, \r\n"," output_dim=embedding_dim, \r\n"," input_length=maxlen))\r\n"," model.add(layers.SimpleRNN(64))\r\n"," model.add(Dense(3,activation='softmax'))\r\n"," model.compile(optimizer=optimizer,\r\n"," loss='categorical_crossentropy',\r\n"," metrics=['accuracy'])\r\n"," history = model.fit(X_train, y_train,\r\n"," epochs=epochs,\r\n"," verbose=0,\r\n"," validation_data=(X_val, y_val),\r\n"," batch_size=batchsize)\r\n"," \r\n"," return history, model"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9F36uecY_L9k","outputId":"8dea8760-567b-49a6-cb57-82e001ce9324"},"source":["#experiments using keras embeddings\r\n","\r\n","# 1. selecting activation fixing - optimizer = adam, epochs = 5, batch = 16\r\n","sel_activation = {}\r\n","for i in activation:\r\n"," history, model = rnn_keras(i,\"adam\",5,16)\r\n"," temp = {i:model.evaluate(X_val,y_val)[1]}\r\n"," sel_activation.update(temp)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_activation_final = max(sel_activation, key=sel_activation.get)\r\n","print(\"best activation function is \",sel_activation_final)\r\n","\r\n","# 2. selecting optimizer by fixing - activation = best, epochs = 5, batch = 16\r\n","sel_optimizer = {}\r\n","for i in optimizer:\r\n"," history, model = rnn_keras(sel_activation_final,i,5,16)\r\n"," temp = {i:model.evaluate(X_val,y_val)[1]}\r\n"," sel_optimizer.update(temp)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_optimizer_final = max(sel_optimizer, key=sel_optimizer.get)\r\n","print(\"best optimizer is \",sel_optimizer_final)\r\n","\r\n","# 3. graph epoch vs accuracy score\r\n","\r\n","acc_train_epoch = {}\r\n","acc_val_epoch = {}\r\n","for i in epochs:\r\n"," history, model = rnn_keras(sel_activation_final,sel_optimizer_final,i,16)\r\n"," temp_train = {i:model.evaluate(X_train,y_train)[1]}\r\n"," temp_val = {i:model.evaluate(X_val,y_val)[1]}\r\n"," acc_train_epoch.update(temp_train)\r\n"," acc_val_epoch.update(temp_val)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_epoch_final = max(acc_val_epoch, key=acc_val_epoch.get)\r\n","print(\"best epoch is \",sel_epoch_final)\r\n","\r\n","df_epoch_train = pd.DataFrame(list(acc_train_epoch.items()), columns=['Epochs', 'Accuracy score'])\r\n","df_epoch_val = pd.DataFrame(list(acc_val_epoch.items()), columns=['Epochs', 'Accuracy score'])\r\n","\r\n","df_epoch_val.Epochs = df_epoch_val.Epochs.map(lambda x:str(x))\r\n","df_epoch_train.Epochs = df_epoch_train.Epochs.map(lambda x:str(x))\r\n","\r\n","plt.figure()\r\n","plt.plot(df_epoch_train.iloc[:,0],df_epoch_train.iloc[:,1],c=\"r\",label=\"train\",linestyle='--', marker='o')\r\n","plt.plot(df_epoch_val.iloc[:,0],df_epoch_val.iloc[:,1],c=\"b\",label = \"val\",linestyle='--', marker='o')\r\n","plt.title(\"Accuracy score vs Epochs\")\r\n","plt.ylabel(\"Accuracy score\")\r\n","plt.xlabel(\"Epochs\")\r\n","plt.legend()\r\n","plt.savefig(\"images/acc-epoch-glove-\"+case, bbox_inches='tight',dpi = 200)\r\n","\r\n","\r\n","# 4. graph batch size vs accuracy score\r\n","acc_train_batch = {}\r\n","acc_val_batch = {}\r\n","for i in batchsize:\r\n"," history, model = rnn_keras(sel_activation_final,sel_optimizer_final,sel_epoch_final,i)\r\n"," temp_train = {i:model.evaluate(X_train,y_train)[1]}\r\n"," temp_val = {i:model.evaluate(X_val,y_val)[1]}\r\n"," acc_train_batch.update(temp_train)\r\n"," acc_val_batch.update(temp_val)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_batch_final = max(acc_val_batch, key=acc_val_batch.get)\r\n","print(\"best batchsize is \",sel_batch_final)\r\n","\r\n","df_batch_train = pd.DataFrame(list(acc_train_batch.items()), columns=['Batchsize', 'Accuracy score'])\r\n","df_batch_val = pd.DataFrame(list(acc_val_batch.items()), columns=['Batchsize', 'Accuracy score'])\r\n","\r\n","df_batch_val.Batchsize = df_batch_val.Batchsize.map(lambda x:str(x))\r\n","df_batch_train.Batchsize = df_batch_train.Batchsize.map(lambda x:str(x))\r\n","\r\n","plt.figure()\r\n","plt.plot(df_batch_train.iloc[:,0],df_batch_train.iloc[:,1],c=\"r\",label=\"train\",linestyle='--', marker='o')\r\n","plt.plot(df_batch_val.iloc[:,0],df_batch_val.iloc[:,1],c=\"b\",label = \"val\",linestyle='--', marker='o')\r\n","plt.title(\"Accuracy score vs Batchsize\")\r\n","plt.ylabel(\"Accuracy score\")\r\n","plt.xlabel(\"Batchsize\")\r\n","plt.legend()\r\n","plt.savefig(\"images/acc-batch-glove-\"+case, bbox_inches='tight',dpi = 200)\r\n","\r\n","# 5. best model\r\n","t0 = time()\r\n","history, model = rnn_keras(sel_activation_final,sel_optimizer_final,sel_epoch_final,sel_batch_final)\r\n","pred = np.argmax(model.predict(X_test), axis=-1)\r\n","print(\"test accuracy score = \",accuracy_score(y_pred=pred, y_true=y_test))\r\n","t1 = time()\r\n","print(\"time taken is \", t1-t0)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["129/129 [==============================] - 1s 9ms/step - loss: 1.2387 - accuracy: 0.6366\n","best activation function is tanh\n","129/129 [==============================] - 1s 9ms/step - loss: 1.1789 - accuracy: 0.5961\n","129/129 [==============================] - 1s 9ms/step - loss: 0.9554 - accuracy: 0.5245\n","129/129 [==============================] - 1s 9ms/step - loss: 0.9616 - accuracy: 0.6339\n","129/129 [==============================] - 1s 9ms/step - loss: 1.0851 - accuracy: 0.4042\n","best optimizer is RMSprop\n","602/602 [==============================] - 5s 9ms/step - loss: 0.2977 - accuracy: 0.8977\n","129/129 [==============================] - 1s 9ms/step - loss: 0.9371 - accuracy: 0.6395\n","602/602 [==============================] - 5s 9ms/step - loss: 0.1199 - accuracy: 0.9614\n","129/129 [==============================] - 1s 9ms/step - loss: 1.3572 - accuracy: 0.6157\n","602/602 [==============================] - 5s 9ms/step - loss: 0.0772 - accuracy: 0.9755\n","129/129 [==============================] - 1s 9ms/step - loss: 1.6694 - accuracy: 0.5873\n","602/602 [==============================] - 5s 9ms/step - loss: 0.0516 - accuracy: 0.9839\n","129/129 [==============================] - 1s 9ms/step - loss: 2.1405 - accuracy: 0.5633\n","best epoch is 5\n","602/602 [==============================] - 5s 9ms/step - loss: 0.4626 - accuracy: 0.8178\n","129/129 [==============================] - 1s 9ms/step - loss: 0.8269 - accuracy: 0.6664\n","602/602 [==============================] - 5s 9ms/step - loss: 0.2892 - accuracy: 0.8995\n","129/129 [==============================] - 1s 9ms/step - loss: 0.9192 - accuracy: 0.6422\n","602/602 [==============================] - 5s 9ms/step - loss: 0.2157 - accuracy: 0.9256\n","129/129 [==============================] - 1s 9ms/step - loss: 1.0571 - accuracy: 0.6359\n","602/602 [==============================] - 5s 9ms/step - loss: 0.2357 - accuracy: 0.9196\n","129/129 [==============================] - 1s 9ms/step - loss: 1.0123 - accuracy: 0.6402\n"," 73/602 [==>...........................] - ETA: 4s - loss: 0.2410 - accuracy: 0.9259"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"M-L-vb5IOtQH"},"source":[""],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"m9U3sIZIOtSp"},"source":[""],"execution_count":null,"outputs":[]}]} -------------------------------------------------------------------------------- /5. GRU.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"accelerator":"GPU","colab":{"name":"5. GRU.ipynb","provenance":[],"collapsed_sections":[]},"kernelspec":{"display_name":"Python 3","name":"python3"}},"cells":[{"cell_type":"code","metadata":{"id":"XnIpJnkHuT-D"},"source":["import pandas as pd\r\n","import os\r\n","import numpy as np\r\n","from sklearn.model_selection import train_test_split\r\n","import gensim\r\n","from gensim.models.word2vec import Word2Vec\r\n","import gensim.downloader as api\r\n","from keras.utils import to_categorical\r\n","import matplotlib.pyplot as plt \r\n","import keras\r\n","from time import time"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":419},"id":"VijxsP322W3W","executionInfo":{"status":"ok","timestamp":1609347653641,"user_tz":-60,"elapsed":3803,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"892c309f-7134-4583-cde3-5f2b53018c99"},"source":["df = pd.read_csv(\"data/preprocessed_train.csv\")\r\n","df"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
textIDtextselected_textsentiment
0cb774db0d1id have responded if i were goingid have responded if i were goingneutral
1549e992a42sooo sad i will miss you here in san diegosooo sadnegative
2088c60f138my boss is bullying mebullying menegative
39642c003efwhat interview leave me aloneleave me alonenegative
4358bd9e861sons of why couldnt they put them on the rele...sons ofnegative
...............
274764eac33d1c0wish we could come see u on denver husband los...d lostnegative
274774f4c4fc327ive wondered about rake to the client has made...dont forcenegative
27478f67aae2310yay good for both of you enjoy the break you p...yay good for both of youpositive
27479ed167662a5but it was worth itbut it was worth itpositive
274806f7127d9d7all this flirting going on the atg smiles yay ...all this flirting going on the atg smiles yay ...neutral
\n","

27481 rows × 4 columns

\n","
"],"text/plain":[" textID ... sentiment\n","0 cb774db0d1 ... neutral\n","1 549e992a42 ... negative\n","2 088c60f138 ... negative\n","3 9642c003ef ... negative\n","4 358bd9e861 ... negative\n","... ... ... ...\n","27476 4eac33d1c0 ... negative\n","27477 4f4c4fc327 ... negative\n","27478 f67aae2310 ... positive\n","27479 ed167662a5 ... positive\n","27480 6f7127d9d7 ... neutral\n","\n","[27481 rows x 4 columns]"]},"metadata":{"tags":[]},"execution_count":9}]},{"cell_type":"code","metadata":{"id":"sEBirsml1Hgu"},"source":["# for case 1 run this code (case 1 = text)\r\n","case = \"case1-gru\"\r\n","\r\n","#read data\r\n","df = pd.read_csv(\"data/preprocessed_train.csv\")\r\n","df.text = df.text.map(lambda x:str(x))\r\n","df.sentiment = df.sentiment.astype(\"category\")\r\n","df.sentiment = df.sentiment.cat.codes"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"wxc2J9Gr2bQ-"},"source":["# for case 2 run this code (case 2 = selected text)\r\n","case = \"case2-gru\"\r\n","\r\n","#read data\r\n","df = pd.read_csv(\"data/preprocessed_train.csv\")\r\n","df.text = df.selected_text.map(lambda x:str(x))\r\n","df.sentiment = df.sentiment.astype(\"category\")\r\n","df.sentiment = df.sentiment.cat.codes"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Kiv4fMpy2wVQ"},"source":["# train, val, test split\r\n","x_train, xtest, y_train, ytest = train_test_split(df.text.values, df.sentiment.values,stratify=df.sentiment.values, test_size=0.3,random_state=1)\r\n","y_train = to_categorical(y_train)\r\n","x_val = xtest[0:4122]\r\n","y_val = to_categorical(ytest[0:4122])\r\n","x_test = xtest[4122:]\r\n","y_test = ytest[4122:]\r\n","\r\n","#padding and tokenizing\r\n","from keras.preprocessing.text import Tokenizer\r\n","from keras.preprocessing.sequence import pad_sequences\r\n","\r\n","tokenizer = Tokenizer(num_words=5000)\r\n","tokenizer.fit_on_texts(df.text.values)\r\n","\r\n","X_train = tokenizer.texts_to_sequences(x_train)\r\n","X_val = tokenizer.texts_to_sequences(x_val)\r\n","X_test = tokenizer.texts_to_sequences(x_test)\r\n","\r\n","vocab_size = len(tokenizer.word_index) + 1\r\n","\r\n","maxlen = 100\r\n","\r\n","X_train = pad_sequences(X_train, padding='pre', maxlen=maxlen)\r\n","X_val = pad_sequences(X_val, padding='pre', maxlen=maxlen)\r\n","X_test = pad_sequences(X_test, padding='pre', maxlen=maxlen)\r\n","\r\n","word_index = tokenizer.word_index"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"MfchPQ_iuUHb"},"source":["#import glove embeddings\r\n","\r\n","embeddings_index = {}\r\n","f = open(os.path.join( 'glove.twitter.27B.100d.txt'))\r\n","for line in f:\r\n"," values = line.split()\r\n"," word = values[0]\r\n"," coefs = np.asarray(values[1:], dtype='float32')\r\n"," embeddings_index[word] = coefs\r\n","f.close()\r\n","\r\n","embedding_matrix = np.zeros((len(word_index) + 1, 100))\r\n","for word, i in word_index.items():\r\n"," embedding_vector = embeddings_index.get(word)\r\n"," if embedding_vector is not None:\r\n"," # words not found in embedding index will be all-zeros.\r\n"," embedding_matrix[i] = embedding_vector"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Z4oLKEuduUTR"},"source":["#using glove\r\n","\r\n","from keras.models import Sequential\r\n","from keras import regularizers\r\n","from keras.layers.core import Dense, Dropout, Flatten\r\n","from keras import layers\r\n","from sklearn.metrics import accuracy_score, f1_score\r\n","from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D\r\n","\r\n","\r\n","def gru_glove(activation,optimizer,epochs,batchsize):\r\n"," embedding_dim = 100\r\n","\r\n"," model = Sequential()\r\n"," model.add(layers.Embedding(input_dim=vocab_size, \r\n"," output_dim=embedding_dim, weights=[embedding_matrix],\r\n"," input_length=maxlen))\r\n"," model.add(layers.GRU(64))\r\n"," model.add(Dense(3,activation='softmax'))\r\n"," model.compile(optimizer=optimizer,\r\n"," loss='categorical_crossentropy',\r\n"," metrics=['accuracy'])\r\n"," history = model.fit(X_train, y_train,\r\n"," epochs=epochs,\r\n"," verbose=0,\r\n"," validation_data=(X_val, y_val),\r\n"," batch_size=batchsize)\r\n"," \r\n"," return history, model"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"DD3YOLNLfVq5"},"source":["activation = [ \"tanh\"]\r\n","optimizer = [\"adam\", \"SGD\", \"RMSprop\", \"Adadelta\"]\r\n","epochs = [5,10,15,20]\r\n","batchsize = [8,16,32,64,128]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"dk16QKlGk3y7","executionInfo":{"status":"error","timestamp":1609240215657,"user_tz":-60,"elapsed":1240623,"user":{"displayName":"Rohith Teja","photoUrl":"","userId":"15087575277418902762"}},"outputId":"c5936249-c3bc-4228-f48b-996d330336da"},"source":["#experiments using glove embeddings\r\n","\r\n","# 1. selecting activation fixing - optimizer = adam, epochs = 5, batch = 16\r\n","sel_activation = {}\r\n","for i in activation:\r\n"," history, model = gru_glove(i,\"adam\",5,16)\r\n"," temp = {i:model.evaluate(X_val,y_val)[1]}\r\n"," sel_activation.update(temp)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_activation_final = max(sel_activation, key=sel_activation.get)\r\n","print(\"best activation function is \",sel_activation_final)\r\n","\r\n","# 2. selecting optimizer by fixing - activation = best, epochs = 5, batch = 16\r\n","sel_optimizer = {}\r\n","for i in optimizer:\r\n"," history, model = gru_glove(sel_activation_final,i,5,16)\r\n"," temp = {i:model.evaluate(X_val,y_val)[1]}\r\n"," sel_optimizer.update(temp)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_optimizer_final = max(sel_optimizer, key=sel_optimizer.get)\r\n","print(\"best optimizer is \",sel_optimizer_final)\r\n","\r\n","# 3. graph epoch vs accuracy score\r\n","\r\n","acc_train_epoch = {}\r\n","acc_val_epoch = {}\r\n","for i in epochs:\r\n"," history, model = gru_glove(sel_activation_final,sel_optimizer_final,i,16)\r\n"," temp_train = {i:model.evaluate(X_train,y_train)[1]}\r\n"," temp_val = {i:model.evaluate(X_val,y_val)[1]}\r\n"," acc_train_epoch.update(temp_train)\r\n"," acc_val_epoch.update(temp_val)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_epoch_final = max(acc_val_epoch, key=acc_val_epoch.get)\r\n","print(\"best epoch is \",sel_epoch_final)\r\n","\r\n","df_epoch_train = pd.DataFrame(list(acc_train_epoch.items()), columns=['Epochs', 'Accuracy score'])\r\n","df_epoch_val = pd.DataFrame(list(acc_val_epoch.items()), columns=['Epochs', 'Accuracy score'])\r\n","\r\n","df_epoch_val.Epochs = df_epoch_val.Epochs.map(lambda x:str(x))\r\n","df_epoch_train.Epochs = df_epoch_train.Epochs.map(lambda x:str(x))\r\n","\r\n","\r\n","plt.figure()\r\n","plt.plot(df_epoch_train.iloc[:,0],df_epoch_train.iloc[:,1],c=\"r\",label=\"train\",linestyle='--', marker='o')\r\n","plt.plot(df_epoch_val.iloc[:,0],df_epoch_val.iloc[:,1],c=\"b\",label = \"val\",linestyle='--', marker='o')\r\n","plt.title(\"Accuracy score vs Epochs\")\r\n","plt.ylabel(\"Accuracy score\")\r\n","plt.xlabel(\"Epochs\")\r\n","plt.legend()\r\n","plt.savefig(\"images/acc-epoch-glove-\"+case, bbox_inches='tight',dpi = 200)\r\n","\r\n","\r\n","# 4. graph batch size vs accuracy score\r\n","acc_train_batch = {}\r\n","acc_val_batch = {}\r\n","for i in batchsize:\r\n"," history, model = gru_glove(sel_activation_final,sel_optimizer_final,sel_epoch_final,i)\r\n"," temp_train = {i:model.evaluate(X_train,y_train)[1]}\r\n"," temp_val = {i:model.evaluate(X_val,y_val)[1]}\r\n"," acc_train_batch.update(temp_train)\r\n"," acc_val_batch.update(temp_val)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_batch_final = max(acc_val_batch, key=acc_val_batch.get)\r\n","print(\"best batchsize is \",sel_batch_final)\r\n","\r\n","df_batch_train = pd.DataFrame(list(acc_train_batch.items()), columns=['Batchsize', 'Accuracy score'])\r\n","df_batch_val = pd.DataFrame(list(acc_val_batch.items()), columns=['Batchsize', 'Accuracy score'])\r\n","\r\n","df_batch_val.Batchsize = df_batch_val.Batchsize.map(lambda x:str(x))\r\n","df_batch_train.Batchsize = df_batch_train.Batchsize.map(lambda x:str(x))\r\n","\r\n","plt.figure()\r\n","plt.plot(df_batch_train.iloc[:,0],df_batch_train.iloc[:,1],c=\"r\",label=\"train\",linestyle='--', marker='o')\r\n","plt.plot(df_batch_val.iloc[:,0],df_batch_val.iloc[:,1],c=\"b\",label = \"val\",linestyle='--', marker='o')\r\n","plt.title(\"Accuracy score vs Batchsize\")\r\n","plt.ylabel(\"Accuracy score\")\r\n","plt.xlabel(\"Batchsize\")\r\n","plt.legend()\r\n","plt.savefig(\"images/acc-batch-glove-\"+case, bbox_inches='tight',dpi = 200)\r\n","\r\n","# 5. best model\r\n","t0 = time()\r\n","history, model = gru_glove(sel_activation_final,sel_optimizer_final,sel_epoch_final,sel_batch_final)\r\n","pred = np.argmax(model.predict(X_test), axis=-1)\r\n","print(\"test accuracy score = \",accuracy_score(y_pred=pred, y_true=y_test))\r\n","t1 = time()\r\n","print(\"time taken is \", t1-t0)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["129/129 [==============================] - 1s 4ms/step - loss: 0.8080 - accuracy: 0.7152\n","best activation function is tanh\n","129/129 [==============================] - 1s 4ms/step - loss: 0.7805 - accuracy: 0.7135\n","129/129 [==============================] - 1s 4ms/step - loss: 0.7485 - accuracy: 0.6773\n","129/129 [==============================] - 1s 4ms/step - loss: 0.6540 - accuracy: 0.7368\n","129/129 [==============================] - 1s 4ms/step - loss: 1.0742 - accuracy: 0.4022\n","best optimizer is RMSprop\n","602/602 [==============================] - 3s 4ms/step - loss: 0.4555 - accuracy: 0.8216\n","129/129 [==============================] - 1s 4ms/step - loss: 0.6553 - accuracy: 0.7336\n","602/602 [==============================] - 3s 4ms/step - loss: 0.2070 - accuracy: 0.9347\n","129/129 [==============================] - 1s 4ms/step - loss: 0.8447 - accuracy: 0.7103\n","602/602 [==============================] - 2s 4ms/step - loss: 0.0582 - accuracy: 0.9842\n","129/129 [==============================] - 1s 4ms/step - loss: 1.3716 - accuracy: 0.6965\n","602/602 [==============================] - 2s 4ms/step - loss: 0.0175 - accuracy: 0.9952\n","129/129 [==============================] - 1s 4ms/step - loss: 1.9760 - accuracy: 0.6783\n","best epoch is 5\n"],"name":"stdout"},{"output_type":"stream","text":["ERROR:root:Internal Python error in the inspect module.\n","Below is the traceback from this internal error.\n","\n"],"name":"stderr"},{"output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py\", line 2882, in run_code\n"," exec(code_obj, self.user_global_ns, self.user_ns)\n"," File \"\", line 61, in \n"," history, model = mlp_glove(sel_activation_final,sel_optimizer_final,sel_epoch_final,i)\n"," File \"\", line 27, in mlp_glove\n"," batch_size=batchsize)\n"," File \"/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py\", line 1117, in fit\n"," self._fit_frame = tf_inspect.currentframe()\n"," File \"/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/tf_inspect.py\", line 95, in currentframe\n"," return _inspect.stack()[1][0]\n"," File \"/usr/lib/python3.6/inspect.py\", line 1501, in stack\n"," return getouterframes(sys._getframe(1), context)\n"," File \"/usr/lib/python3.6/inspect.py\", line 1478, in getouterframes\n"," frameinfo = (frame,) + getframeinfo(frame, context)\n"," File \"/usr/lib/python3.6/inspect.py\", line 1448, in getframeinfo\n"," filename = getsourcefile(frame) or getfile(frame)\n"," File \"/usr/lib/python3.6/inspect.py\", line 696, in getsourcefile\n"," if getattr(getmodule(object, filename), '__loader__', None) is not None:\n"," File \"/usr/lib/python3.6/inspect.py\", line 725, in getmodule\n"," file = getabsfile(object, _filename)\n"," File \"/usr/lib/python3.6/inspect.py\", line 709, in getabsfile\n"," return os.path.normcase(os.path.abspath(_filename))\n"," File \"/usr/lib/python3.6/posixpath.py\", line 383, in abspath\n"," cwd = os.getcwd()\n","FileNotFoundError: [Errno 2] No such file or directory\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py\", line 1823, in showtraceback\n"," stb = value._render_traceback_()\n","AttributeError: 'FileNotFoundError' object has no attribute '_render_traceback_'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/ultratb.py\", line 1132, in get_records\n"," return _fixed_getinnerframes(etb, number_of_lines_of_context, tb_offset)\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/ultratb.py\", line 313, in wrapped\n"," return f(*args, **kwargs)\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/ultratb.py\", line 358, in _fixed_getinnerframes\n"," records = fix_frame_records_filenames(inspect.getinnerframes(etb, context))\n"," File \"/usr/lib/python3.6/inspect.py\", line 1490, in getinnerframes\n"," frameinfo = (tb.tb_frame,) + getframeinfo(tb, context)\n"," File \"/usr/lib/python3.6/inspect.py\", line 1448, in getframeinfo\n"," filename = getsourcefile(frame) or getfile(frame)\n"," File \"/usr/lib/python3.6/inspect.py\", line 696, in getsourcefile\n"," if getattr(getmodule(object, filename), '__loader__', None) is not None:\n"," File \"/usr/lib/python3.6/inspect.py\", line 725, in getmodule\n"," file = getabsfile(object, _filename)\n"," File \"/usr/lib/python3.6/inspect.py\", line 709, in getabsfile\n"," return os.path.normcase(os.path.abspath(_filename))\n"," File \"/usr/lib/python3.6/posixpath.py\", line 383, in abspath\n"," cwd = os.getcwd()\n","FileNotFoundError: [Errno 2] No such file or directory\n"],"name":"stdout"},{"output_type":"error","ename":"FileNotFoundError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m"]},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"code","metadata":{"id":"nH3le1L0ApgP"},"source":["#using keras embedding\r\n","\r\n","def gru_keras(activation,optimizer,epochs,batchsize):\r\n"," embedding_dim = 100\r\n","\r\n"," model = Sequential()\r\n"," model.add(layers.Embedding(input_dim=vocab_size, \r\n"," output_dim=embedding_dim, \r\n"," input_length=maxlen))\r\n"," model.add(layers.GRU(64))\r\n"," model.add(Dense(3,activation='softmax'))\r\n"," model.compile(optimizer=optimizer,\r\n"," loss='categorical_crossentropy',\r\n"," metrics=['accuracy'])\r\n"," history = model.fit(X_train, y_train,\r\n"," epochs=epochs,\r\n"," verbose=0,\r\n"," validation_data=(X_val, y_val),\r\n"," batch_size=batchsize)\r\n"," \r\n"," return history, model"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":1000},"id":"9F36uecY_L9k","executionInfo":{"status":"error","timestamp":1609241682232,"user_tz":-60,"elapsed":1201728,"user":{"displayName":"Rohith Teja","photoUrl":"","userId":"15087575277418902762"}},"outputId":"199f2548-be4c-441e-dcc7-1085876ba53c"},"source":["#experiments using keras embeddings\r\n","\r\n","# 1. selecting activation fixing - optimizer = adam, epochs = 5, batch = 16\r\n","sel_activation = {}\r\n","for i in activation:\r\n"," history, model = gru_keras(i,\"adam\",5,16)\r\n"," temp = {i:model.evaluate(X_val,y_val)[1]}\r\n"," sel_activation.update(temp)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_activation_final = max(sel_activation, key=sel_activation.get)\r\n","print(\"best activation function is \",sel_activation_final)\r\n","\r\n","# 2. selecting optimizer by fixing - activation = best, epochs = 5, batch = 16\r\n","sel_optimizer = {}\r\n","for i in optimizer:\r\n"," history, model = gru_keras(sel_activation_final,i,5,16)\r\n"," temp = {i:model.evaluate(X_val,y_val)[1]}\r\n"," sel_optimizer.update(temp)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_optimizer_final = max(sel_optimizer, key=sel_optimizer.get)\r\n","print(\"best optimizer is \",sel_optimizer_final)\r\n","\r\n","# 3. graph epoch vs accuracy score\r\n","\r\n","acc_train_epoch = {}\r\n","acc_val_epoch = {}\r\n","for i in epochs:\r\n"," history, model = gru_keras(sel_activation_final,sel_optimizer_final,i,16)\r\n"," temp_train = {i:model.evaluate(X_train,y_train)[1]}\r\n"," temp_val = {i:model.evaluate(X_val,y_val)[1]}\r\n"," acc_train_epoch.update(temp_train)\r\n"," acc_val_epoch.update(temp_val)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_epoch_final = max(acc_val_epoch, key=acc_val_epoch.get)\r\n","print(\"best epoch is \",sel_epoch_final)\r\n","\r\n","df_epoch_train = pd.DataFrame(list(acc_train_epoch.items()), columns=['Epochs', 'Accuracy score'])\r\n","df_epoch_val = pd.DataFrame(list(acc_val_epoch.items()), columns=['Epochs', 'Accuracy score'])\r\n","\r\n","df_epoch_val.Epochs = df_epoch_val.Epochs.map(lambda x:str(x))\r\n","df_epoch_train.Epochs = df_epoch_train.Epochs.map(lambda x:str(x))\r\n","\r\n","plt.figure()\r\n","plt.plot(df_epoch_train.iloc[:,0],df_epoch_train.iloc[:,1],c=\"r\",label=\"train\",linestyle='--', marker='o')\r\n","plt.plot(df_epoch_val.iloc[:,0],df_epoch_val.iloc[:,1],c=\"b\",label = \"val\",linestyle='--', marker='o')\r\n","plt.title(\"Accuracy score vs Epochs\")\r\n","plt.ylabel(\"Accuracy score\")\r\n","plt.xlabel(\"Epochs\")\r\n","plt.legend()\r\n","plt.savefig(\"images/acc-epoch-glove-\"+case, bbox_inches='tight',dpi = 200)\r\n","\r\n","\r\n","# 4. graph batch size vs accuracy score\r\n","acc_train_batch = {}\r\n","acc_val_batch = {}\r\n","for i in batchsize:\r\n"," history, model = gru_keras(sel_activation_final,sel_optimizer_final,sel_epoch_final,i)\r\n"," temp_train = {i:model.evaluate(X_train,y_train)[1]}\r\n"," temp_val = {i:model.evaluate(X_val,y_val)[1]}\r\n"," acc_train_batch.update(temp_train)\r\n"," acc_val_batch.update(temp_val)\r\n"," keras.backend.clear_session()\r\n","\r\n","sel_batch_final = max(acc_val_batch, key=acc_val_batch.get)\r\n","print(\"best batchsize is \",sel_batch_final)\r\n","\r\n","df_batch_train = pd.DataFrame(list(acc_train_batch.items()), columns=['Batchsize', 'Accuracy score'])\r\n","df_batch_val = pd.DataFrame(list(acc_val_batch.items()), columns=['Batchsize', 'Accuracy score'])\r\n","\r\n","df_batch_val.Batchsize = df_batch_val.Batchsize.map(lambda x:str(x))\r\n","df_batch_train.Batchsize = df_batch_train.Batchsize.map(lambda x:str(x))\r\n","\r\n","plt.figure()\r\n","plt.plot(df_batch_train.iloc[:,0],df_batch_train.iloc[:,1],c=\"r\",label=\"train\",linestyle='--', marker='o')\r\n","plt.plot(df_batch_val.iloc[:,0],df_batch_val.iloc[:,1],c=\"b\",label = \"val\",linestyle='--', marker='o')\r\n","plt.title(\"Accuracy score vs Batchsize\")\r\n","plt.ylabel(\"Accuracy score\")\r\n","plt.xlabel(\"Batchsize\")\r\n","plt.legend()\r\n","plt.savefig(\"images/acc-batch-glove-\"+case, bbox_inches='tight',dpi = 200)\r\n","\r\n","# 5. best model\r\n","t0 = time()\r\n","history, model = gru_keras(sel_activation_final,sel_optimizer_final,sel_epoch_final,sel_batch_final)\r\n","pred = np.argmax(model.predict(X_test), axis=-1)\r\n","print(\"test accuracy score = \",accuracy_score(y_pred=pred, y_true=y_test))\r\n","t1 = time()\r\n","print(\"time taken is \", t1-t0)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["129/129 [==============================] - 1s 4ms/step - loss: 0.8845 - accuracy: 0.6895\n","best activation function is tanh\n","129/129 [==============================] - 1s 4ms/step - loss: 0.8548 - accuracy: 0.6943\n","129/129 [==============================] - 1s 4ms/step - loss: 1.0620 - accuracy: 0.4328\n","129/129 [==============================] - 1s 4ms/step - loss: 0.6852 - accuracy: 0.7091\n","129/129 [==============================] - 1s 4ms/step - loss: 1.0936 - accuracy: 0.4136\n","best optimizer is RMSprop\n","602/602 [==============================] - 2s 4ms/step - loss: 0.4635 - accuracy: 0.8244\n","129/129 [==============================] - 1s 4ms/step - loss: 0.6777 - accuracy: 0.7254\n","602/602 [==============================] - 2s 4ms/step - loss: 0.3208 - accuracy: 0.8864\n","129/129 [==============================] - 1s 4ms/step - loss: 0.8381 - accuracy: 0.6841\n","602/602 [==============================] - 2s 4ms/step - loss: 0.1924 - accuracy: 0.9357\n","129/129 [==============================] - 1s 4ms/step - loss: 1.0715 - accuracy: 0.6655\n","602/602 [==============================] - 3s 4ms/step - loss: 0.0860 - accuracy: 0.9734\n","129/129 [==============================] - 1s 4ms/step - loss: 1.4457 - accuracy: 0.6531\n","best epoch is 5\n"],"name":"stdout"},{"output_type":"stream","text":["ERROR:root:Internal Python error in the inspect module.\n","Below is the traceback from this internal error.\n","\n"],"name":"stderr"},{"output_type":"stream","text":["Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py\", line 2882, in run_code\n"," exec(code_obj, self.user_global_ns, self.user_ns)\n"," File \"\", line 60, in \n"," history, model = mlp_keras(sel_activation_final,sel_optimizer_final,sel_epoch_final,i)\n"," File \"\", line 19, in mlp_keras\n"," batch_size=batchsize)\n"," File \"/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py\", line 1117, in fit\n"," self._fit_frame = tf_inspect.currentframe()\n"," File \"/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/utils/tf_inspect.py\", line 95, in currentframe\n"," return _inspect.stack()[1][0]\n"," File \"/usr/lib/python3.6/inspect.py\", line 1501, in stack\n"," return getouterframes(sys._getframe(1), context)\n"," File \"/usr/lib/python3.6/inspect.py\", line 1478, in getouterframes\n"," frameinfo = (frame,) + getframeinfo(frame, context)\n"," File \"/usr/lib/python3.6/inspect.py\", line 1448, in getframeinfo\n"," filename = getsourcefile(frame) or getfile(frame)\n"," File \"/usr/lib/python3.6/inspect.py\", line 696, in getsourcefile\n"," if getattr(getmodule(object, filename), '__loader__', None) is not None:\n"," File \"/usr/lib/python3.6/inspect.py\", line 725, in getmodule\n"," file = getabsfile(object, _filename)\n"," File \"/usr/lib/python3.6/inspect.py\", line 709, in getabsfile\n"," return os.path.normcase(os.path.abspath(_filename))\n"," File \"/usr/lib/python3.6/posixpath.py\", line 383, in abspath\n"," cwd = os.getcwd()\n","FileNotFoundError: [Errno 2] No such file or directory\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py\", line 1823, in showtraceback\n"," stb = value._render_traceback_()\n","AttributeError: 'FileNotFoundError' object has no attribute '_render_traceback_'\n","\n","During handling of the above exception, another exception occurred:\n","\n","Traceback (most recent call last):\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/ultratb.py\", line 1132, in get_records\n"," return _fixed_getinnerframes(etb, number_of_lines_of_context, tb_offset)\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/ultratb.py\", line 313, in wrapped\n"," return f(*args, **kwargs)\n"," File \"/usr/local/lib/python3.6/dist-packages/IPython/core/ultratb.py\", line 358, in _fixed_getinnerframes\n"," records = fix_frame_records_filenames(inspect.getinnerframes(etb, context))\n"," File \"/usr/lib/python3.6/inspect.py\", line 1490, in getinnerframes\n"," frameinfo = (tb.tb_frame,) + getframeinfo(tb, context)\n"," File \"/usr/lib/python3.6/inspect.py\", line 1448, in getframeinfo\n"," filename = getsourcefile(frame) or getfile(frame)\n"," File \"/usr/lib/python3.6/inspect.py\", line 696, in getsourcefile\n"," if getattr(getmodule(object, filename), '__loader__', None) is not None:\n"," File \"/usr/lib/python3.6/inspect.py\", line 725, in getmodule\n"," file = getabsfile(object, _filename)\n"," File \"/usr/lib/python3.6/inspect.py\", line 709, in getabsfile\n"," return os.path.normcase(os.path.abspath(_filename))\n"," File \"/usr/lib/python3.6/posixpath.py\", line 383, in abspath\n"," cwd = os.getcwd()\n","FileNotFoundError: [Errno 2] No such file or directory\n"],"name":"stdout"},{"output_type":"error","ename":"FileNotFoundError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m"]},{"output_type":"display_data","data":{"image/png":"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\n","text/plain":["
"]},"metadata":{"tags":[],"needs_background":"light"}}]},{"cell_type":"code","metadata":{"id":"m9U3sIZIOtSp","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1609242538023,"user_tz":-60,"elapsed":134318,"user":{"displayName":"Rohith Teja","photoUrl":"","userId":"15087575277418902762"}},"outputId":"3c1c9faf-ecb6-4ea8-af46-f2590de7ebb3"},"source":["# 5. best model\r\n","t0 = time()\r\n","history, model = mlp_keras(sel_activation_final,sel_optimizer_final,sel_epoch_final,sel_batch_final)\r\n","pred = np.argmax(model.predict(X_test), axis=-1)\r\n","print(\"test accuracy score = \",accuracy_score(y_pred=pred, y_true=y_test))\r\n","t1 = time()\r\n","print(\"time taken is \", t1-t0)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["test accuracy score = 0.7196216347319913\n","time taken is 133.69832515716553\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"RBNS5ShqUqOh"},"source":[""],"execution_count":null,"outputs":[]}]} -------------------------------------------------------------------------------- /8. RoBERTa.ipynb: -------------------------------------------------------------------------------- 1 | {"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"8. RoBERTa.ipynb","provenance":[{"file_id":"1dLIJOZ9Ar0G88j2Sreqg5nokTNm0UAyM","timestamp":1608768028418}],"collapsed_sections":[]},"kernelspec":{"name":"python3","display_name":"Python 3"},"accelerator":"GPU","widgets":{"application/vnd.jupyter.widget-state+json":{"aa165c4c8d4a4bdba30d669f59906d15":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_6ec0c4d438e34833979e9caa837ba5a7","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_14fd1204a16d4c3692e57e2852041c2b","IPY_MODEL_6117124ef56747cb9660a3b0a1320814"]}},"6ec0c4d438e34833979e9caa837ba5a7":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"14fd1204a16d4c3692e57e2852041c2b":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","state":{"_view_name":"ProgressView","style":"IPY_MODEL_18ac3a6a121c4a18910759f5c69e22f1","_dom_classes":[],"description":"Epoch: 100%","_model_name":"FloatProgressModel","bar_style":"success","max":3,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":3,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_36db65bfa8214685b95ea2ea46b81bda"}},"6117124ef56747cb9660a3b0a1320814":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","state":{"_view_name":"HTMLView","style":"IPY_MODEL_244e5d1e610e4e7180f83fa6e3ab8ab7","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"​","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 3/3 [12:23<00:00, 248.00s/it]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_e803ea8467d848888de63596f4ee1920"}},"18ac3a6a121c4a18910759f5c69e22f1":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"initial","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"36db65bfa8214685b95ea2ea46b81bda":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"244e5d1e610e4e7180f83fa6e3ab8ab7":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"e803ea8467d848888de63596f4ee1920":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"dc452a3c7a0842309e44f5a32c1b82bd":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_e8412f4d3b8e46ab81d4f301157f00be","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_e8a92849a76642a7ab2b186ae0df4ae7","IPY_MODEL_eaa7ef95bed7416aa97237bcff09b7af"]}},"e8412f4d3b8e46ab81d4f301157f00be":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"e8a92849a76642a7ab2b186ae0df4ae7":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","state":{"_view_name":"ProgressView","style":"IPY_MODEL_853d9a7b580a474aafa0941123ff863b","_dom_classes":[],"description":"Iteration: 100%","_model_name":"FloatProgressModel","bar_style":"success","max":2405,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":2405,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_4f78a0941ba24435b1ad3f9de377fcd7"}},"eaa7ef95bed7416aa97237bcff09b7af":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","state":{"_view_name":"HTMLView","style":"IPY_MODEL_3a2ae730cb3d470ab40b96c8e4e67058","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"​","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 2405/2405 [12:23<00:00, 3.23it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_ead4e7718c7a497bb0bc54fe8e19ae35"}},"853d9a7b580a474aafa0941123ff863b":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"initial","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"4f78a0941ba24435b1ad3f9de377fcd7":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"3a2ae730cb3d470ab40b96c8e4e67058":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"ead4e7718c7a497bb0bc54fe8e19ae35":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"ca3c971fe77d454eaf3179146487dc44":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_82b8beb2e5284052846d9e1a554b65e2","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_cd664e45c6b24bc791ab4c063dd97b01","IPY_MODEL_866d76086148468f8409464495f5b65e"]}},"82b8beb2e5284052846d9e1a554b65e2":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"cd664e45c6b24bc791ab4c063dd97b01":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","state":{"_view_name":"ProgressView","style":"IPY_MODEL_a125e2c861bf40f88ec5448bb0ac14a4","_dom_classes":[],"description":"Iteration: 100%","_model_name":"FloatProgressModel","bar_style":"success","max":2405,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":2405,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_aa163f956a7a48669f70ebbc50912fa9"}},"866d76086148468f8409464495f5b65e":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","state":{"_view_name":"HTMLView","style":"IPY_MODEL_aff54d05e66d4eddb83fec133c002263","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"​","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 2405/2405 [09:09<00:00, 4.38it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_305cb5e80a6943e6a714908a088c0398"}},"a125e2c861bf40f88ec5448bb0ac14a4":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"initial","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"aa163f956a7a48669f70ebbc50912fa9":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"aff54d05e66d4eddb83fec133c002263":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"305cb5e80a6943e6a714908a088c0398":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"c980297feeca4330a7ec8cd7b3611d63":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_738d1f6643bb4d0784fc279254b24134","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_43dd7167468747d9aac84ae9a003e42f","IPY_MODEL_91a9349ed14b49cea0bd1d2762dfa7cf"]}},"738d1f6643bb4d0784fc279254b24134":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"43dd7167468747d9aac84ae9a003e42f":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","state":{"_view_name":"ProgressView","style":"IPY_MODEL_3f1bbd86cedd44d79d5b9bbb1f502bd4","_dom_classes":[],"description":"Iteration: 100%","_model_name":"FloatProgressModel","bar_style":"success","max":2405,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":2405,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_142219a840f3408d9b951aa884fa4362"}},"91a9349ed14b49cea0bd1d2762dfa7cf":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","state":{"_view_name":"HTMLView","style":"IPY_MODEL_b75ec03a81894ce6a13e232ad16222ab","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"​","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 2405/2405 [05:54<00:00, 6.79it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_638ece11c7014635a228491add1be51d"}},"3f1bbd86cedd44d79d5b9bbb1f502bd4":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"initial","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"142219a840f3408d9b951aa884fa4362":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"b75ec03a81894ce6a13e232ad16222ab":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"638ece11c7014635a228491add1be51d":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"dfcc3e8bb29142aaaf0cf2a9d4ecce92":{"model_module":"@jupyter-widgets/controls","model_name":"HBoxModel","state":{"_view_name":"HBoxView","_dom_classes":[],"_model_name":"HBoxModel","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.5.0","box_style":"","layout":"IPY_MODEL_1acce1360fef474aa86b9abd11d6faab","_model_module":"@jupyter-widgets/controls","children":["IPY_MODEL_1cd501aa81f345d185b19a3f741e50d4","IPY_MODEL_500f8f5204db452f9ec05c1e392eeb00"]}},"1acce1360fef474aa86b9abd11d6faab":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"1cd501aa81f345d185b19a3f741e50d4":{"model_module":"@jupyter-widgets/controls","model_name":"FloatProgressModel","state":{"_view_name":"ProgressView","style":"IPY_MODEL_ca515671c27c4905834982fd360c6649","_dom_classes":[],"description":"Evaluating: 100%","_model_name":"FloatProgressModel","bar_style":"success","max":685,"_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":685,"_view_count":null,"_view_module_version":"1.5.0","orientation":"horizontal","min":0,"description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_368dd39a241b4903ae2a084be4697c7a"}},"500f8f5204db452f9ec05c1e392eeb00":{"model_module":"@jupyter-widgets/controls","model_name":"HTMLModel","state":{"_view_name":"HTMLView","style":"IPY_MODEL_d35c7207643f49dfa3b1f4fb6a81de81","_dom_classes":[],"description":"","_model_name":"HTMLModel","placeholder":"​","_view_module":"@jupyter-widgets/controls","_model_module_version":"1.5.0","value":" 685/685 [00:40<00:00, 16.86it/s]","_view_count":null,"_view_module_version":"1.5.0","description_tooltip":null,"_model_module":"@jupyter-widgets/controls","layout":"IPY_MODEL_f9f7fb247b0a41a0b25eef76e8337cd8"}},"ca515671c27c4905834982fd360c6649":{"model_module":"@jupyter-widgets/controls","model_name":"ProgressStyleModel","state":{"_view_name":"StyleView","_model_name":"ProgressStyleModel","description_width":"initial","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","bar_color":null,"_model_module":"@jupyter-widgets/controls"}},"368dd39a241b4903ae2a084be4697c7a":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}},"d35c7207643f49dfa3b1f4fb6a81de81":{"model_module":"@jupyter-widgets/controls","model_name":"DescriptionStyleModel","state":{"_view_name":"StyleView","_model_name":"DescriptionStyleModel","description_width":"","_view_module":"@jupyter-widgets/base","_model_module_version":"1.5.0","_view_count":null,"_view_module_version":"1.2.0","_model_module":"@jupyter-widgets/controls"}},"f9f7fb247b0a41a0b25eef76e8337cd8":{"model_module":"@jupyter-widgets/base","model_name":"LayoutModel","state":{"_view_name":"LayoutView","grid_template_rows":null,"right":null,"justify_content":null,"_view_module":"@jupyter-widgets/base","overflow":null,"_model_module_version":"1.2.0","_view_count":null,"flex_flow":null,"width":null,"min_width":null,"border":null,"align_items":null,"bottom":null,"_model_module":"@jupyter-widgets/base","top":null,"grid_column":null,"overflow_y":null,"overflow_x":null,"grid_auto_flow":null,"grid_area":null,"grid_template_columns":null,"flex":null,"_model_name":"LayoutModel","justify_items":null,"grid_row":null,"max_height":null,"align_content":null,"visibility":null,"align_self":null,"height":null,"min_height":null,"padding":null,"grid_auto_rows":null,"grid_gap":null,"max_width":null,"order":null,"_view_module_version":"1.2.0","grid_template_areas":null,"object_position":null,"object_fit":null,"grid_auto_columns":null,"margin":null,"display":null,"left":null}}}}},"cells":[{"cell_type":"code","metadata":{"id":"gxAkXurO4ed2"},"source":["!pip install transformers"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"969WOYVB4sMG"},"source":["import csv\r\n","import os\r\n","import random\r\n","from pathlib import Path\r\n","import numpy as np\r\n","import pandas as pd\r\n","import torch\r\n","from torch.utils.data import (DataLoader, RandomSampler, SequentialSampler,\r\n"," TensorDataset)\r\n","from torch.utils.data.distributed import DistributedSampler\r\n","from transformers import RobertaConfig, RobertaForSequenceClassification, RobertaTokenizer\r\n","from transformers import AdamW, get_linear_schedule_with_warmup\r\n","from tqdm import tqdm, trange, tqdm_notebook\r\n","from sklearn.metrics import matthews_corrcoef, f1_score"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":419},"id":"Q1QTMaFx40y0","executionInfo":{"status":"ok","timestamp":1609351260576,"user_tz":-60,"elapsed":2756,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"89f9c425-4584-4117-a5ea-11c53e7ab63a"},"source":["dataset = pd.read_csv(\"data/preprocessed_train.csv\")\r\n","dataset"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
textIDtextselected_textsentiment
0cb774db0d1id have responded if i were goingid have responded if i were goingneutral
1549e992a42sooo sad i will miss you here in san diegosooo sadnegative
2088c60f138my boss is bullying mebullying menegative
39642c003efwhat interview leave me aloneleave me alonenegative
4358bd9e861sons of why couldnt they put them on the rele...sons ofnegative
...............
274764eac33d1c0wish we could come see u on denver husband los...d lostnegative
274774f4c4fc327ive wondered about rake to the client has made...dont forcenegative
27478f67aae2310yay good for both of you enjoy the break you p...yay good for both of youpositive
27479ed167662a5but it was worth itbut it was worth itpositive
274806f7127d9d7all this flirting going on the atg smiles yay ...all this flirting going on the atg smiles yay ...neutral
\n","

27481 rows × 4 columns

\n","
"],"text/plain":[" textID ... sentiment\n","0 cb774db0d1 ... neutral\n","1 549e992a42 ... negative\n","2 088c60f138 ... negative\n","3 9642c003ef ... negative\n","4 358bd9e861 ... negative\n","... ... ... ...\n","27476 4eac33d1c0 ... negative\n","27477 4f4c4fc327 ... negative\n","27478 f67aae2310 ... positive\n","27479 ed167662a5 ... positive\n","27480 6f7127d9d7 ... neutral\n","\n","[27481 rows x 4 columns]"]},"metadata":{"tags":[]},"execution_count":7}]},{"cell_type":"code","metadata":{"id":"o8f8_Z0kz4iO"},"source":["dataset.dropna(inplace=True)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":419},"id":"ZUrUmrmjz4k1","executionInfo":{"status":"ok","timestamp":1609351552294,"user_tz":-60,"elapsed":1327,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"05f304a9-8b0d-4a6d-a1d9-7e5f1954d3c9"},"source":["dataset"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
textIDtextselected_textsentiment
0cb774db0d1id have responded if i were goingid have responded if i were goingneutral
1549e992a42sooo sad i will miss you here in san diegosooo sadnegative
2088c60f138my boss is bullying mebullying menegative
39642c003efwhat interview leave me aloneleave me alonenegative
4358bd9e861sons of why couldnt they put them on the rele...sons ofnegative
...............
274764eac33d1c0wish we could come see u on denver husband los...d lostnegative
274774f4c4fc327ive wondered about rake to the client has made...dont forcenegative
27478f67aae2310yay good for both of you enjoy the break you p...yay good for both of youpositive
27479ed167662a5but it was worth itbut it was worth itpositive
274806f7127d9d7all this flirting going on the atg smiles yay ...all this flirting going on the atg smiles yay ...neutral
\n","

27383 rows × 4 columns

\n","
"],"text/plain":[" textID ... sentiment\n","0 cb774db0d1 ... neutral\n","1 549e992a42 ... negative\n","2 088c60f138 ... negative\n","3 9642c003ef ... negative\n","4 358bd9e861 ... negative\n","... ... ... ...\n","27476 4eac33d1c0 ... negative\n","27477 4f4c4fc327 ... negative\n","27478 f67aae2310 ... positive\n","27479 ed167662a5 ... positive\n","27480 6f7127d9d7 ... neutral\n","\n","[27383 rows x 4 columns]"]},"metadata":{"tags":[]},"execution_count":16}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":390},"id":"dpwDnTHA48Vc","executionInfo":{"status":"ok","timestamp":1609351584653,"user_tz":-60,"elapsed":650,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"2c4a04fa-dc6e-41bb-9561-600cdec6ff08"},"source":["from sklearn.preprocessing import OrdinalEncoder\r\n","\r\n","ord_enc = OrdinalEncoder()\r\n","dataset[\"label\"] = ord_enc.fit_transform(dataset[[\"sentiment\"]])\r\n","dataset[[\"sentiment\", \"label\"]].head(11)"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
sentimentlabel
0neutral1.0
1negative0.0
2negative0.0
3negative0.0
4negative0.0
5neutral1.0
6positive2.0
7neutral1.0
8neutral1.0
9positive2.0
10neutral1.0
\n","
"],"text/plain":[" sentiment label\n","0 neutral 1.0\n","1 negative 0.0\n","2 negative 0.0\n","3 negative 0.0\n","4 negative 0.0\n","5 neutral 1.0\n","6 positive 2.0\n","7 neutral 1.0\n","8 neutral 1.0\n","9 positive 2.0\n","10 neutral 1.0"]},"metadata":{"tags":[]},"execution_count":17}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":204},"id":"aki1pDzn50hg","executionInfo":{"status":"ok","timestamp":1609351588399,"user_tz":-60,"elapsed":826,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"0341f255-8c00-4abf-e14a-2cca6c47a15c"},"source":["dataset.head()"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
textIDtextselected_textsentimentlabel
0cb774db0d1id have responded if i were goingid have responded if i were goingneutral1.0
1549e992a42sooo sad i will miss you here in san diegosooo sadnegative0.0
2088c60f138my boss is bullying mebullying menegative0.0
39642c003efwhat interview leave me aloneleave me alonenegative0.0
4358bd9e861sons of why couldnt they put them on the rele...sons ofnegative0.0
\n","
"],"text/plain":[" textID ... label\n","0 cb774db0d1 ... 1.0\n","1 549e992a42 ... 0.0\n","2 088c60f138 ... 0.0\n","3 9642c003ef ... 0.0\n","4 358bd9e861 ... 0.0\n","\n","[5 rows x 5 columns]"]},"metadata":{"tags":[]},"execution_count":18}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"0TyOfPIu6EtO","executionInfo":{"status":"ok","timestamp":1609351590803,"user_tz":-60,"elapsed":1078,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"e29cdb51-b9c5-49f8-9aaa-bdacfc6858bf"},"source":["dataset.shape"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(27383, 5)"]},"metadata":{"tags":[]},"execution_count":19}]},{"cell_type":"code","metadata":{"id":"9swHoSGh_QlL"},"source":["#run this for case 1\r\n","dataset = dataset[['text','label']]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"3aJkeeC_SWrr"},"source":["#run this for case 2\r\n","dataset = dataset[['selected_text','label']]"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":204},"id":"R_GWhFJ5_W4E","executionInfo":{"status":"ok","timestamp":1609351593576,"user_tz":-60,"elapsed":706,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"b52c05a0-a01d-48b7-b686-4677ecf6a98f"},"source":["dataset.head()"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/html":["
\n","\n","\n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n"," \n","
textlabel
0id have responded if i were going1.0
1sooo sad i will miss you here in san diego0.0
2my boss is bullying me0.0
3what interview leave me alone0.0
4sons of why couldnt they put them on the rele...0.0
\n","
"],"text/plain":[" text label\n","0 id have responded if i were going 1.0\n","1 sooo sad i will miss you here in san diego 0.0\n","2 my boss is bullying me 0.0\n","3 what interview leave me alone 0.0\n","4 sons of why couldnt they put them on the rele... 0.0"]},"metadata":{"tags":[]},"execution_count":21}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"0CPo45-w54ez","executionInfo":{"status":"ok","timestamp":1609352321768,"user_tz":-60,"elapsed":1212,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"2950eeae-4f0b-49f5-f858-2ff548f30a8a"},"source":["#train and val split\r\n","\r\n","train_df = dataset.iloc[:19236]\r\n","vall_df = dataset.iloc[19236:]\r\n","train_df.shape, vall_df.shape"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["((19236, 2), (8147, 2))"]},"metadata":{"tags":[]},"execution_count":43}]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"hDlLFDsM38qS","executionInfo":{"status":"ok","timestamp":1609352336462,"user_tz":-60,"elapsed":1286,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"50042d0e-8947-4fa6-9597-9da6d2fb2ce8"},"source":["#val test split\r\n","\r\n","val_df = vall_df.iloc[:4122]\r\n","test_df = vall_df.iloc[4122:]\r\n","val_df.shape, test_df.shape"],"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["((4122, 2), (4025, 2))"]},"metadata":{"tags":[]},"execution_count":44}]},{"cell_type":"code","metadata":{"id":"nBYKVQtm7qQx"},"source":["save_dir = \"data/\"\r\n","train_df.to_csv(save_dir + \"train.csv\", index=False)\r\n","val_df.to_csv(save_dir + \"dev.csv\", index=False)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Im_CMsfg7XML"},"source":["test_df.to_csv(save_dir + \"test.csv\", index=False)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"sGZz9CDp6Nmq"},"source":["class InputExample(object):\r\n"," \"\"\"A single training/test example for simple sequence classification.\"\"\"\r\n","\r\n"," def __init__(self, guid, text_a, text_b=None, label=None):\r\n"," \"\"\"Constructs a InputExample.\r\n"," Args:\r\n"," guid: Unique id for the example.\r\n"," text_a: string. The untokenized text of the first sequence. For single\r\n"," sequence tasks, only this sequence must be specified.\r\n"," text_b: (Optional) string. The untokenized text of the second sequence.\r\n"," Only must be specified for sequence pair tasks.\r\n"," label: (Optional) string. The label of the example. This should be\r\n"," specified for train and dev examples, but not for test examples.\r\n"," \"\"\"\r\n"," self.guid = guid\r\n"," self.text_a = text_a\r\n"," self.text_b = text_b\r\n"," self.label = label"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"jQvqkYnY6ZkZ"},"source":["class InputFeatures(object):\r\n"," \"\"\"A single set of features of data.\"\"\"\r\n","\r\n"," def __init__(self, input_ids, input_mask, segment_ids, label_id):\r\n"," self.input_ids = input_ids\r\n"," self.input_mask = input_mask\r\n"," self.segment_ids = segment_ids\r\n"," self.label_id = label_id"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"KycuyRUt6d4w"},"source":["\r\n","class DataProcessor(object):\r\n"," \"\"\"Base class for data converters for sequence classification data sets.\"\"\"\r\n","\r\n"," def get_train_examples(self, data_dir):\r\n"," \"\"\"Gets a collection of `InputExample`s for the train set.\"\"\"\r\n"," raise NotImplementedError()\r\n","\r\n"," def get_dev_examples(self, data_dir):\r\n"," \"\"\"Gets a collection of `InputExample`s for the dev set.\"\"\"\r\n"," raise NotImplementedError()\r\n","\r\n"," def get_labels(self):\r\n"," \"\"\"Gets the list of labels for this data set.\"\"\"\r\n"," raise NotImplementedError()\r\n","\r\n"," @classmethod\r\n"," def _read_tsv(cls, input_file, quotechar=None):\r\n"," \"\"\"Reads a tab separated value file.\"\"\"\r\n"," with open(input_file, \"r\", encoding=\"utf-8-sig\") as f:\r\n"," reader = csv.reader(f, delimiter=\"\\t\", quotechar=quotechar)\r\n"," lines = []\r\n"," for line in reader:\r\n"," if sys.version_info[0] == 2:\r\n"," line = list(unicode(cell, 'utf-8') for cell in line)\r\n"," lines.append(line)\r\n"," return lines\r\n"," \r\n","class TweetProcessor(DataProcessor):\r\n"," \"\"\"Processor for the Amazon Reviews data set.\"\"\"\r\n","\r\n"," def get_train_examples(self, data_dir):\r\n"," \"\"\"See base class.\"\"\"\r\n"," return self._create_examples(\r\n"," self._read_tsv(os.path.join(data_dir, \"train.csv\")), \"train\")\r\n","\r\n"," def get_dev_examples(self, data_dir):\r\n"," \"\"\"See base class.\"\"\"\r\n"," return self._create_examples(\r\n"," self._read_tsv(os.path.join(data_dir, \"dev.csv\")), \"dev\")\r\n","\r\n"," def get_test_examples(self, data_dir):\r\n"," \"\"\"See base class.\"\"\"\r\n"," return self._create_examples(\r\n"," self._read_tsv(os.path.join(data_dir, \"test.csv\")), \"test\")\r\n","\r\n"," def get_labels(self):\r\n"," \"\"\"See base class.\"\"\"\r\n"," return [0, 1, 2]\r\n","\r\n"," #Hack to be compatible with the existing code in transformers library\r\n"," def _read_tsv(self, file_path):\r\n"," return pd.read_csv(file_path).values.tolist()\r\n","\r\n"," def _create_examples(self, lines, set_type):\r\n"," \"\"\"Creates examples for the training and dev sets.\"\"\"\r\n"," examples = []\r\n"," for (i, line) in enumerate(lines):\r\n"," if i == 0:\r\n"," continue\r\n"," guid = \"%s-%s\" % (set_type, i)\r\n"," text_a = str(line[0])\r\n"," # text_b = None\r\n"," label = line[1]\r\n"," examples.append(\r\n"," InputExample(guid=guid, text_a=text_a, text_b=None, label=label))\r\n"," return examples"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"6uM9OJal6iF-"},"source":["def set_seed(seed):\r\n"," random.seed(seed)\r\n"," np.random.seed(seed)\r\n"," torch.manual_seed(seed)\r\n"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"SVAmID3W6lVc"},"source":["def simple_accuracy(preds, labels):\r\n"," return (preds == labels).mean()\r\n"," \r\n","def acc_and_f1(preds, labels):\r\n"," acc = simple_accuracy(preds, labels)\r\n"," f1 = f1_score(y_true=labels, y_pred=preds)\r\n"," return {\r\n"," \"acc\": acc,\r\n"," \"f1\": f1,\r\n"," \r\n"," }\r\n","\r\n","\r\n","def f1_weighted(preds, labels):\r\n"," return f1_score(y_true=labels, y_pred=preds, average='weighted')\r\n"," \r\n","def compute_metrics(task_name, preds, labels):\r\n"," assert len(preds) == len(labels)\r\n"," if task_name == \"tweet\":\r\n"," return {\"acc\": acc_and_f1(preds, labels)}\r\n"," else:\r\n"," raise KeyError(task_name)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Wk2MjBbu6npD"},"source":["def _truncate_seq_pair(tokens_a, tokens_b, max_length):\r\n"," \"\"\"Truncates a sequence pair in place to the maximum length.\"\"\"\r\n","\r\n"," # This is a simple heuristic which will always truncate the longer sequence\r\n"," # one token at a time. This makes more sense than truncating an equal percent\r\n"," # of tokens from each, since if one sequence is very short then each token\r\n"," # that's truncated likely contains more information than a longer sequence.\r\n"," while True:\r\n"," total_length = len(tokens_a) + len(tokens_b)\r\n"," if total_length <= max_length:\r\n"," break\r\n"," if len(tokens_a) > len(tokens_b):\r\n"," tokens_a.pop()\r\n"," else:\r\n"," tokens_b.pop()"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"tRP-i1VR6qoL"},"source":["def convert_examples_to_features(examples, label_list, max_seq_length,\r\n"," tokenizer, output_mode,\r\n"," cls_token_at_end=False, pad_on_left=False,\r\n"," cls_token='[CLS]', sep_token='[SEP]', pad_token=0,\r\n"," sequence_a_segment_id=0, sequence_b_segment_id=1,\r\n"," cls_token_segment_id=1, pad_token_segment_id=0,\r\n"," mask_padding_with_zero=True):\r\n"," \"\"\" Loads a data file into a list of `InputBatch`s\r\n"," `cls_token_at_end` define the location of the CLS token:\r\n"," - False (Default, BERT/XLM pattern): [CLS] + A + [SEP] + B + [SEP]\r\n"," - True (XLNet/GPT pattern): A + [SEP] + B + [SEP] + [CLS]\r\n"," `cls_token_segment_id` define the segment id associated to the CLS token (0 for BERT, 2 for XLNet)\r\n"," \"\"\"\r\n","\r\n"," label_map = {label : i for i, label in enumerate(label_list)}\r\n","\r\n"," features = []\r\n"," for (ex_index, example) in enumerate(examples):\r\n","\r\n"," tokens_a = tokenizer.tokenize(example.text_a)\r\n","\r\n"," tokens_b = None\r\n"," if example.text_b:\r\n"," tokens_b = tokenizer.tokenize(example.text_b)\r\n"," # Modifies `tokens_a` and `tokens_b` in place so that the total\r\n"," # length is less than the specified length.\r\n"," # Account for [CLS], [SEP], [SEP] with \"- 3\"\r\n"," _truncate_seq_pair(tokens_a, tokens_b, max_seq_length - 3)\r\n"," else:\r\n"," # Account for [CLS] and [SEP] with \"- 2\"\r\n"," if len(tokens_a) > max_seq_length - 2:\r\n"," tokens_a = tokens_a[:(max_seq_length - 2)]\r\n","\r\n"," # The convention in BERT is:\r\n"," # (a) For sequence pairs:\r\n"," # tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP]\r\n"," # type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1\r\n"," # (b) For single sequences:\r\n"," # tokens: [CLS] the dog is hairy . [SEP]\r\n"," # type_ids: 0 0 0 0 0 0 0\r\n"," #\r\n"," # Where \"type_ids\" are used to indicate whether this is the first\r\n"," # sequence or the second sequence. The embedding vectors for `type=0` and\r\n"," # `type=1` were learned during pre-training and are added to the wordpiece\r\n"," # embedding vector (and position vector). This is not *strictly* necessary\r\n"," # since the [SEP] token unambiguously separates the sequences, but it makes\r\n"," # it easier for the model to learn the concept of sequences.\r\n"," #\r\n"," # For classification tasks, the first vector (corresponding to [CLS]) is\r\n"," # used as as the \"sentence vector\". Note that this only makes sense because\r\n"," # the entire model is fine-tuned.\r\n"," tokens = tokens_a + [sep_token]\r\n"," segment_ids = [sequence_a_segment_id] * len(tokens)\r\n","\r\n"," if tokens_b:\r\n"," tokens += tokens_b + [sep_token]\r\n"," segment_ids += [sequence_b_segment_id] * (len(tokens_b) + 1)\r\n","\r\n"," if cls_token_at_end:\r\n"," tokens = tokens + [cls_token]\r\n"," segment_ids = segment_ids + [cls_token_segment_id]\r\n"," else:\r\n"," tokens = [cls_token] + tokens\r\n"," segment_ids = [cls_token_segment_id] + segment_ids\r\n","\r\n"," input_ids = tokenizer.convert_tokens_to_ids(tokens)\r\n","\r\n"," # The mask has 1 for real tokens and 0 for padding tokens. Only real\r\n"," # tokens are attended to.\r\n"," input_mask = [1 if mask_padding_with_zero else 0] * len(input_ids)\r\n","\r\n"," # Zero-pad up to the sequence length.\r\n"," padding_length = max_seq_length - len(input_ids)\r\n"," if pad_on_left:\r\n"," input_ids = ([pad_token] * padding_length) + input_ids\r\n"," input_mask = ([0 if mask_padding_with_zero else 1] * padding_length) + input_mask\r\n"," segment_ids = ([pad_token_segment_id] * padding_length) + segment_ids\r\n"," else:\r\n"," input_ids = input_ids + ([pad_token] * padding_length)\r\n"," input_mask = input_mask + ([0 if mask_padding_with_zero else 1] * padding_length)\r\n"," segment_ids = segment_ids + ([pad_token_segment_id] * padding_length)\r\n","\r\n"," assert len(input_ids) == max_seq_length\r\n"," assert len(input_mask) == max_seq_length\r\n"," assert len(segment_ids) == max_seq_length\r\n","\r\n"," if output_mode == \"classification\":\r\n"," label_id = label_map[example.label]\r\n"," elif output_mode == \"regression\":\r\n"," label_id = float(example.label)\r\n"," else:\r\n"," raise KeyError(output_mode)\r\n","\r\n"," features.append(\r\n"," InputFeatures(input_ids=input_ids,\r\n"," input_mask=input_mask,\r\n"," segment_ids=segment_ids,\r\n"," label_id=label_id))\r\n"," return features"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"D_bnAV7b60ZK"},"source":["\r\n","processor = TweetProcessor()\r\n","label_list = processor.get_labels()\r\n","num_labels = len(label_list)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"Z9RazYscD0bp","executionInfo":{"status":"ok","timestamp":1609352370003,"user_tz":-60,"elapsed":7293,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"a19b6ac9-4c89-4fd6-8834-1e4c9165ed0f"},"source":["#RobertaConfig, RobertaForSequenceClassification,RobertaTokenizer\r\n","config = RobertaConfig.from_pretrained('roberta-base', num_labels=num_labels)\r\n","tokenizer = RobertaTokenizer.from_pretrained('roberta-base')\r\n","model = RobertaForSequenceClassification.from_pretrained('roberta-base', config=config)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["Some weights of the model checkpoint at roberta-base were not used when initializing RobertaForSequenceClassification: ['lm_head.bias', 'lm_head.dense.weight', 'lm_head.dense.bias', 'lm_head.layer_norm.weight', 'lm_head.layer_norm.bias', 'lm_head.decoder.weight', 'roberta.pooler.dense.weight', 'roberta.pooler.dense.bias']\n","- This IS expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n","- This IS NOT expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n","Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at roberta-base and are newly initialized: ['classifier.dense.weight', 'classifier.dense.bias', 'classifier.out_proj.weight', 'classifier.out_proj.bias']\n","You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"],"name":"stderr"}]},{"cell_type":"code","metadata":{"id":"9RFaKP0l8kRK"},"source":[" def load_and_cache_examples(tokenizer, dataset='train'): \r\n"," if dataset == \"train\":\r\n"," examples = processor.get_train_examples(data_dir)\r\n"," elif dataset == \"dev\":\r\n"," examples = processor.get_dev_examples(data_dir)\r\n"," else:\r\n"," examples = processor.get_test_examples(data_dir)\r\n"," \r\n"," features = convert_examples_to_features(examples, label_list, max_seq_length, tokenizer, output_mode,\r\n"," cls_token_at_end=True, # xlnet has a cls token at the end\r\n"," cls_token=tokenizer.cls_token,\r\n"," sep_token=tokenizer.sep_token,\r\n"," cls_token_segment_id=2,\r\n"," pad_on_left=True, # pad on the left for xlnet\r\n"," pad_token=tokenizer.convert_tokens_to_ids([tokenizer.pad_token])[0],\r\n"," pad_token_segment_id=4)\r\n"," # Convert to Tensors and build dataset\r\n"," all_input_ids = torch.tensor([f.input_ids for f in features], dtype=torch.long)\r\n"," all_input_mask = torch.tensor([f.input_mask for f in features], dtype=torch.long)\r\n"," all_segment_ids = torch.tensor([f.segment_ids for f in features], dtype=torch.long)\r\n"," if output_mode == \"classification\":\r\n"," all_label_ids = torch.tensor([f.label_id for f in features], dtype=torch.long)\r\n"," elif output_mode == \"regression\":\r\n"," all_label_ids = torch.tensor([f.label_id for f in features], dtype=torch.float)\r\n","\r\n"," dataset = TensorDataset(all_input_ids, all_input_mask, all_segment_ids, all_label_ids)\r\n"," return dataset"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"9vsiFZRF93rE","executionInfo":{"status":"ok","timestamp":1609352505148,"user_tz":-60,"elapsed":1246,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"67afe68f-3cec-459b-e23c-c5e93a642780"},"source":["output_mode = 'classification'\r\n","max_seq_length = 60\r\n","batch_size = 8\r\n","max_grad_norm = 1.0\r\n","gradient_accumulation_steps=2\r\n","num_train_epochs=3\r\n","weight_decay=0.0\r\n","device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\r\n","print(device)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["cuda\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"y4shGAUC-RfA"},"source":["learning_rate = 2e-5\r\n","adam_epsilon = 1e-8\r\n","num_warmup_steps = 0"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"HGeQmWDw-bYN"},"source":["def train(train_dataset, model, tokenizer):\r\n"," \"\"\" Train the model \"\"\"\r\n"," train_sampler = RandomSampler(train_dataset)\r\n"," train_dataloader = DataLoader(train_dataset, sampler=train_sampler, batch_size=batch_size)\r\n"," num_training_steps = len(train_dataloader) // gradient_accumulation_steps * num_train_epochs\r\n"," # Prepare optimizer and schedule (linear warmup and decay)\r\n"," no_decay = ['bias', 'LayerNorm.weight']\r\n"," optimizer_grouped_parameters = [\r\n"," {'params': [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], 'weight_decay': weight_decay},\r\n"," {'params': [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}\r\n"," ]\r\n"," optimizer = AdamW(optimizer_grouped_parameters, lr=learning_rate, eps=adam_epsilon)\r\n"," scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps= num_warmup_steps,num_training_steps = num_training_steps)\r\n"," \r\n"," global_step = 0\r\n"," tr_loss, logging_loss = 0.0, 0.0\r\n"," model.zero_grad()\r\n"," train_iterator = tqdm_notebook(range(int(num_train_epochs)), desc=\"Epoch\")\r\n"," set_seed(42)\r\n"," for _ in train_iterator:\r\n"," epoch_iterator = tqdm_notebook(train_dataloader, desc=\"Iteration\")\r\n"," for step, batch in enumerate(epoch_iterator):\r\n"," model.train()\r\n"," batch = tuple(t.to(device) for t in batch)\r\n"," inputs = {'input_ids': batch[0],\r\n"," 'attention_mask': batch[1],\r\n"," 'token_type_ids': None, # XLM and RoBERTa don't use segment_ids\r\n"," 'labels': batch[3]}\r\n"," outputs = model(**inputs)\r\n"," loss = outputs[0] # model outputs are always tuple in pytorch-transformers (see doc)\r\n"," if gradient_accumulation_steps > 1:\r\n"," loss = loss / gradient_accumulation_steps\r\n"," loss.backward()\r\n"," torch.nn.utils.clip_grad_norm_(model.parameters(), max_grad_norm)\r\n"," tr_loss += loss.item()\r\n"," if (step + 1) % gradient_accumulation_steps == 0:\r\n"," scheduler.step() # Update learning rate schedule\r\n"," optimizer.step()\r\n"," model.zero_grad()\r\n"," global_step += 1\r\n"," \r\n"," return global_step, tr_loss / global_step"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"6dWLmYAJ-euq"},"source":["def evaluate(model, tokenizer, prefix=\"\"):\r\n"," results = {}\r\n"," eval_dataset = load_and_cache_examples(tokenizer, dataset='dev')\r\n"," eval_batch_size = 8\r\n"," eval_sampler = SequentialSampler(eval_dataset)\r\n"," eval_dataloader = DataLoader(eval_dataset, sampler=eval_sampler, batch_size=eval_batch_size)\r\n"," eval_loss = 0.0\r\n"," nb_eval_steps = 0\r\n"," preds = None\r\n"," out_label_ids = None\r\n"," for batch in tqdm_notebook(eval_dataloader, desc=\"Evaluating\"):\r\n"," model.eval()\r\n"," batch = tuple(t.to(device) for t in batch)\r\n"," with torch.no_grad():\r\n"," inputs = {'input_ids': batch[0],\r\n"," 'attention_mask': batch[1],\r\n"," 'token_type_ids': None, # XLM and RoBERTa don't use segment_ids\r\n"," 'labels': batch[3]}\r\n"," outputs = model(**inputs)\r\n"," tmp_eval_loss, logits = outputs[:2]\r\n"," eval_loss += tmp_eval_loss.mean().item()\r\n"," \r\n"," nb_eval_steps += 1\r\n"," if preds is None:\r\n"," preds = logits.detach().cpu().numpy()\r\n"," out_label_ids = inputs['labels'].detach().cpu().numpy()\r\n"," else:\r\n"," preds = np.append(preds, logits.detach().cpu().numpy(), axis=0)\r\n"," out_label_ids = np.append(out_label_ids, inputs['labels'].detach().cpu().numpy(), axis=0)\r\n"," eval_loss = eval_loss / nb_eval_steps\r\n"," if output_mode == \"classification\":\r\n"," preds = np.argmax(preds, axis=1)\r\n"," elif output_mode == \"regression\":\r\n"," preds = np.squeeze(preds)\r\n"," result = compute_metrics(\"tweet\", preds, out_label_ids)\r\n"," return result"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"colab":{"base_uri":"https://localhost:8080/","height":335,"referenced_widgets":["aa165c4c8d4a4bdba30d669f59906d15","6ec0c4d438e34833979e9caa837ba5a7","14fd1204a16d4c3692e57e2852041c2b","6117124ef56747cb9660a3b0a1320814","18ac3a6a121c4a18910759f5c69e22f1","36db65bfa8214685b95ea2ea46b81bda","244e5d1e610e4e7180f83fa6e3ab8ab7","e803ea8467d848888de63596f4ee1920","dc452a3c7a0842309e44f5a32c1b82bd","e8412f4d3b8e46ab81d4f301157f00be","e8a92849a76642a7ab2b186ae0df4ae7","eaa7ef95bed7416aa97237bcff09b7af","853d9a7b580a474aafa0941123ff863b","4f78a0941ba24435b1ad3f9de377fcd7","3a2ae730cb3d470ab40b96c8e4e67058","ead4e7718c7a497bb0bc54fe8e19ae35","ca3c971fe77d454eaf3179146487dc44","82b8beb2e5284052846d9e1a554b65e2","cd664e45c6b24bc791ab4c063dd97b01","866d76086148468f8409464495f5b65e","a125e2c861bf40f88ec5448bb0ac14a4","aa163f956a7a48669f70ebbc50912fa9","aff54d05e66d4eddb83fec133c002263","305cb5e80a6943e6a714908a088c0398","c980297feeca4330a7ec8cd7b3611d63","738d1f6643bb4d0784fc279254b24134","43dd7167468747d9aac84ae9a003e42f","91a9349ed14b49cea0bd1d2762dfa7cf","3f1bbd86cedd44d79d5b9bbb1f502bd4","142219a840f3408d9b951aa884fa4362","b75ec03a81894ce6a13e232ad16222ab","638ece11c7014635a228491add1be51d"]},"id":"zlDfbUgj-mBF","executionInfo":{"status":"ok","timestamp":1609353103597,"user_tz":-60,"elapsed":588749,"user":{"displayName":"Rohith Teja","photoUrl":"https://lh3.googleusercontent.com/-nt8x4joQmgY/AAAAAAAAAAI/AAAAAAAAAvg/AbgIIUozOq0/s64/photo.jpg","userId":"01155222072916958278"}},"outputId":"1f17ff7a-4d66-4052-9113-34ec66e186cf"},"source":["data_dir= 'data'\r\n","model.to(device)\r\n","train_dataset = load_and_cache_examples(tokenizer, dataset=\"train\")\r\n","global_step, tr_loss = train(train_dataset, model, tokenizer)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:18: TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0\n","Please use `tqdm.notebook.tqdm` instead of `tqdm.tqdm_notebook`\n"],"name":"stderr"},{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"aa165c4c8d4a4bdba30d669f59906d15","version_minor":0,"version_major":2},"text/plain":["HBox(children=(FloatProgress(value=0.0, description='Epoch', max=3.0, style=ProgressStyle(description_width='i…"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:21: TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0\n","Please use `tqdm.notebook.tqdm` instead of `tqdm.tqdm_notebook`\n"],"name":"stderr"},{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"dc452a3c7a0842309e44f5a32c1b82bd","version_minor":0,"version_major":2},"text/plain":["HBox(children=(FloatProgress(value=0.0, description='Iteration', max=2405.0, style=ProgressStyle(description_w…"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["/usr/local/lib/python3.6/dist-packages/torch/optim/lr_scheduler.py:136: UserWarning: Detected call of `lr_scheduler.step()` before `optimizer.step()`. In PyTorch 1.1.0 and later, you should call them in the opposite order: `optimizer.step()` before `lr_scheduler.step()`. Failure to do this will result in PyTorch skipping the first value of the learning rate schedule. See more details at https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate\n"," \"https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate\", UserWarning)\n"],"name":"stderr"},{"output_type":"stream","text":["\n"],"name":"stdout"},{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"ca3c971fe77d454eaf3179146487dc44","version_minor":0,"version_major":2},"text/plain":["HBox(children=(FloatProgress(value=0.0, description='Iteration', max=2405.0, style=ProgressStyle(description_w…"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["\n"],"name":"stdout"},{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"c980297feeca4330a7ec8cd7b3611d63","version_minor":0,"version_major":2},"text/plain":["HBox(children=(FloatProgress(value=0.0, description='Iteration', max=2405.0, style=ProgressStyle(description_w…"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["\n","\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"2nd7E7A8-sRW","colab":{"base_uri":"https://localhost:8080/","height":138,"referenced_widgets":["dfcc3e8bb29142aaaf0cf2a9d4ecce92","1acce1360fef474aa86b9abd11d6faab","1cd501aa81f345d185b19a3f741e50d4","500f8f5204db452f9ec05c1e392eeb00","ca515671c27c4905834982fd360c6649","368dd39a241b4903ae2a084be4697c7a","d35c7207643f49dfa3b1f4fb6a81de81","f9f7fb247b0a41a0b25eef76e8337cd8"]},"executionInfo":{"status":"ok","timestamp":1609278897437,"user_tz":-60,"elapsed":42042,"user":{"displayName":"Yogesh Kumar Pilli","photoUrl":"","userId":"08942912479073261381"}},"outputId":"5d9ede65-0392-41ff-be03-65514a54aa90"},"source":["# Evaluation\r\n","result = evaluate(model, tokenizer, prefix=global_step)\r\n","print(result)"],"execution_count":null,"outputs":[{"output_type":"stream","text":["/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:11: TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0\n","Please use `tqdm.notebook.tqdm` instead of `tqdm.tqdm_notebook`\n"," # This is added back by InteractiveShellApp.init_path()\n"],"name":"stderr"},{"output_type":"display_data","data":{"application/vnd.jupyter.widget-view+json":{"model_id":"dfcc3e8bb29142aaaf0cf2a9d4ecce92","version_minor":0,"version_major":2},"text/plain":["HBox(children=(FloatProgress(value=0.0, description='Evaluating', max=685.0, style=ProgressStyle(description_w…"]},"metadata":{"tags":[]}},{"output_type":"stream","text":["\n","{'acc': 0.7791932919904274}\n"],"name":"stdout"}]},{"cell_type":"code","metadata":{"id":"GIx38YdB_oHO"},"source":["def evaluatetest(model, tokenizer, prefix=\"\"):\r\n"," results = {}\r\n"," eval_dataset = load_and_cache_examples(tokenizer, dataset='test')\r\n"," eval_batch_size = 8\r\n"," eval_sampler = SequentialSampler(eval_dataset)\r\n"," eval_dataloader = DataLoader(eval_dataset, sampler=eval_sampler, batch_size=eval_batch_size)\r\n"," eval_loss = 0.0\r\n"," nb_eval_steps = 0\r\n"," preds = None\r\n"," out_label_ids = None\r\n"," for batch in tqdm_notebook(eval_dataloader, desc=\"Evaluating\"):\r\n"," model.eval()\r\n"," batch = tuple(t.to(device) for t in batch)\r\n"," with torch.no_grad():\r\n"," inputs = {'input_ids': batch[0],\r\n"," 'attention_mask': batch[1],\r\n"," 'token_type_ids': None, # XLM and RoBERTa don't use segment_ids\r\n"," 'labels': batch[3]}\r\n"," outputs = model(**inputs)\r\n"," tmp_eval_loss, logits = outputs[:2]\r\n"," eval_loss += tmp_eval_loss.mean().item()\r\n"," \r\n"," nb_eval_steps += 1\r\n"," if preds is None:\r\n"," preds = logits.detach().cpu().numpy()\r\n"," out_label_ids = inputs['labels'].detach().cpu().numpy()\r\n"," else:\r\n"," preds = np.append(preds, logits.detach().cpu().numpy(), axis=0)\r\n"," out_label_ids = np.append(out_label_ids, inputs['labels'].detach().cpu().numpy(), axis=0)\r\n"," eval_loss = eval_loss / nb_eval_steps\r\n"," if output_mode == \"classification\":\r\n"," preds = np.argmax(preds, axis=1)\r\n"," elif output_mode == \"regression\":\r\n"," preds = np.squeeze(preds)\r\n"," result = compute_metrics(\"tweet\", preds, out_label_ids)\r\n"," return result"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"uDyFnbBM4_gb"},"source":["# Evaluation\r\n","result = evaluatetest(model, tokenizer, prefix=global_step)\r\n","print(result)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"EUIhxMbp4_jD"},"source":[""],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"2RwuIGFk4_ky"},"source":[""],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"p6Tgzbr04_nQ"},"source":[""],"execution_count":null,"outputs":[]}]} --------------------------------------------------------------------------------