{ "cells": [ { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import gzip\n", "from collections import defaultdict\n", "from keras.utils.np_utils import to_categorical\n", "import matplotlib.pyplot as plt\n", "from keras.layers import Dense, LSTM, Embedding\n", "from keras.models import Sequential\n", "from keras.preprocessing.text import Tokenizer,text_to_word_sequence\n", "\n", "from keras.utils.np_utils import to_categorical\n", "from keras.preprocessing.sequence import pad_sequences" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "vocab_size = 400000\n", "embedding_size = 50\n", "maxlen = 10\n", "embeddings_path = 'glove.6B.50d.txt.gz'" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from sklearn.cross_validation import train_test_split\n", "\n", "df = pd.read_csv('Consumer_Complaints.csv', encoding='latin-1')\n", "df = df[pd.notnull(df['Consumer complaint narrative'])]\n", "train, test = train_test_split( df, test_size=0.20, random_state=10)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(196834, 18)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train.shape" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(49209, 18)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "test.shape" ] }, { "cell_type": "code", "execution_count": 9, "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>Date received</th>\n", " <th>Product</th>\n", " <th>Sub-product</th>\n", " <th>Issue</th>\n", " <th>Sub-issue</th>\n", " <th>Consumer complaint narrative</th>\n", " <th>Company public response</th>\n", " <th>Company</th>\n", " <th>State</th>\n", " <th>ZIP code</th>\n", " <th>Tags</th>\n", " <th>Consumer consent provided?</th>\n", " <th>Submitted via</th>\n", " <th>Date sent to company</th>\n", " <th>Company response to consumer</th>\n", " <th>Timely response?</th>\n", " <th>Consumer disputed?</th>\n", " <th>Complaint ID</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>472832</th>\n", " <td>05/15/2015</td>\n", " <td>Mortgage</td>\n", " <td>FHA mortgage</td>\n", " <td>Loan modification,collection,foreclosure</td>\n", " <td>NaN</td>\n", " <td>I am the sister and filing the complaint again...</td>\n", " <td>NaN</td>\n", " <td>Dovenmuehle Mortgage, Inc.</td>\n", " <td>FL</td>\n", " <td>344XX</td>\n", " <td>Older American</td>\n", " <td>Consent provided</td>\n", " <td>Web</td>\n", " <td>05/15/2015</td>\n", " <td>Closed with explanation</td>\n", " <td>Yes</td>\n", " <td>No</td>\n", " <td>1378362</td>\n", " </tr>\n", " <tr>\n", " <th>603094</th>\n", " <td>11/23/2015</td>\n", " <td>Mortgage</td>\n", " <td>Conventional adjustable mortgage (ARM)</td>\n", " <td>Application, originator, mortgage broker</td>\n", " <td>NaN</td>\n", " <td>About a month ago, I inquired about the HARP p...</td>\n", " <td>Company believes it acted appropriately as aut...</td>\n", " <td>Ditech Financial LLC</td>\n", " <td>CA</td>\n", " <td>928XX</td>\n", " <td>NaN</td>\n", " <td>Consent provided</td>\n", " <td>Web</td>\n", " <td>11/23/2015</td>\n", " <td>Closed with explanation</td>\n", " <td>Yes</td>\n", " <td>Yes</td>\n", " <td>1668791</td>\n", " </tr>\n", " <tr>\n", " <th>899867</th>\n", " <td>11/20/2017</td>\n", " <td>Debt collection</td>\n", " <td>Credit card debt</td>\n", " <td>Written notification about debt</td>\n", " <td>Didn't receive notice of right to dispute</td>\n", " <td>Creditor did provide information on how to dis...</td>\n", " <td>Company has responded to the consumer and the ...</td>\n", " <td>BANK OF AMERICA, NATIONAL ASSOCIATION</td>\n", " <td>CA</td>\n", " <td>907XX</td>\n", " <td>NaN</td>\n", " <td>Consent provided</td>\n", " <td>Web</td>\n", " <td>11/22/2017</td>\n", " <td>Closed with explanation</td>\n", " <td>Yes</td>\n", " <td>NaN</td>\n", " <td>2733996</td>\n", " </tr>\n", " <tr>\n", " <th>596705</th>\n", " <td>02/22/2016</td>\n", " <td>Debt collection</td>\n", " <td>Credit card</td>\n", " <td>Communication tactics</td>\n", " <td>Frequent or repeated calls</td>\n", " <td>The account is over the Statutes of Limitation...</td>\n", " <td>Company chooses not to provide a public response</td>\n", " <td>BANK OF AMERICA, NATIONAL ASSOCIATION</td>\n", " <td>NY</td>\n", " <td>104XX</td>\n", " <td>NaN</td>\n", " <td>Consent provided</td>\n", " <td>Web</td>\n", " <td>02/22/2016</td>\n", " <td>Closed with explanation</td>\n", " <td>Yes</td>\n", " <td>Yes</td>\n", " <td>1797211</td>\n", " </tr>\n", " <tr>\n", " <th>445194</th>\n", " <td>04/24/2015</td>\n", " <td>Debt collection</td>\n", " <td>Payday loan</td>\n", " <td>Improper contact or sharing of info</td>\n", " <td>Talked to a third party about my debt</td>\n", " <td>We received a phone call from XXXX from someon...</td>\n", " <td>Company believes complaint caused principally ...</td>\n", " <td>Advance America, Cash Advance Centers, Inc.</td>\n", " <td>VA</td>\n", " <td>224XX</td>\n", " <td>NaN</td>\n", " <td>Consent provided</td>\n", " <td>Web</td>\n", " <td>04/24/2015</td>\n", " <td>Closed with explanation</td>\n", " <td>Yes</td>\n", " <td>No</td>\n", " <td>1345210</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " Date received Product Sub-product \\\n", "472832 05/15/2015 Mortgage FHA mortgage \n", "603094 11/23/2015 Mortgage Conventional adjustable mortgage (ARM) \n", "899867 11/20/2017 Debt collection Credit card debt \n", "596705 02/22/2016 Debt collection Credit card \n", "445194 04/24/2015 Debt collection Payday loan \n", "\n", " Issue \\\n", "472832 Loan modification,collection,foreclosure \n", "603094 Application, originator, mortgage broker \n", "899867 Written notification about debt \n", "596705 Communication tactics \n", "445194 Improper contact or sharing of info \n", "\n", " Sub-issue \\\n", "472832 NaN \n", "603094 NaN \n", "899867 Didn't receive notice of right to dispute \n", "596705 Frequent or repeated calls \n", "445194 Talked to a third party about my debt \n", "\n", " Consumer complaint narrative \\\n", "472832 I am the sister and filing the complaint again... \n", "603094 About a month ago, I inquired about the HARP p... \n", "899867 Creditor did provide information on how to dis... \n", "596705 The account is over the Statutes of Limitation... \n", "445194 We received a phone call from XXXX from someon... \n", "\n", " Company public response \\\n", "472832 NaN \n", "603094 Company believes it acted appropriately as aut... \n", "899867 Company has responded to the consumer and the ... \n", "596705 Company chooses not to provide a public response \n", "445194 Company believes complaint caused principally ... \n", "\n", " Company State ZIP code \\\n", "472832 Dovenmuehle Mortgage, Inc. FL 344XX \n", "603094 Ditech Financial LLC CA 928XX \n", "899867 BANK OF AMERICA, NATIONAL ASSOCIATION CA 907XX \n", "596705 BANK OF AMERICA, NATIONAL ASSOCIATION NY 104XX \n", "445194 Advance America, Cash Advance Centers, Inc. VA 224XX \n", "\n", " Tags Consumer consent provided? Submitted via \\\n", "472832 Older American Consent provided Web \n", "603094 NaN Consent provided Web \n", "899867 NaN Consent provided Web \n", "596705 NaN Consent provided Web \n", "445194 NaN Consent provided Web \n", "\n", " Date sent to company Company response to consumer Timely response? \\\n", "472832 05/15/2015 Closed with explanation Yes \n", "603094 11/23/2015 Closed with explanation Yes \n", "899867 11/22/2017 Closed with explanation Yes \n", "596705 02/22/2016 Closed with explanation Yes \n", "445194 04/24/2015 Closed with explanation Yes \n", "\n", " Consumer disputed? Complaint ID \n", "472832 No 1378362 \n", "603094 Yes 1668791 \n", "899867 NaN 2733996 \n", "596705 Yes 1797211 \n", "445194 No 1345210 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Common methods to read data and get embeddings\n", "def read_data():\n", " df_train = train\n", " df_val = test\n", " categories = list(set(df_train.Product.values))\n", " return df_train,df_val,categories\n", "\n", "def load_embeddings():\n", " word_index = {}\n", " embeddings = np.zeros((vocab_size,embedding_size))\n", " with gzip.open(embeddings_path) as file:\n", " for i,line in enumerate(file):\n", " line_tokens = line.split()\n", " word = line_tokens[0].decode('utf8')\n", " embeddings[i] = np.asarray(line_tokens[1:],dtype='float32')\n", " word_index[word] = i\n", " return embeddings,word_index" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def get_embedding(word,word_index,embeddings):\n", " if word in word_index:\n", " return embeddings[word_index[word]].reshape(((embedding_size,1)))\n", " else:\n", " return np.zeros((embedding_size,1))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# Methods for Neural Network Model\n", "def prepare_data(df_train,df_val,categories):\n", " train_text = df_train['Consumer complaint narrative'].tolist()\n", " val_text = df_val['Consumer complaint narrative'].tolist()\n", " tk = Tokenizer(num_words = vocab_size, lower = True)\n", " tk.fit_on_texts(train_text + val_text)\n", " x_train = pad_sequences(tk.texts_to_sequences(train_text),maxlen=maxlen)\n", " x_val = pad_sequences(tk.texts_to_sequences(val_text),maxlen=maxlen)\n", " y_train = category_to_one_hot(df_train['Product'].values,categories)\n", " y_val = category_to_one_hot(df_val['Product'].values,categories) \n", " return tk.word_index,x_train,y_train,x_val,y_val\n", "\n", "def prepare_data_from_full_word_index(df_train,df_val,categories,word_index):\n", " train_text = df_train['Consumer complaint narrative'].tolist()\n", " val_text = df_val['Consumer complaint narrative'].tolist()\n", " x_train = get_pad_sequences(train_text,word_index)\n", " x_val = get_pad_sequences(val_text,word_index)\n", " y_train = category_to_one_hot(df_train['Product'].values,categories)\n", " y_val = category_to_one_hot(df_val['Product'].values,categories) \n", " return word_index,x_train,y_train,x_val,y_val\n", "\n", "def get_pad_sequences(text_list,word_index):\n", " seqs = []\n", " for text in text_list:\n", " word_seq = text_to_word_sequence(text.lower())\n", " seq = []\n", " for word in word_seq:\n", " if word in word_index:\n", " seq.append(word_index[word])\n", " seqs.append(seq)\n", " return pad_sequences(seqs,maxlen)\n", "\n", "\n", "# Convert the list of categories to one_hot vector\n", "def category_to_one_hot(cat_list,cat_master):\n", " cat_dict = {}\n", " for i,cat in enumerate(cat_master):\n", " cat_dict[cat] = i\n", " cat_integers = [cat_dict[cat] for cat in cat_list]\n", " return to_categorical(cat_integers,num_classes=len(cat_master))\n", "\n", "# Convert one_hot to category\n", "def one_hot_to_category(cat_one_hot_list,cat_master):\n", " return [cat_master[cat_one_hot.argmax()] for cat_one_hot in cat_one_hot_list]\n", "\n", "# Get the embedding weights for the model\n", "def get_embedding_matrix_for_model(embeddings,word_index):\n", " train_val_words = min(vocab_size, len(word_index)) +1\n", " embedding_matrix = np.zeros((train_val_words, embedding_size))\n", " for word, i in word_index.items():\n", " embedding_vector = get_embedding(word,word_index,embeddings).flatten()\n", " if embedding_vector is not None: \n", " embedding_matrix[i] = embedding_vector\n", " return embedding_matrix\n", "\n", "# Build the keras model\n", "def build_model(embedding_matrix,categories):\n", " model = Sequential()\n", " model.add(Embedding(embedding_matrix.shape[0], embedding_size, weights=[embedding_matrix],input_length=maxlen,trainable=False))\n", " model.add(LSTM(32))\n", "# We don't lose much by replacing LSTM with this flatten layer (as we have short sequences)\n", "# model.add(Flatten())\n", " model.add(Dense(32, activation='relu'))\n", " model.add(Dense(len(categories), activation='sigmoid'))\n", " model.compile(optimizer='rmsprop',\n", " loss='categorical_crossentropy',\n", " metrics=['acc'])\n", " return model\n", "\n", "def get_val(numerator,divisor):\n", " return float('nan') if divisor == 0 else np.round(numerator/divisor,3)\n", "\n", "def analyze_predictions(categories,y_true,y_pred):\n", " tp = defaultdict(int)\n", " tn = defaultdict(int)\n", " fp = defaultdict(int)\n", " fn = defaultdict(int)\n", " precisions = []\n", " recalls = []\n", " f1s = []\n", " cat_counts = defaultdict(int)\n", " for cat in y_true:\n", " cat_counts[cat]+=1 \n", " correct = 0\n", " conf_mat = defaultdict(dict)\n", " for cat1 in categories:\n", " for cat2 in categories:\n", " conf_mat[cat1][cat2] = 0\n", " for y,y_hat in zip(y_true,y_pred):\n", " conf_mat[y][y_hat]+=1\n", " if y == y_hat:\n", " correct+=1\n", " tp[y]+=1\n", " else:\n", " fp[y_hat]+=1\n", " fn[y]+=1\n", " print('Overall Accuracy:',round(correct/len(y_pred),3))\n", " for cat in categories:\n", " precision = get_val(tp[cat],tp[cat]+fp[cat])\n", " recall = get_val(tp[cat],(tp[cat]+fn[cat]))\n", " f1 = get_val(2*precision*recall,precision + recall)\n", " precisions.append(precision)\n", " recalls.append(recall) \n", " f1s.append(f1)\n", " print('{} --> Precision:{},Recall:{},F1:{}'.format(cat,precision,recall,f1))\n", " print ('\\nAverages---> Precision:{}, Recall:{}, F1:{}'.format(np.round(np.nanmean(precisions),3), np.round(np.nanmean(recalls),3),\n", " np.round(np.nanmean(f1s),3))\n", " )\n", " \n", " print('\\nConfusion Matrix')\n", " for cat1 in categories:\n", " print('\\n' +cat1+'({}) --> '.format(cat_counts[cat1]),end='')\n", " for cat2 in categories:\n", " print('{}({})'.format(cat2,conf_mat[cat1][cat2]),end=' , ')\n", " print('')\n", " \n", "\n", "\n", "# From Deep Learning with Python book\n", "def make_history_plot(history):\n", " acc = history.history['acc']\n", " val_acc = history.history['val_acc']\n", " loss = history.history['loss']\n", " val_loss = history.history['val_loss']\n", "\n", " epochs = range(1, len(acc) + 1)\n", "\n", " plt.plot(epochs, acc, 'bo', label='Training acc')\n", " plt.plot(epochs, val_acc, 'b', color='green',label='Validation acc')\n", " plt.title('Training and validation accuracy')\n", " plt.legend()\n", "\n", " plt.figure()\n", "\n", " plt.plot(epochs, loss, 'bo', label='Training loss')\n", " plt.plot(epochs, val_loss, 'b', color='green',label='Validation loss')\n", " plt.title('Training and validation loss')\n", " plt.legend()\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "np.random.seed(42) # for reproducibility\n", "from IPython.display import SVG\n", "from keras.utils.vis_utils import model_to_dot\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "df_train,df_val,categories = read_data()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "#Load Glove 50-d embeddings\n", "embeddings,word_index = load_embeddings()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "#Prepare the data for the model\n", "tk_word_index,x_train,y_train,x_val,y_val = prepare_data_from_full_word_index(df_train,df_val,categories,word_index)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "embedding_1 (Embedding) (None, 10, 50) 20000050 \n", "_________________________________________________________________\n", "lstm_1 (LSTM) (None, 32) 10624 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 32) 1056 \n", "_________________________________________________________________\n", "dense_2 (Dense) (None, 18) 594 \n", "=================================================================\n", "Total params: 20,012,324\n", "Trainable params: 12,274\n", "Non-trainable params: 20,000,050\n", "_________________________________________________________________\n" ] } ], "source": [ "# Get the embedding matrix for the model, build model, display model summary\n", "embedding_matrix = get_embedding_matrix_for_model(embeddings,word_index)\n", "model = build_model(embedding_matrix,categories)\n", "model.summary()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 196834 samples, validate on 49209 samples\n", "Epoch 1/5\n", "196834/196834 [==============================] - 96s 487us/step - loss: 2.0187 - acc: 0.3172 - val_loss: 1.9270 - val_acc: 0.3612\n", "Epoch 2/5\n", "196834/196834 [==============================] - 87s 443us/step - loss: 1.9030 - acc: 0.3718 - val_loss: 1.8884 - val_acc: 0.3762\n", "Epoch 3/5\n", "196834/196834 [==============================] - 84s 427us/step - loss: 1.8770 - acc: 0.3827 - val_loss: 1.8768 - val_acc: 0.3806\n", "Epoch 4/5\n", "196834/196834 [==============================] - 82s 418us/step - loss: 1.8639 - acc: 0.3873 - val_loss: 1.8697 - val_acc: 0.3855\n", "Epoch 5/5\n", "196834/196834 [==============================] - 91s 464us/step - loss: 1.8582 - acc: 0.3906 - val_loss: 1.8717 - val_acc: 0.3877\n" ] } ], "source": [ "# Train the model, record history\n", "history = model.fit(x_train, y_train,\n", " epochs=5,\n", " batch_size=24,\n", " shuffle=False,\n", " validation_data=(x_val, y_val))" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x1a26169908>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\ndthhFBYWMnjwYC688ELS0tLKLLNt2zYGDhzIhAkTuOmmm3j22We55ZZbDli3u/PJJ58wffp07rnn\nHmbOnMljjz1Gp06dePXVV1mwYAFZWVmVxpefn89tt93GnDlzaNu2LaeddhozZswgOTmZzZs3s3Dh\nQgC2bg2uYH/ggQdYs2YNTZs2LZkXCw3mzt0RI2D1aigqCn4q6YvUjrrsUzvmmGP40Y9+VPJ+6tSp\nZGVlkZWVxdKlS1myZMkByzRv3pwzzjgDgBNOOIHVq1eXu+4LLrjggDoffvghw4YNA6B379707Nmz\n0vg+/vhjTj31VDp06EBCQgKXXHIJs2fP5thjj2X58uXccMMNvPXWW7Rt2xaAnj17MnLkSHJycmp0\nA1ZNNZjELyJ1o6K+s9roU2vZsmXJ9IoVK3jkkUd4//33ycvLY+jQoeVez960adOS6caNG1NYWFju\nups1a3ZAneoOTFVR/fbt25OXl8fJJ5/Mo48+ylVXXQXAW2+9xbhx4/jkk0/Izs5m37591dpetCjx\ni0i1xKpPbfv27bRu3Zo2bdqwfv163nrrrahv4+STT+bll18GYOHCheV+oyitX79+zJo1iy1btlBY\nWMi0adMYOHAgBQUFuDv//u//zt133828efPYt28f+fn5nHrqqfzud7+joKCAXfu3mdWRevk8fhGp\nv2LVp5aVlUVaWhrp6ekcffTR9O/fP+rbuP7667nsssvIyMggKyuL9PT0kmaa8nTp0oV77rmHQYMG\n4e6cc845nHXWWcybN48rr7wSd8fM+O///m8KCwu55JJL2LFjB0VFRdx88820bt066p8hEvVyzN3s\n7GzXQCwidWfp0qWkpqbGOoyYKywspLCwkMTERFasWMHpp5/OihUraNKkfp0jl/f7MrO57p4dyfL1\n69OIiMTQzp07GTJkCIWFhbg7Tz31VL1L+tHQ8D6RiMhBateuHXPnzo11GLVOnbsiInFGiV9EJM4o\n8YuIxBklfhGROKPELyIxN2jQoANuyHr44Ye55pprKlgi0KpVKwDWrVvHhRdeWOG6q7o8/OGHHy5z\nM9WZZ54ZlWfp3HXXXTz44IM1Xk+0KfGLSMwNHz6cadOmlZk3bdo0hg8fHtHyRx55JK+88spBb3//\nxP/GG2/Qrl27g15ffafELyIxd+GFFzJjxgy+++47AFavXs26des4+eSTS66tz8rKolevXvzlL385\nYPnVq1eTnp4OwO7duxk2bBgZGRlcfPHF7N69u6Te1VdfXfJY5zvvvBOARx99lHXr1jF48GAGDx4M\nQEpKCps3bwbgoYceIj09nfT09JLHOq9evZrU1FR+8Ytf0LNnT04//fQy2ylPbm4u/fr1IyMjg5/9\n7Gd88803JdtPS0sjIyOj5AFxf//730sGo+nTpw87duw46H1bHl3HLyJl/Grmr8jdEN3RpTI7ZfLw\n0IcrLG/fvj19+/Zl5syZnHfeeUybNo2LL74YMyMxMZHXXnuNNm3asHnzZvr168e5555b4dizEydO\npEWLFuTl5ZGXl1fm0cr3338/hx12GPv27WPIkCHk5eXxy1/+koceeohZs2bRoUOHMuuaO3cukydP\n5uOPP8bdOfHEExk4cCBJSUmsWLGCqVOn8sc//pGLLrqIV199tdJn7F922WU89thjDBw4kDvuuIO7\n776bhx9+mAkTJrBq1SqaNWtW0rz04IMP8sQTT9C/f3927txJYmJidXZ3lXTGLyL1QunmntLNPO7O\n+PHjycjI4LTTTuOrr75i48aNFa5n9uzZJQk4IyODjIyMkrKXX36ZrKws+vTpw+LFi6t8CNuHH37I\nz372M1q2bEmrVq244IIL+Mc//gFA9+7dycwMxpWq7PHPEIwRsHXrVgYOHAjA5ZdfzuzZs0tiHDFi\nBFOmTCm5S7h///7cdNNNPProo2zdujXqdw9HMvRiV+AFoBNQBExy90f2q2PAI8CZwC5glLvPC8su\nB24Lq97n7s9HL3wRibbKzsxr0/nnn89NN93EvHnz2L17d8mZek5ODgUFBcydO5eEhARSUlLKfRxz\naeV9G1i1ahUPPvggn376KUlJSYwaNarK9VT2LLPixzpD8Gjnqpp6KvK3v/2N2bNnM336dO69914W\nL17MLbfcwllnncUbb7xBv379ePfdd+nRo8dBrb88kZzxFwK/dvdUoB9wrZml7VfnDOC48DUWmAhg\nZocBdxKMw9sXuNPMkqIUu4g0IK1atWLQoEFcccUVZTp1t23bxuGHH05CQgKzZs1iTXkDbJcyYMCA\nkkHVFy1aRF5eHhA81rlly5a0bduWjRs38uabb5Ys07p163Lb0QcMGMDrr7/Orl27+Pbbb3nttdc4\n5ZRTqv3Z2rZtS1JSUsm3hRdffJGBAwdSVFTE2rVrGTx4MA888ABbt25l586dfP755/Tq1Yubb76Z\n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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x1a26ddf320>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "make_history_plot(history)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overall Accuracy: 0.395\n", "Consumer Loan --> Precision:0.457,Recall:0.061,F1:0.108\n", "Mortgage --> Precision:0.377,Recall:0.626,F1:0.471\n", "Payday loan, title loan, or personal loan --> Precision:nan,Recall:0.0,F1:nan\n", "Money transfer, virtual currency, or money service --> Precision:nan,Recall:0.0,F1:nan\n", "Credit reporting, credit repair services, or other personal consumer reports --> Precision:0.374,Recall:0.304,F1:0.335\n", "Vehicle loan or lease --> Precision:nan,Recall:0.0,F1:nan\n", "Credit reporting --> Precision:0.431,Recall:0.293,F1:0.349\n", "Prepaid card --> Precision:nan,Recall:0.0,F1:nan\n", "Other financial service --> Precision:nan,Recall:0.0,F1:nan\n", "Credit card or prepaid card --> Precision:nan,Recall:0.0,F1:nan\n", "Money transfers --> Precision:nan,Recall:0.0,F1:nan\n", "Student loan --> Precision:0.628,Recall:0.187,F1:0.288\n", "Virtual currency --> Precision:nan,Recall:0.0,F1:nan\n", "Payday loan --> Precision:nan,Recall:0.0,F1:nan\n", "Bank account or service --> Precision:0.309,Recall:0.304,F1:0.306\n", "Checking or savings account --> Precision:nan,Recall:0.0,F1:nan\n", "Credit card --> Precision:0.338,Recall:0.187,F1:0.241\n", "Debt collection --> Precision:0.414,Recall:0.706,F1:0.522\n", "\n", "Averages---> Precision:0.416, Recall:0.148, F1:0.328\n", "\n", "Confusion Matrix\n", "\n", "Consumer Loan(7600) --> Consumer Loan(462) , Mortgage(2537) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(638) , Vehicle loan or lease(0) , Credit reporting(254) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(137) , Virtual currency(0) , Payday loan(0) , Bank account or service(330) , Checking or savings account(0) , Credit card(299) , Debt collection(2943) , \n", "Mortgage(32687) --> Consumer Loan(24) , Mortgage(20463) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(1773) , Vehicle loan or lease(0) , Credit reporting(580) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(377) , Virtual currency(0) , Payday loan(0) , Bank account or service(1333) , Checking or savings account(0) , Credit card(610) , Debt collection(7527) , \n", "Payday loan, title loan, or personal loan(1252) --> Consumer Loan(18) , Mortgage(455) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(69) , Vehicle loan or lease(0) , Credit reporting(23) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(47) , Virtual currency(0) , Payday loan(0) , Bank account or service(83) , Checking or savings account(0) , Credit card(43) , Debt collection(514) , \n", "Money transfer, virtual currency, or money service(1306) --> Consumer Loan(0) , Mortgage(385) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(72) , Vehicle loan or lease(0) , Credit reporting(17) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(2) , Virtual currency(0) , Payday loan(0) , Bank account or service(368) , Checking or savings account(0) , Credit card(68) , Debt collection(394) , \n", "Credit reporting, credit repair services, or other personal consumer reports(28704) --> Consumer Loan(112) , Mortgage(4235) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(8728) , Vehicle loan or lease(0) , Credit reporting(5492) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(176) , Virtual currency(0) , Payday loan(0) , Bank account or service(317) , Checking or savings account(0) , Credit card(599) , Debt collection(9045) , \n", "Vehicle loan or lease(1584) --> Consumer Loan(146) , Mortgage(518) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(143) , Vehicle loan or lease(0) , Credit reporting(48) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(22) , Virtual currency(0) , Payday loan(0) , Bank account or service(70) , Checking or savings account(0) , Credit card(66) , Debt collection(571) , \n", "Credit reporting(25280) --> Consumer Loan(63) , Mortgage(3430) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(5221) , Vehicle loan or lease(0) , Credit reporting(7407) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(135) , Virtual currency(0) , Payday loan(0) , Bank account or service(245) , Checking or savings account(0) , Credit card(459) , Debt collection(8320) , \n", "Prepaid card(1169) --> Consumer Loan(4) , Mortgage(311) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(38) , Vehicle loan or lease(0) , Credit reporting(11) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(3) , Virtual currency(0) , Payday loan(0) , Bank account or service(305) , Checking or savings account(0) , Credit card(176) , Debt collection(321) , \n", "Other financial service(239) --> Consumer Loan(1) , Mortgage(82) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(10) , Vehicle loan or lease(0) , Credit reporting(4) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(5) , Virtual currency(0) , Payday loan(0) , Bank account or service(33) , Checking or savings account(0) , Credit card(7) , Debt collection(97) , \n", "Credit card or prepaid card(6074) --> Consumer Loan(10) , Mortgage(1596) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(577) , Vehicle loan or lease(0) , Credit reporting(156) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(27) , Virtual currency(0) , Payday loan(0) , Bank account or service(737) , Checking or savings account(0) , Credit card(1117) , Debt collection(1854) , \n", "Money transfers(1205) --> Consumer Loan(1) , Mortgage(335) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(77) , Vehicle loan or lease(0) , Credit reporting(14) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(1) , Virtual currency(0) , Payday loan(0) , Bank account or service(353) , Checking or savings account(0) , Credit card(39) , Debt collection(385) , \n", "Student loan(12242) --> Consumer Loan(20) , Mortgage(5130) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(633) , Vehicle loan or lease(0) , Credit reporting(204) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(2292) , Virtual currency(0) , Payday loan(0) , Bank account or service(333) , Checking or savings account(0) , Credit card(274) , Debt collection(3356) , \n", "Virtual currency(14) --> Consumer Loan(0) , Mortgage(4) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(1) , Vehicle loan or lease(0) , Credit reporting(0) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(0) , Virtual currency(0) , Payday loan(0) , Bank account or service(3) , Checking or savings account(0) , Credit card(1) , Debt collection(5) , \n", "Payday loan(1402) --> Consumer Loan(1) , Mortgage(464) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(62) , Vehicle loan or lease(0) , Credit reporting(21) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(46) , Virtual currency(0) , Payday loan(0) , Bank account or service(94) , Checking or savings account(0) , Credit card(49) , Debt collection(665) , \n", "Bank account or service(11915) --> Consumer Loan(18) , Mortgage(3198) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(672) , Vehicle loan or lease(0) , Credit reporting(197) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(35) , Virtual currency(0) , Payday loan(0) , Bank account or service(3626) , Checking or savings account(0) , Credit card(857) , Debt collection(3312) , \n", "Checking or savings account(3793) --> Consumer Loan(5) , Mortgage(963) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(233) , Vehicle loan or lease(0) , Credit reporting(61) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(16) , Virtual currency(0) , Payday loan(0) , Bank account or service(1219) , Checking or savings account(0) , Credit card(204) , Debt collection(1092) , \n", "Credit card(15089) --> Consumer Loan(25) , Mortgage(3871) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(1379) , Vehicle loan or lease(0) , Credit reporting(481) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(58) , Virtual currency(0) , Payday loan(0) , Bank account or service(1556) , Checking or savings account(0) , Credit card(2826) , Debt collection(4893) , \n", "Debt collection(45279) --> Consumer Loan(102) , Mortgage(6279) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(3004) , Vehicle loan or lease(0) , Credit reporting(2214) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(273) , Virtual currency(0) , Payday loan(0) , Bank account or service(745) , Checking or savings account(0) , Credit card(674) , Debt collection(31988) , \n" ] } ], "source": [ "# Make and analyze training predictions\n", "train_predictions = one_hot_to_category(model.predict(x_train),categories)\n", "analyze_predictions(categories,df_train['Product'].values,train_predictions)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overall Accuracy: 0.388\n", "Consumer Loan --> Precision:0.475,Recall:0.072,F1:0.125\n", "Mortgage --> Precision:0.373,Recall:0.625,F1:0.467\n", "Payday loan, title loan, or personal loan --> Precision:nan,Recall:0.0,F1:nan\n", "Money transfer, virtual currency, or money service --> Precision:nan,Recall:0.0,F1:nan\n", "Credit reporting, credit repair services, or other personal consumer reports --> Precision:0.365,Recall:0.291,F1:0.324\n", "Vehicle loan or lease --> Precision:nan,Recall:0.0,F1:nan\n", "Credit reporting --> Precision:0.407,Recall:0.282,F1:0.333\n", "Prepaid card --> Precision:nan,Recall:0.0,F1:nan\n", "Other financial service --> Precision:nan,Recall:0.0,F1:nan\n", "Credit card or prepaid card --> Precision:nan,Recall:0.0,F1:nan\n", "Money transfers --> Precision:nan,Recall:0.0,F1:nan\n", "Student loan --> Precision:0.603,Recall:0.187,F1:0.285\n", "Virtual currency --> Precision:nan,Recall:0.0,F1:nan\n", "Payday loan --> Precision:nan,Recall:0.0,F1:nan\n", "Bank account or service --> Precision:0.3,Recall:0.294,F1:0.297\n", "Checking or savings account --> Precision:nan,Recall:0.0,F1:nan\n", "Credit card --> Precision:0.333,Recall:0.186,F1:0.239\n", "Debt collection --> Precision:0.408,Recall:0.687,F1:0.512\n", "\n", "Averages---> Precision:0.408, Recall:0.146, F1:0.323\n", "\n", "Confusion Matrix\n", "\n", "Consumer Loan(1873) --> Consumer Loan(134) , Mortgage(647) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(158) , Vehicle loan or lease(0) , Credit reporting(69) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(41) , Virtual currency(0) , Payday loan(0) , Bank account or service(82) , Checking or savings account(0) , Credit card(56) , Debt collection(686) , \n", "Mortgage(8151) --> Consumer Loan(9) , Mortgage(5092) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(443) , Vehicle loan or lease(0) , Credit reporting(114) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(110) , Virtual currency(0) , Payday loan(0) , Bank account or service(344) , Checking or savings account(0) , Credit card(168) , Debt collection(1871) , \n", "Payday loan, title loan, or personal loan(293) --> Consumer Loan(4) , Mortgage(111) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(11) , Vehicle loan or lease(0) , Credit reporting(7) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(7) , Virtual currency(0) , Payday loan(0) , Bank account or service(22) , Checking or savings account(0) , Credit card(10) , Debt collection(121) , \n", "Money transfer, virtual currency, or money service(305) --> Consumer Loan(0) , Mortgage(82) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(21) , Vehicle loan or lease(0) , Credit reporting(7) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(0) , Virtual currency(0) , Payday loan(0) , Bank account or service(85) , Checking or savings account(0) , Credit card(7) , Debt collection(103) , \n", "Credit reporting, credit repair services, or other personal consumer reports(7255) --> Consumer Loan(21) , Mortgage(1083) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(2110) , Vehicle loan or lease(0) , Credit reporting(1424) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(59) , Virtual currency(0) , Payday loan(0) , Bank account or service(82) , Checking or savings account(0) , Credit card(148) , Debt collection(2328) , \n", "Vehicle loan or lease(389) --> Consumer Loan(33) , Mortgage(144) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(37) , Vehicle loan or lease(0) , Credit reporting(8) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(9) , Virtual currency(0) , Payday loan(0) , Bank account or service(16) , Checking or savings account(0) , Credit card(20) , Debt collection(122) , \n", "Credit reporting(6313) --> Consumer Loan(26) , Mortgage(879) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(1279) , Vehicle loan or lease(0) , Credit reporting(1779) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(31) , Virtual currency(0) , Payday loan(0) , Bank account or service(57) , Checking or savings account(0) , Credit card(116) , Debt collection(2146) , \n", "Prepaid card(281) --> Consumer Loan(3) , Mortgage(76) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(9) , Vehicle loan or lease(0) , Credit reporting(0) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(2) , Virtual currency(0) , Payday loan(0) , Bank account or service(81) , Checking or savings account(0) , Credit card(32) , Debt collection(78) , \n", "Other financial service(54) --> Consumer Loan(0) , Mortgage(12) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(5) , Vehicle loan or lease(0) , Credit reporting(2) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(0) , Virtual currency(0) , Payday loan(0) , Bank account or service(9) , Checking or savings account(0) , Credit card(1) , Debt collection(25) , \n", "Credit card or prepaid card(1542) --> Consumer Loan(4) , Mortgage(421) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(127) , Vehicle loan or lease(0) , Credit reporting(43) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(6) , Virtual currency(0) , Payday loan(0) , Bank account or service(187) , Checking or savings account(0) , Credit card(297) , Debt collection(457) , \n", "Money transfers(292) --> Consumer Loan(0) , Mortgage(88) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(20) , Vehicle loan or lease(0) , Credit reporting(3) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(3) , Virtual currency(0) , Payday loan(0) , Bank account or service(74) , Checking or savings account(0) , Credit card(15) , Debt collection(89) , \n", "Student loan(3085) --> Consumer Loan(9) , Mortgage(1250) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(159) , Vehicle loan or lease(0) , Credit reporting(59) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(576) , Virtual currency(0) , Payday loan(0) , Bank account or service(90) , Checking or savings account(0) , Credit card(74) , Debt collection(868) , \n", "Virtual currency(2) --> Consumer Loan(0) , Mortgage(0) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(0) , Vehicle loan or lease(0) , Credit reporting(0) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(0) , Virtual currency(0) , Payday loan(0) , Bank account or service(0) , Checking or savings account(0) , Credit card(0) , Debt collection(2) , \n", "Payday loan(346) --> Consumer Loan(1) , Mortgage(106) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(20) , Vehicle loan or lease(0) , Credit reporting(4) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(21) , Virtual currency(0) , Payday loan(0) , Bank account or service(24) , Checking or savings account(0) , Credit card(13) , Debt collection(157) , \n", "Bank account or service(2972) --> Consumer Loan(6) , Mortgage(801) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(190) , Vehicle loan or lease(0) , Credit reporting(68) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(10) , Virtual currency(0) , Payday loan(0) , Bank account or service(874) , Checking or savings account(0) , Credit card(204) , Debt collection(819) , \n", "Checking or savings account(929) --> Consumer Loan(2) , Mortgage(238) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(67) , Vehicle loan or lease(0) , Credit reporting(20) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(1) , Virtual currency(0) , Payday loan(0) , Bank account or service(281) , Checking or savings account(0) , Credit card(55) , Debt collection(265) , \n", "Credit card(3753) --> Consumer Loan(9) , Mortgage(970) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(327) , Vehicle loan or lease(0) , Credit reporting(126) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(14) , Virtual currency(0) , Payday loan(0) , Bank account or service(393) , Checking or savings account(0) , Credit card(697) , Debt collection(1217) , \n", "Debt collection(11374) --> Consumer Loan(21) , Mortgage(1644) , Payday loan, title loan, or personal loan(0) , Money transfer, virtual currency, or money service(0) , Credit reporting, credit repair services, or other personal consumer reports(803) , Vehicle loan or lease(0) , Credit reporting(633) , Prepaid card(0) , Other financial service(0) , Credit card or prepaid card(0) , Money transfers(0) , Student loan(65) , Virtual currency(0) , Payday loan(0) , Bank account or service(209) , Checking or savings account(0) , Credit card(182) , Debt collection(7817) , \n" ] } ], "source": [ "# Make and analyze validation predictions\n", "val_predictions = one_hot_to_category(model.predict(x_val),categories)\n", "analyze_predictions(categories,df_val['Product'].values,val_predictions)" ] }, { "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.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }