Created
April 1, 2021 17:06
-
-
Save MBoustani/3e32e8c503b167128054051128e80662 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"[nltk_data] Error loading stopwords: <urlopen error [SSL:\n", | |
"[nltk_data] CERTIFICATE_VERIFY_FAILED] certificate verify failed:\n", | |
"[nltk_data] unable to get local issuer certificate (_ssl.c:1038)>\n" | |
] | |
} | |
], | |
"source": [ | |
"import pandas as pd\n", | |
"import numpy as np\n", | |
"import matplotlib.pyplot as plt\n", | |
"import seaborn as sns\n", | |
"import re\n", | |
"\n", | |
"import nltk \n", | |
"nltk.download('stopwords')\n", | |
"from nltk.corpus import stopwords\n", | |
"from nltk.tokenize import word_tokenize \n", | |
"from nltk.stem import SnowballStemmer\n", | |
"\n", | |
"from sklearn import model_selection, metrics, preprocessing, ensemble, model_selection, metrics\n", | |
"from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\n", | |
"\n", | |
"\n", | |
"import tensorflow as tf\n", | |
"from tensorflow.keras.models import Model\n", | |
"from tensorflow.keras.preprocessing.text import Tokenizer\n", | |
"from tensorflow.keras.preprocessing.sequence import pad_sequences\n", | |
"from tensorflow.keras.layers import Conv1D, Bidirectional, LSTM, Dense, Dropout, Input, SpatialDropout1D\n", | |
"from tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau\n", | |
"from tensorflow.keras.optimizers import Adam\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Read train data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Data points count: 7613\n" | |
] | |
}, | |
{ | |
"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>id</th>\n", | |
" <th>keyword</th>\n", | |
" <th>location</th>\n", | |
" <th>text</th>\n", | |
" <th>target</th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>0</th>\n", | |
" <td>1</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>Our Deeds are the Reason of this #earthquake M...</td>\n", | |
" <td>1</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>4</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>Forest fire near La Ronge Sask. Canada</td>\n", | |
" <td>1</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>5</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>All residents asked to 'shelter in place' are ...</td>\n", | |
" <td>1</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>6</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>13,000 people receive #wildfires evacuation or...</td>\n", | |
" <td>1</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>7</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>Just got sent this photo from Ruby #Alaska as ...</td>\n", | |
" <td>1</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" id keyword location text \\\n", | |
"0 1 NaN NaN Our Deeds are the Reason of this #earthquake M... \n", | |
"1 4 NaN NaN Forest fire near La Ronge Sask. Canada \n", | |
"2 5 NaN NaN All residents asked to 'shelter in place' are ... \n", | |
"3 6 NaN NaN 13,000 people receive #wildfires evacuation or... \n", | |
"4 7 NaN NaN Just got sent this photo from Ruby #Alaska as ... \n", | |
"\n", | |
" target \n", | |
"0 1 \n", | |
"1 1 \n", | |
"2 1 \n", | |
"3 1 \n", | |
"4 1 " | |
] | |
}, | |
"execution_count": 2, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Rreading train dataset\n", | |
"file_path = \"./train.csv\"\n", | |
"raw_data = pd.read_csv(file_path)\n", | |
"print(\"Data points count: \", raw_data['id'].count())\n", | |
"raw_data.head()\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 720x576 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# Plotting target value counts\n", | |
"plt.figure(figsize=(10,8))\n", | |
"ax = raw_data['target'].value_counts().sort_values().plot(kind=\"bar\")\n", | |
"ax.grid(axis=\"y\")\n", | |
"plt.suptitle(\"Target Value Counts\", fontsize=20)\n", | |
"plt.show()\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Missing Data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Number of missing data for column keyword: 61\n", | |
"Number of missing data for column location: 2533\n", | |
"Number of missing data for column text: 0\n", | |
"Number of missing data for column target: 0\n" | |
] | |
} | |
], | |
"source": [ | |
"print(\"Number of missing data for column keyword: \", raw_data['keyword'].isna().sum())\n", | |
"print(\"Number of missing data for column location: \", raw_data['location'].isna().sum())\n", | |
"print(\"Number of missing data for column text: \", raw_data['text'].isna().sum())\n", | |
"print(\"Number of missing data for column target: \", raw_data['target'].isna().sum())\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 1080x576 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.figure(figsize=(15,8))\n", | |
"sns.heatmap(raw_data.drop('id', axis=1).isnull(), cbar=False, cmap=\"GnBu\").set_title(\"Missing data for each column\")\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Cleaning Data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.\n", | |
" return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 1080x576 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.figure(figsize=(15,8))\n", | |
"raw_data['word_count'] = raw_data['text'].apply(lambda x: len(x.split(\" \")) )\n", | |
"sns.distplot(raw_data['word_count'].values, hist=True, kde=True, kde_kws={\"shade\": True})\n", | |
"plt.axvline(raw_data['word_count'].describe()['25%'], ls=\"--\")\n", | |
"plt.axvline(raw_data['word_count'].describe()['50%'], ls=\"--\")\n", | |
"plt.axvline(raw_data['word_count'].describe()['75%'], ls=\"--\")\n", | |
"\n", | |
"plt.grid()\n", | |
"plt.suptitle(\"Word count histogram\")\n", | |
"plt.show()\n", | |
"\n", | |
"# remove rows with under 3 words\n", | |
"raw_data = raw_data[raw_data['word_count']>2]\n", | |
"raw_data = raw_data.reset_index()\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"25th percentile: 11.0\n", | |
"mean: 15.0\n", | |
"75th percentile: 19.0\n" | |
] | |
} | |
], | |
"source": [ | |
"print(\"25th percentile: \", raw_data['word_count'].describe()['25%'])\n", | |
"print(\"mean: \", raw_data['word_count'].describe()['50%'])\n", | |
"print(\"75th percentile: \", raw_data['word_count'].describe()['75%'])" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Clean text columns\n", | |
"stop_words = set(stopwords.words('english'))\n", | |
"stemmer = SnowballStemmer('english')\n", | |
"\n", | |
"\n", | |
"def clean_text(each_text):\n", | |
"\n", | |
" # remove URL from text\n", | |
" each_text_no_url = re.sub(r\"http\\S+\", \"\", each_text)\n", | |
" \n", | |
" # remove numbers from text\n", | |
" text_no_num = re.sub(r'\\d+', '', each_text_no_url)\n", | |
"\n", | |
" # tokenize each text\n", | |
" word_tokens = word_tokenize(text_no_num)\n", | |
" \n", | |
" # remove sptial character\n", | |
" clean_text = []\n", | |
" for word in word_tokens:\n", | |
" clean_text.append(\"\".join([e for e in word if e.isalnum()]))\n", | |
"\n", | |
" # remove stop words and lower\n", | |
" text_with_no_stop_word = [w.lower() for w in clean_text if not w in stop_words] \n", | |
"\n", | |
" # do stemming\n", | |
" stemmed_text = [stemmer.stem(w) for w in text_with_no_stop_word]\n", | |
" \n", | |
" return \" \".join(\" \".join(stemmed_text).split())\n", | |
"\n", | |
"\n", | |
"raw_data['clean_text'] = raw_data['text'].apply(lambda x: clean_text(x) )\n", | |
"raw_data['keyword'] = raw_data['keyword'].fillna(\"none\")\n", | |
"raw_data['clean_keyword'] = raw_data['keyword'].apply(lambda x: clean_text(x) )\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Combine column 'clean_keyword' and 'clean_text' into one\n", | |
"raw_data['keyword_text'] = raw_data['clean_keyword'] + \" \" + raw_data[\"clean_text\"]\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Prepare train and test data" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"feature = 'keyword_text'\n", | |
"label = \"target\"\n", | |
"\n", | |
"# split train and test\n", | |
"X_train, X_test,y_train, y_test = model_selection.train_test_split(raw_data[feature],\n", | |
" raw_data[label],\n", | |
" test_size=0.3,\n", | |
" random_state=0, \n", | |
" shuffle=True)\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Gradient Boosting Classifier" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"X_train_GBC = X_train.values.reshape(-1)\n", | |
"x_test_GBC = X_test.values.reshape(-1)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Vectorize text\n", | |
"vectorizer = CountVectorizer()\n", | |
"X_train_GBC = vectorizer.fit_transform(X_train_GBC)\n", | |
"x_test_GBC = vectorizer.transform(x_test_GBC)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"GradientBoostingClassifier(criterion='friedman_mse', init=None,\n", | |
" learning_rate=0.1, loss='deviance', max_depth=9,\n", | |
" max_features=8, max_leaf_nodes=None,\n", | |
" min_impurity_decrease=0.0, min_impurity_split=None,\n", | |
" min_samples_leaf=2, min_samples_split=6,\n", | |
" min_weight_fraction_leaf=0.0, n_estimators=2000,\n", | |
" n_iter_no_change=None, presort='auto',\n", | |
" random_state=None, subsample=0.9, tol=0.0001,\n", | |
" validation_fraction=0.1, verbose=0,\n", | |
" warm_start=False)" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# Train the model\n", | |
"model = ensemble.GradientBoostingClassifier(learning_rate=0.1, \n", | |
" n_estimators=2000,\n", | |
" max_depth=9,\n", | |
" min_samples_split=6,\n", | |
" min_samples_leaf=2,\n", | |
" max_features=8,\n", | |
" subsample=0.9)\n", | |
"model.fit(X_train_GBC, y_train)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Test accuracy: 0.7911894273127753\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" 0 0.79 0.87 0.83 1309\n", | |
" 1 0.80 0.68 0.73 961\n", | |
"\n", | |
" accuracy 0.79 2270\n", | |
" macro avg 0.79 0.78 0.78 2270\n", | |
"weighted avg 0.79 0.79 0.79 2270\n", | |
"\n", | |
"Test F-scoare: 0.733408323959505\n" | |
] | |
} | |
], | |
"source": [ | |
"# Evaluate the model\n", | |
"predicted_prob = model.predict_proba(x_test_GBC)[:,1]\n", | |
"predicted = model.predict(x_test_GBC)\n", | |
"\n", | |
"accuracy = metrics.accuracy_score(predicted, y_test)\n", | |
"print(\"Test accuracy: \", accuracy)\n", | |
"print(metrics.classification_report(y_test, predicted, target_names=[\"0\", \"1\"]))\n", | |
"print(\"Test F-scoare: \", metrics.f1_score(y_test, predicted))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# Plot confusion matrix\n", | |
"conf_matrix = metrics.confusion_matrix(y_test, predicted)\n", | |
"\n", | |
"fig, ax = plt.subplots()\n", | |
"sns.heatmap(conf_matrix, cbar=False, cmap='Reds', annot=True, fmt='d')\n", | |
"ax.set(xlabel=\"Predicted Value\", ylabel=\"True Value\", title=\"Confusion Matrix\")\n", | |
"ax.set_yticklabels(labels=['0', '1'], rotation=0)\n", | |
"\n", | |
"plt.show()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# LSTM" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# Define some hyperparameters\n", | |
"path_to_glove_file = './glove.6B.300d.txt' # download link: http://nlp.stanford.edu/data/glove.6B.zip\n", | |
"embedding_dim = 300\n", | |
"learning_rate = 1e-3\n", | |
"batch_size = 1024\n", | |
"epochs = 20\n", | |
"sequence_len = 100\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Training Y shape: (5294, 1)\n", | |
"Testing Y shape: (2270, 1)\n" | |
] | |
} | |
], | |
"source": [ | |
"# Define train and test labels\n", | |
"y_train_LSTM = y_train.values.reshape(-1,1)\n", | |
"y_test_LSTM = y_test.values.reshape(-1,1)\n", | |
"\n", | |
"print(\"Training Y shape:\", y_train_LSTM.shape)\n", | |
"print(\"Testing Y shape:\", y_test_LSTM.shape)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Vocabulary Size: 11148\n" | |
] | |
} | |
], | |
"source": [ | |
"# Tokenize train data\n", | |
"tokenizer = Tokenizer()\n", | |
"tokenizer.fit_on_texts(X_train)\n", | |
"\n", | |
"word_index = tokenizer.word_index\n", | |
"vocab_size = len(word_index) + 1\n", | |
"print(\"Vocabulary Size: \", vocab_size)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 19, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Training X shape: (5294, 100)\n", | |
"Testing X shape: (2270, 100)\n" | |
] | |
} | |
], | |
"source": [ | |
"# Pad train and test \n", | |
"X_train = pad_sequences(tokenizer.texts_to_sequences(X_train), maxlen=sequence_len)\n", | |
"X_test = pad_sequences(tokenizer.texts_to_sequences(X_test), maxlen=sequence_len)\n", | |
"\n", | |
"print(\"Training X shape: \", X_train.shape)\n", | |
"print(\"Testing X shape: \", X_test.shape)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 20, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Found 400000 word vectors.\n" | |
] | |
} | |
], | |
"source": [ | |
"# Read word embeddings\n", | |
"embeddings_index = {}\n", | |
"with open(path_to_glove_file) as f:\n", | |
" for line in f:\n", | |
" word, coefs = line.split(maxsplit=1)\n", | |
" coefs = np.fromstring(coefs, \"f\", sep=\" \")\n", | |
" embeddings_index[word] = coefs\n", | |
"\n", | |
"print(\"Found %s word vectors.\" % len(embeddings_index))\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"WARNING: Logging before flag parsing goes to stderr.\n", | |
"W0401 09:42:41.752741 4526493120 deprecation.py:506] From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/keras/initializers.py:119: calling RandomUniform.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", | |
"Instructions for updating:\n", | |
"Call initializer instance with the dtype argument instead of passing it to the constructor\n" | |
] | |
} | |
], | |
"source": [ | |
"# Define embedding layer in Keras\n", | |
"embedding_matrix = np.zeros((vocab_size, embedding_dim))\n", | |
"for word, i in word_index.items():\n", | |
" embedding_vector = embeddings_index.get(word)\n", | |
" if embedding_vector is not None:\n", | |
" embedding_matrix[i] = embedding_vector\n", | |
" \n", | |
"embedding_layer = tf.keras.layers.Embedding(vocab_size,\n", | |
" embedding_dim,\n", | |
" weights=[embedding_matrix],\n", | |
" input_length=sequence_len,\n", | |
" trainable=False)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 22, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"W0401 09:42:41.831162 4526493120 deprecation.py:506] From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", | |
"Instructions for updating:\n", | |
"Call initializer instance with the dtype argument instead of passing it to the constructor\n", | |
"W0401 09:42:41.855180 4526493120 deprecation.py:506] From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:97: calling GlorotUniform.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", | |
"Instructions for updating:\n", | |
"Call initializer instance with the dtype argument instead of passing it to the constructor\n", | |
"W0401 09:42:41.856187 4526493120 deprecation.py:506] From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:97: calling Orthogonal.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", | |
"Instructions for updating:\n", | |
"Call initializer instance with the dtype argument instead of passing it to the constructor\n", | |
"W0401 09:42:41.857138 4526493120 deprecation.py:506] From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:97: calling Zeros.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.\n", | |
"Instructions for updating:\n", | |
"Call initializer instance with the dtype argument instead of passing it to the constructor\n" | |
] | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Model: \"model\"\n", | |
"_________________________________________________________________\n", | |
"Layer (type) Output Shape Param # \n", | |
"=================================================================\n", | |
"input_1 (InputLayer) [(None, 100)] 0 \n", | |
"_________________________________________________________________\n", | |
"embedding (Embedding) (None, 100, 300) 3344400 \n", | |
"_________________________________________________________________\n", | |
"conv1d (Conv1D) (None, 96, 128) 192128 \n", | |
"_________________________________________________________________\n", | |
"bidirectional (Bidirectional (None, 256) 263168 \n", | |
"_________________________________________________________________\n", | |
"dense (Dense) (None, 512) 131584 \n", | |
"_________________________________________________________________\n", | |
"dropout (Dropout) (None, 512) 0 \n", | |
"_________________________________________________________________\n", | |
"dense_1 (Dense) (None, 512) 262656 \n", | |
"_________________________________________________________________\n", | |
"dense_2 (Dense) (None, 1) 513 \n", | |
"=================================================================\n", | |
"Total params: 4,194,449\n", | |
"Trainable params: 850,049\n", | |
"Non-trainable params: 3,344,400\n", | |
"_________________________________________________________________\n" | |
] | |
} | |
], | |
"source": [ | |
"# Define model architecture\n", | |
"sequence_input = Input(shape=(sequence_len, ), dtype='int32')\n", | |
"embedding_sequences = embedding_layer(sequence_input)\n", | |
"\n", | |
"x = Conv1D(128, 5, activation='relu')(embedding_sequences)\n", | |
"x = Bidirectional(LSTM(128, dropout=0.5, recurrent_dropout=0.2))(x)\n", | |
"x = Dense(512, activation='relu')(x)\n", | |
"x = Dropout(0.5)(x)\n", | |
"x = Dense(512, activation='relu')(x)\n", | |
"outputs = Dense(1, activation='sigmoid')(x)\n", | |
"model = Model(sequence_input, outputs)\n", | |
"model.summary()\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 23, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"W0401 09:42:42.555547 4526493120 deprecation.py:323] From /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow/python/ops/nn_impl.py:180: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.\n", | |
"Instructions for updating:\n", | |
"Use tf.where in 2.0, which has the same broadcast rule as np.where\n" | |
] | |
} | |
], | |
"source": [ | |
"# Optimize the model\n", | |
"model.compile(optimizer=Adam(learning_rate=learning_rate), loss='binary_crossentropy', metrics=['accuracy'])\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 24, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Train on 5294 samples, validate on 2270 samples\n", | |
"Epoch 1/20\n", | |
"5294/5294 [==============================] - 22s 4ms/sample - loss: 0.6693 - acc: 0.5518 - val_loss: 0.5874 - val_acc: 0.7414\n", | |
"Epoch 2/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.5778 - acc: 0.7263 - val_loss: 0.5394 - val_acc: 0.7502\n", | |
"Epoch 3/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.5177 - acc: 0.7584 - val_loss: 0.5060 - val_acc: 0.7731\n", | |
"Epoch 4/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.4906 - acc: 0.7743 - val_loss: 0.4949 - val_acc: 0.7740\n", | |
"Epoch 5/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.4694 - acc: 0.7860 - val_loss: 0.4802 - val_acc: 0.7767\n", | |
"Epoch 6/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.4505 - acc: 0.7981 - val_loss: 0.4792 - val_acc: 0.7767\n", | |
"Epoch 7/20\n", | |
"5294/5294 [==============================] - 18s 3ms/sample - loss: 0.4289 - acc: 0.8102 - val_loss: 0.4700 - val_acc: 0.7811\n", | |
"Epoch 8/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.4127 - acc: 0.8264 - val_loss: 0.4749 - val_acc: 0.7855\n", | |
"Epoch 9/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.3925 - acc: 0.8298 - val_loss: 0.4807 - val_acc: 0.7907\n", | |
"Epoch 10/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.3733 - acc: 0.8387 - val_loss: 0.4860 - val_acc: 0.7890\n", | |
"Epoch 11/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.3590 - acc: 0.8434 - val_loss: 0.5011 - val_acc: 0.7912\n", | |
"Epoch 12/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.3223 - acc: 0.8663 - val_loss: 0.5146 - val_acc: 0.7846\n", | |
"Epoch 13/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.2980 - acc: 0.8825 - val_loss: 0.5561 - val_acc: 0.7793\n", | |
"Epoch 14/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.2718 - acc: 0.8874 - val_loss: 0.5606 - val_acc: 0.7863\n", | |
"Epoch 15/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.2349 - acc: 0.9073 - val_loss: 0.6098 - val_acc: 0.7828\n", | |
"Epoch 16/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.2270 - acc: 0.9108 - val_loss: 0.6109 - val_acc: 0.7885\n", | |
"Epoch 17/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.1974 - acc: 0.9260 - val_loss: 0.6200 - val_acc: 0.7855\n", | |
"Epoch 18/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.1658 - acc: 0.9367 - val_loss: 0.7181 - val_acc: 0.7784\n", | |
"Epoch 19/20\n", | |
"5294/5294 [==============================] - 16s 3ms/sample - loss: 0.1497 - acc: 0.9409 - val_loss: 0.7746 - val_acc: 0.7797\n", | |
"Epoch 20/20\n", | |
"5294/5294 [==============================] - 17s 3ms/sample - loss: 0.1377 - acc: 0.9528 - val_loss: 0.8005 - val_acc: 0.7727\n" | |
] | |
} | |
], | |
"source": [ | |
"# Train the LSTM Model\n", | |
"history = model.fit(X_train,\n", | |
" y_train,\n", | |
" batch_size=batch_size,\n", | |
" epochs=epochs, \n", | |
" validation_data=(X_test, y_test))\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 25, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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0tJCbm4u//73v6muruaqq66irKwMM+OWW27hnHPOIS0tjerqagD+9re/8Y9//IOHH36YSy65hKSkJD788EPGjx/P5MmTueaaa6ivryc5OZk//elPlJSU8NOf/pS6ujreeustbrzxRurq6igrK+Oee+5h/fr1fPe732X58uUATJ06lfHjx/Pmm29yzTXXAGBmzJgxg/T09Kh9hiLSPZxzrNvSwJL1NSytqOGLDTUsWV/DFxuqWbGxbpu15PxCu36h3NSEOP+YGEtWSgIpwX5yfJx/TIglJT6WlMQ4fy0o3xagws8lxGmaAZHt6dIYK+fcS8BLHc79NGz/b8DfIls14E+nbf/8pS/6x5dvgDWfbHt94h1QOAY+fAzmPL7t8zrx0EMPkZ2dTV1dHYcccghnnHEGl19+OTNmzKCkpISNGzcC8POf/5zMzEw++cTXYdOmTZ2+dnl5Oe+88w6xsbFUVVXxn//8h7i4OF599VV+/OMf88wzz3Dbbbe1BymAhx9+uP3511xzDddeey1HHnkky5cv5+STT2b+/Pn89re/5d5772X8+PFUV1eTlJTUpXsVkZ5pc20jX2yoad+WbKhhabBf2xgawpoQF0NJTir75qdx4qgChuSmUpKXyuCcVHJSE9RqJLKHaeb17bj77rt57rnnAFixYgX3338/EyZMoKSkBIDs7GwAXn31VZ588sn25/Xr16/T1z733HOJjfWz8VZWVnLxxRezcOFCzIympqZOnu3fc9680EwXVVVVVFdXM378eK677jouvPBCzj77bIqKirp+wyISFbWNzSzdUMsXG3zrU1vL0xdBN16bGIOB2SmU5KZyaEk2Jbmp7ds+mckKTyI9SM8OVp21MJ1y586vH3ih376EN954g1dffZWZM2eSkpLCMcccw7hx41iwYEGXXyN8fpX6+vqtrqWmprbv33zzzRx77LE899xzLF26lGOOOabT125tbeXdd9/dpkXqhhtu4LTTTuOll15i/PjxTJ8+nREjRnS5ziLSfRqaW5i/egsfl29mwZotfBF0462u3Prvh/4ZiZTkpjLxgELf8pSbyuDcVIqzU9T1JtJL9OxgFQWVlZX069ePlJQUFixYwLvvvkt9fT0zZszgiy++aO8KzM7O5sQTT+Tee+9l6tSpgO8K7NevH/3792f+/PkMHz6c5557bodjnSorKxkwYACw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\n", | |
"text/plain": [ | |
"<Figure size 720x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# Plot train accuracy and loss\n", | |
"accuraties = history.history['acc']\n", | |
"losses = history.history['loss']\n", | |
"accuraties_losses = list(zip(accuraties,losses))\n", | |
"\n", | |
"accuraties_losses_df = pd.DataFrame(accuraties_losses, columns={\"accuraties\", \"losses\"})\n", | |
"\n", | |
"plt.figure(figsize=(10,4))\n", | |
"plt.suptitle(\"Train Accuracy vs Train Loss\")\n", | |
"sns.lineplot(data=accuraties_losses_df)\n", | |
"plt.show()\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 26, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"2270/2270 [==============================] - 2s 951us/sample\n", | |
"2270/2270 [==============================] - 2s 858us/sample - loss: 0.8005 - acc: 0.7727\n", | |
"Test Accuracy: 0.7726872\n", | |
" precision recall f1-score support\n", | |
"\n", | |
" 0 0.78 0.84 0.81 1309\n", | |
" 1 0.76 0.68 0.72 961\n", | |
"\n", | |
" accuracy 0.77 2270\n", | |
" macro avg 0.77 0.76 0.76 2270\n", | |
"weighted avg 0.77 0.77 0.77 2270\n", | |
"\n" | |
] | |
} | |
], | |
"source": [ | |
"# Evaluate the model\n", | |
"predicted = model.predict(X_test, verbose=1, batch_size=10000)\n", | |
"\n", | |
"y_predicted = [1 if each > 0.5 else 0 for each in predicted]\n", | |
"\n", | |
"score, test_accuracy = model.evaluate(X_test, y_test, batch_size=10000)\n", | |
"\n", | |
"print(\"Test Accuracy: \", test_accuracy)\n", | |
"print(metrics.classification_report(list(y_test), y_predicted))\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 27, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 432x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"# Plot confusion matrix\n", | |
"conf_matrix = metrics.confusion_matrix(y_test, y_predicted)\n", | |
"\n", | |
"fig, ax = plt.subplots()\n", | |
"sns.heatmap(conf_matrix, cbar=False, cmap='Reds', annot=True, fmt='d')\n", | |
"ax.set(xlabel=\"Predicted Value\", ylabel=\"True Value\", title=\"Confusion Matrix\")\n", | |
"ax.set_yticklabels(labels=['0', '1'], rotation=0)\n", | |
"plt.show()\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"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.7.0b2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment