Skip to content

Instantly share code, notes, and snippets.

@klaus82
Last active May 2, 2019 03:58
Show Gist options
  • Save klaus82/75d08a06a1bc4166cf5a7bbdf811b092 to your computer and use it in GitHub Desktop.
Save klaus82/75d08a06a1bc4166cf5a7bbdf811b092 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"import keras\n",
"from keras.preprocessing.sequence import pad_sequences\n",
"from keras.models import Sequential\n",
"from keras.layers import Dense, Dropout, Embedding, LSTM, SpatialDropout1D\n",
"from keras.callbacks import ModelCheckpoint\n",
"import os\n",
"from sklearn.metrics import roc_auc_score\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"import numpy as np\n",
"import re\n",
"from keras.preprocessing.text import Tokenizer\n",
"from sklearn.model_selection import train_test_split"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Read the dataset:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"tweets = pd.read_csv('./Dataset/Tweets.csv', sep=',')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Showing some dataset rows"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>tweet_id</th>\n",
" <th>airline_sentiment</th>\n",
" <th>airline_sentiment_confidence</th>\n",
" <th>negativereason</th>\n",
" <th>negativereason_confidence</th>\n",
" <th>airline</th>\n",
" <th>airline_sentiment_gold</th>\n",
" <th>name</th>\n",
" <th>negativereason_gold</th>\n",
" <th>retweet_count</th>\n",
" <th>text</th>\n",
" <th>tweet_coord</th>\n",
" <th>tweet_created</th>\n",
" <th>tweet_location</th>\n",
" <th>user_timezone</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>570306133677760513</td>\n",
" <td>neutral</td>\n",
" <td>1.0000</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>Virgin America</td>\n",
" <td>NaN</td>\n",
" <td>cairdin</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>@VirginAmerica What @dhepburn said.</td>\n",
" <td>NaN</td>\n",
" <td>2015-02-24 11:35:52 -0800</td>\n",
" <td>NaN</td>\n",
" <td>Eastern Time (US &amp; Canada)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>570301130888122368</td>\n",
" <td>positive</td>\n",
" <td>0.3486</td>\n",
" <td>NaN</td>\n",
" <td>0.0</td>\n",
" <td>Virgin America</td>\n",
" <td>NaN</td>\n",
" <td>jnardino</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>@VirginAmerica plus you've added commercials t...</td>\n",
" <td>NaN</td>\n",
" <td>2015-02-24 11:15:59 -0800</td>\n",
" <td>NaN</td>\n",
" <td>Pacific Time (US &amp; Canada)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" tweet_id airline_sentiment airline_sentiment_confidence \\\n",
"0 570306133677760513 neutral 1.0000 \n",
"1 570301130888122368 positive 0.3486 \n",
"\n",
" negativereason negativereason_confidence airline \\\n",
"0 NaN NaN Virgin America \n",
"1 NaN 0.0 Virgin America \n",
"\n",
" airline_sentiment_gold name negativereason_gold retweet_count \\\n",
"0 NaN cairdin NaN 0 \n",
"1 NaN jnardino NaN 0 \n",
"\n",
" text tweet_coord \\\n",
"0 @VirginAmerica What @dhepburn said. NaN \n",
"1 @VirginAmerica plus you've added commercials t... NaN \n",
"\n",
" tweet_created tweet_location user_timezone \n",
"0 2015-02-24 11:35:52 -0800 NaN Eastern Time (US & Canada) \n",
"1 2015-02-24 11:15:59 -0800 NaN Pacific Time (US & Canada) "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tweets.head(2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Select only interestig fields:"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"data = tweets[['text','airline_sentiment']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Clean up the dataset, conidering only positive and negative tweets:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"4726\n",
"18356\n"
]
}
],
"source": [
"data = data[data.airline_sentiment != \"neutral\"]\n",
"data['text'] = data['text'].apply(lambda x: x.lower())\n",
"data['text'] = data['text'].apply((lambda x: re.sub('[^a-zA-z0-9\\s]','',x)))\n",
"\n",
"print(data[ data['airline_sentiment'] == 'positive'].size)\n",
"print(data[ data['airline_sentiment'] == 'negative'].size)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tokenization:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"max_fatures = 2000\n",
"tokenizer = Tokenizer(num_words=max_fatures, split=' ')\n",
"tokenizer.fit_on_texts(data['text'].values)\n",
"X = tokenizer.texts_to_sequences(data['text'].values)\n",
"X = pad_sequences(X)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Neural network:\n"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"embedding_5 (Embedding) (None, 32, 128) 256000 \n",
"_________________________________________________________________\n",
"dropout_2 (Dropout) (None, 32, 128) 0 \n",
"_________________________________________________________________\n",
"lstm_4 (LSTM) (None, 196) 254800 \n",
"_________________________________________________________________\n",
"dense_4 (Dense) (None, 2) 394 \n",
"=================================================================\n",
"Total params: 511,194\n",
"Trainable params: 511,194\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n",
"None\n"
]
}
],
"source": [
"embed_dim = 128\n",
"lstm_out = 196\n",
"\n",
"model = Sequential()\n",
"model.add(Embedding(max_fatures, embed_dim,input_length = X.shape[1]))\n",
"model.add(Dropout(0.5))\n",
"model.add(LSTM(lstm_out, dropout=0.2, recurrent_dropout=0.2))\n",
"model.add(Dense(2,activation='softmax'))\n",
"model.compile(loss = 'categorical_crossentropy', optimizer='adam',metrics = ['accuracy'])\n",
"print(model.summary())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"declaring dataset"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(7732, 32) (7732, 2)\n",
"(3809, 32) (3809, 2)\n"
]
}
],
"source": [
"Y = pd.get_dummies(data['airline_sentiment']).values\n",
"X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size = 0.33, random_state = 42)\n",
"print(X_train.shape,Y_train.shape)\n",
"print(X_test.shape,Y_test.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Selecting some data for training and some for validation"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"X_val = X_train[:500]\n",
"Y_val = Y_train[:500]"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"partial_X_train = X_train[500:]\n",
"partial_Y_train = Y_train[500:]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Train the network:"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Train on 7232 samples, validate on 500 samples\n",
"Epoch 1/10\n",
"7232/7232 [==============================] - 21s 3ms/step - loss: 0.5730 - acc: 0.7688 - val_loss: 0.4338 - val_acc: 0.7960\n",
"Epoch 2/10\n",
"7232/7232 [==============================] - 20s 3ms/step - loss: 0.4080 - acc: 0.8191 - val_loss: 0.3696 - val_acc: 0.8340\n",
"Epoch 3/10\n",
"7232/7232 [==============================] - 21s 3ms/step - loss: 0.3306 - acc: 0.8550 - val_loss: 0.2776 - val_acc: 0.8800\n",
"Epoch 4/10\n",
"7232/7232 [==============================] - 20s 3ms/step - loss: 0.2467 - acc: 0.8993 - val_loss: 0.2147 - val_acc: 0.9140\n",
"Epoch 5/10\n",
"7232/7232 [==============================] - 20s 3ms/step - loss: 0.1885 - acc: 0.9266 - val_loss: 0.1954 - val_acc: 0.9300\n",
"Epoch 6/10\n",
"7232/7232 [==============================] - 20s 3ms/step - loss: 0.1549 - acc: 0.9382 - val_loss: 0.1780 - val_acc: 0.9380\n",
"Epoch 7/10\n",
"7232/7232 [==============================] - 20s 3ms/step - loss: 0.1410 - acc: 0.9484 - val_loss: 0.1842 - val_acc: 0.9380\n",
"Epoch 8/10\n",
"7232/7232 [==============================] - 20s 3ms/step - loss: 0.1231 - acc: 0.9537 - val_loss: 0.1877 - val_acc: 0.9300\n",
"Epoch 9/10\n",
"7232/7232 [==============================] - 20s 3ms/step - loss: 0.1121 - acc: 0.9588 - val_loss: 0.1923 - val_acc: 0.9280\n",
"Epoch 10/10\n",
"7232/7232 [==============================] - 20s 3ms/step - loss: 0.1024 - acc: 0.9599 - val_loss: 0.1984 - val_acc: 0.9280\n"
]
}
],
"source": [
"batch_size = 512\n",
"history = model.fit(partial_X_train, \n",
" partial_Y_train, \n",
" epochs = 10, \n",
" batch_size=batch_size, \n",
" validation_data=(X_val, Y_val))"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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/cWLF/PAAw/wxhtvMG/ePPr06ZO0v36dOnXi97OysigsLEx67rp16/7gmF1dlKy045s3b868efPo0aMHY8aM4dJLLwXg1Vdf5bLLLuO9994jLy+PoqKiXbpeZVBSEJFKE2Ub3ldffUXjxo3Zc889WbVqFa+++mqlX6NHjx489dRTAHzwwQdJSyKJunXrxtSpU1m/fj2FhYVMmjSJnj17snbtWtydc889l9tuu41Zs2ZRVFREQUEBJ5xwAn/4wx9Yu3Ytm3esi6sCNb73kYhUneKq2crsfVReubm5tG/fno4dO9K2bVuOOeaYSr/G1VdfzYUXXkhOTg65ubl07NgxXvWTTKtWrbj99tvp1asX7s7pp59Ov379mDVrFhdffDHujplx9913U1hYyPnnn8/XX3/Ntm3buP7662ncuHGlv4adqXZrNOfl5bkW2RGpOgsXLqRdu3ZRh5EWCgsLKSwspF69eixevJiTTz6ZxYsXs8ce6fX9OtnvzMxmunvezp6bXq9ERCSNbdq0id69e1NYWIi78+c//zntEsLuqlmvRkQkhZo2bcrMmTOjDiOl1NAsIiJxSgoiIhKnpCAiInFKCiIiEqekICJprVevXj8YiDZ69GiuuOKKMp/XqFEjAFauXMk555xT6rl31sV99OjR2w0iO/XUU9mwYUN5Qi/Trbfeyr333rvb56lsSgoiktYGDx7MpEmTtts3adIkBg8eXK7nH3DAATz99NMVvv6OSWHKlCk0bdq0wudLd0oKIpLWzjnnHF588UW+++47AJYtW8bKlSvp0aNHfNxAbm4uRxxxBC+88MIPnr9s2TI6duwIwJYtWxg0aBA5OTkMHDiQLVu2xI+7/PLL49Nu33LLLQCMGTOGlStXcvzxx3P88ccDkJ2dzbp16wC477776NixIx07doxPu71s2TLatWvHT3/6Uzp06MDJJ5+83XWSmTNnDt26dSMnJ4czzzyTL7/8Mn799u3bk5OTE5+I780334wvMtSlSxe+/vrrCr+3yWicgoiU289+BpW9oFjnzhD7PE2qefPmdO3alVdeeYUBAwYwadIkBg4ciJlRr149nnvuOfbcc0/WrVtHt27d6N+/f6nrFI8bN44GDRowb9485s2bR25ubvyxUaNGsddee1FUVETv3r2ZN28e11xzDffddx9Tp06lRYsW251r5syZPProo0yf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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efc326c1fd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"loss = history.history['loss']\n",
"val_loss = history.history['val_loss']\n",
"epochs = range(1, len(loss) + 1)\n",
"plt.plot(epochs, loss, 'bo', label='Training loss')\n",
"plt.plot(epochs, val_loss, 'b', label='Validation loss')\n",
"plt.title('Training and validation loss')\n",
"plt.xlabel('Epochs')\n",
"plt.ylabel('Loss')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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gGcIn/O3hI7vxlGT5QXAtYSBF3uXO7dUbgD6ERLaZOCppBhKgOOB7oTayWeEv0Ni+2LC33mju7+1jecuKSQ6nERyXtRUsQwY6u7/jjseqb3M7GFCB/6NcceyI9AFiZLTzGwIoanie8Lw0RLCr3KRaon6m04CesYdy45CTVuS6wYAiwhNHkOAk9U5KtVlZjcTrmX5nbt/Fnc8Owo1bYmISEZUIxERkYzUiT6S9u3be9euXeMOQ0SkVpkxY8YKd69syD1QRxJJ165dKSwsjDsMEZFaxcyqmuEBUNOWiIhkSIlEREQyokQiIiIZqRN9JKls2rSJoqIivv/++7hDkQo0btyYTp060bBhRdNHiUguqLOJpKioiBYtWtC1a1fCpLKSS9ydr7/+mqKiIrp161b1DiISmzrbtPX999/Trl07JZEcZWa0a9dONUaRaigogK5doV698FxQUNUemamzNRJASSTH6e8jsu0KCmD0aFi/PiwvWRKWAUZWd77nKtTZGomIyI7ouuu2JJGE9evD+mxRIonJ119/TZ8+fejTpw+77rorHTt2LF3euHFjWsc455xz+OijjyotM27cOAqyXa8VkZzxWQVTUVa0vibU6aatbVFQEDL6Z59B584wdmxm1cR27doxa9YsAG688UaaN2/O1VdfXaaMu+Pu1KuXOt8/8MADVb7PJZdcUv0gRaTW6dw5NGelWp8tqpGkIdHmuGQJuG9pc8zGD/2FCxfSo0cPLrzwQvLy8li+fDmjR48mPz+f/fffn5tuuqm07IABA5g1axYlJSW0bt2aMWPG0Lt3bw4++GC++uorAK6//npuv/320vJjxoyhX79+/PjHP+att8LN4datW8dpp51G7969GTFiBPn5+aVJLtkNN9zAgQceWBpfYubojz/+mKOOOorevXuTl5fH4sWLAfjd735Hz5496d27N9dls14tIqXGjoWmTcuua9o0rM8WJZI0bO82xw8//JDzzjuPmTNn0rFjR37/+99TWFjI7NmzefXVV/nwww+32mf16tUcfvjhzJ49m4MPPpj7778/5bHdnffee49bbrmlNCn99a9/Zdddd2X27NmMGTOGmTNnptz3iiuuYPr06cydO5fVq1fz0ksvATBixAiuvPJKZs+ezVtvvcXOO+/Mc889x4svvsh7773H7Nmz+dWvflVDn46IVGbkSJgwAbp0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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7efc326dd128>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.clf()\n",
"acc = history.history['acc']\n",
"val_acc = history.history['val_acc']\n",
"plt.plot(epochs, acc, 'bo', label='Training acc')\n",
"plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
"plt.title('Training and validation accuracy')\n",
"plt.xlabel('Epochs')\n",
"plt.ylabel('Accuracy')\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Validation"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"pos_acc 78.26086956521739 %\n",
"neg_acc 94.44444444444444 %\n"
]
}
],
"source": [
"pos_cnt, neg_cnt, pos_correct, neg_correct = 0, 0, 0, 0\n",
"for x in range(len(X_validate)):\n",
" \n",
" result = model.predict(X_validate[x].reshape(1,X_test.shape[1]),batch_size=1,verbose = 2)[0]\n",
" \n",
" if np.argmax(result) == np.argmax(Y_validate[x]):\n",
" if np.argmax(Y_validate[x]) == 0:\n",
" neg_correct += 1\n",
" else:\n",
" pos_correct += 1\n",
" \n",
" if np.argmax(Y_validate[x]) == 0:\n",
" neg_cnt += 1\n",
" else:\n",
" pos_cnt += 1\n",
"\n",
"\n",
"\n",
"print(\"pos_acc\", pos_correct/pos_cnt*100, \"%\")\n",
"print(\"neg_acc\", neg_correct/neg_cnt*100, \"%\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment