зеркало из https://github.com/Azure/QnA_Matching.git
936 строки
106 KiB
Plaintext
936 строки
106 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Document (QnA) Matching Data Science Process\n",
|
|
"\n",
|
|
"## Part 5: \n",
|
|
"Calibrated Support Vector Machine (SVM) Classifier (Unigrams)\n",
|
|
"\n",
|
|
"### Overview\n",
|
|
"\n",
|
|
"This notebook is Part 5 of 5, in a series providing a step-by-step description of how to create discriminative training methods to match the correct answer to a given question. Using Python packages and custom code examples, we have implemented the basic framework that combines key phrase learning and latent topic modeling as described in the paper entitled [\"Modeling Multiword Phrases with Constrained Phrases Tree for Improved Topic Modeling of Conversational Speech\"](http://people.csail.mit.edu/hazen/publications/Hazen-SLT-2012.pdf) which was originally presented in the 2012 IEEE Workshop on Spoken Language Technology.\n",
|
|
"\n",
|
|
"Although the paper examines the use of the technology for analyzing human-to-human conversations, the techniques are quite general and can be applied to a wide range of natural language data including news stories, legal documents, research publications, social media forum discussions, customer feedback forms, product reviews, and many more.\n",
|
|
"\n",
|
|
"Also, we implement a Naive Bayes Classifier as described in the paper entitled [\"MCE Training Techniques for Topic Identification of Spoken Audio Documents\"](http://ieeexplore.ieee.org/abstract/document/5742980/). \n",
|
|
"\n",
|
|
"Part 5 of the series shows the implementation of One-versus-rest SVM Classifier. For the features used to train the Classifier, we use the Naive Bayes scores obtained from Part 4. \n",
|
|
"\n",
|
|
"Note: This notebook series are built under Python 3.5 and NLTK 3.2.2."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Import required Python modules"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import pandas as pd\n",
|
|
"import math\n",
|
|
"import gc\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"from sklearn import svm\n",
|
|
"from sklearn.calibration import CalibratedClassifierCV\n",
|
|
"from IPython.display import display\n",
|
|
"\n",
|
|
"%matplotlib inline\n",
|
|
"\n",
|
|
"# suppress all warnings\n",
|
|
"import warnings\n",
|
|
"warnings.filterwarnings(\"ignore\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Read trainQ and testQ into DataFrames"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"trainQ_url = 'https://mezsa.blob.core.windows.net/stackoverflow/trainQwithTokens.tsv'\n",
|
|
"testQ_url = 'https://mezsa.blob.core.windows.net/stackoverflow/testQwithTokens.tsv'\n",
|
|
"\n",
|
|
"trainQ = pd.read_csv(trainQ_url, sep='\\t', index_col='Id', encoding='latin1')\n",
|
|
"testQ = pd.read_csv(testQ_url, sep='\\t', index_col='Id', encoding='latin1')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Create Tokens to IDs Hash\n",
|
|
"\n",
|
|
"For each token in the entire vocabulary, we assign it an unique ID."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# get Token to ID mapping: {Token: tokenId}\n",
|
|
"def tokens_to_ids(tokens, featureHash):\n",
|
|
" token2IdHash = {}\n",
|
|
" for i in range(len(tokens)):\n",
|
|
" tokenList = tokens.iloc[i].split(',')\n",
|
|
" if featureHash is None:\n",
|
|
" for t in tokenList:\n",
|
|
" if t not in token2IdHash.keys():\n",
|
|
" token2IdHash[t] = len(token2IdHash)\n",
|
|
" else:\n",
|
|
" for t in tokenList:\n",
|
|
" if t not in token2IdHash.keys() and t in list(featureHash.keys()):\n",
|
|
" token2IdHash[t] = len(token2IdHash)\n",
|
|
" \n",
|
|
" return token2IdHash"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"token2IdHashInit = tokens_to_ids(trainQ['Tokens'], None)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Total number of unique tokens in the TrainQ: 4977\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(\"Total number of unique tokens in the TrainQ: \" + str(len(token2IdHashInit)))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Create Count Matrix for Each Token in Each Answer"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def count_matrix(frame, token2IdHash, uniqueAnswerId):\n",
|
|
" # create am empty matrix with the shape of:\n",
|
|
" # num_row = num of unique tokens\n",
|
|
" # num_column = num of unique answerIds (N_wA) or num of questions in testQ (tfMatrix)\n",
|
|
" # rowIdx = token2IdHash.values()\n",
|
|
" # colIdx = index of uniqueAnswerId (N_wA) or index of questions in testQ (tfMatrix)\n",
|
|
" num_row = len(token2IdHash)\n",
|
|
" if uniqueAnswerId is not None: # get N_wA\n",
|
|
" num_column = len(uniqueAnswerId)\n",
|
|
" else:\n",
|
|
" num_column = len(frame)\n",
|
|
" countMatrix = np.empty(shape=(num_row, num_column))\n",
|
|
"\n",
|
|
" # loop through each question in the frame to fill in the countMatrix with corresponding counts\n",
|
|
" for i in range(len(frame)):\n",
|
|
" tokens = frame['Tokens'].iloc[i].split(',')\n",
|
|
" if uniqueAnswerId is not None: # get N_wA\n",
|
|
" answerId = frame['AnswerId'].iloc[i]\n",
|
|
" colIdx = uniqueAnswerId.index(answerId)\n",
|
|
" else:\n",
|
|
" colIdx = i\n",
|
|
" \n",
|
|
" for t in tokens:\n",
|
|
" if t in token2IdHash.keys():\n",
|
|
" rowIdx = token2IdHash[t]\n",
|
|
" countMatrix[rowIdx, colIdx] += 1\n",
|
|
"\n",
|
|
" return countMatrix"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# get unique answerId in ascending order\n",
|
|
"uniqueAnswerId = list(np.unique(trainQ['AnswerId']))\n",
|
|
"# calculate the count matrix of all training questions.\n",
|
|
"N_wAInit = count_matrix(trainQ, token2IdHashInit, uniqueAnswerId)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Feature Selection Based on Posteriori Probability P(A|w) \n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/feature_selection.PNG?token=APoO9ioyiKq8Sx0dxZ5onqIzyy6ywUmEks5YnH6cwA%3D%3D\">"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# calculate P(A): [P_A1, P_A2, ...]\n",
|
|
"def prior_probability_answer(answerIds, uniqueAnswerId): \n",
|
|
" P_A = []\n",
|
|
" # convert a pandas series to a list\n",
|
|
" answerIds = list(answerIds)\n",
|
|
" \n",
|
|
" for id in uniqueAnswerId:\n",
|
|
" P_A.append(answerIds.count(id)/len(answerIds))\n",
|
|
" return np.array(P_A)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"P_A = prior_probability_answer(trainQ['AnswerId'], uniqueAnswerId)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# calculate P(A|w)\n",
|
|
"def posteriori_prob(N_wAInit, P_A, uniqueAnswerId):\n",
|
|
" # N_A is the total number of answers\n",
|
|
" N_A = len(uniqueAnswerId)\n",
|
|
" # N_w is the total number of times w appears over all documents \n",
|
|
" # rowSum of count matrix (N_wAInit)\n",
|
|
" N_wInit = np.sum(N_wAInit, axis = 1)\n",
|
|
" # P(A|w) = (N_w|A + N_A * P(A))/(N_w + N_A)\n",
|
|
" N = N_wAInit + N_A * P_A\n",
|
|
" D = N_wInit + N_A\n",
|
|
" P_Aw = np.divide(N.T, D).T \n",
|
|
" \n",
|
|
" return P_Aw"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"P_Aw = posteriori_prob(N_wAInit, P_A, uniqueAnswerId)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# select the top N tokens w which maximize P(A|w) for each A.\n",
|
|
"# get FeatureHash: {token: 1}\n",
|
|
"def feature_selection(P_Aw, token2IdHashInit, topN):\n",
|
|
" featureHash = {}\n",
|
|
" # for each answer A, sort tokens w by P(A|w)\n",
|
|
" sortedIdxMatrix = np.argsort(P_Aw, axis=0)[::-1]\n",
|
|
" # select top N tokens for each answer A\n",
|
|
" topMatrix = sortedIdxMatrix[0:topN, :]\n",
|
|
" # for each token w in topMatrix, add w to FeatureHash if it has not already been included\n",
|
|
" topTokenIdList = np.reshape(topMatrix, topMatrix.shape[0] * topMatrix.shape[1])\n",
|
|
" # get ID to Token mapping: {tokenId: Token}\n",
|
|
" Id2TokenHashInit = {y:x for x, y in token2IdHashInit.items()}\n",
|
|
" \n",
|
|
" for tokenId in topTokenIdList:\n",
|
|
" token = Id2TokenHashInit[tokenId]\n",
|
|
" if token not in featureHash.keys():\n",
|
|
" featureHash[token] = 1\n",
|
|
" return featureHash"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"topN = 10\n",
|
|
"featureHash = feature_selection(P_Aw, token2IdHashInit, topN)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Re-assign ID to Each Selected Token and Re-calculate Count Matrix\n",
|
|
"\n",
|
|
"After selecting the top N tokens of each answer, we use the collection of selected tokens for training and re-assign an ID to each selected token. Based on the new assigned IDs, we re-calculate the Count Matrix."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"token2IdHash = tokens_to_ids(trainQ['Tokens'], featureHash)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"scrolled": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"N_wA = count_matrix(trainQ, token2IdHash, uniqueAnswerId)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Calculate P(w) on Full Collection of Training Questions (w is selected token)\n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/P_w.PNG?token=APoO9vsVzM00o3cEfOPq5mUeQ_2eJK94ks5YnH6ywA%3D%3D\">"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def feature_weights(N_wA, alpha):\n",
|
|
" # N_w is the total number of times w appears over all documents \n",
|
|
" # rowSum of count matrix (N_wA)\n",
|
|
" N_w = np.sum(N_wA, axis = 1)\n",
|
|
" # N_W is the total count of all words\n",
|
|
" N_W = np.sum(N_wA)\n",
|
|
" # N_V is the count of unique words in the vocabulary\n",
|
|
" N_V = N_wA.shape[0]\n",
|
|
" # P(w) = (N_w + 1*alpha) / (N_W +N_V*alpha)\n",
|
|
" N2 = N_w + 1 * alpha\n",
|
|
" D2 = N_W + alpha * N_V\n",
|
|
" P_w = N2/D2\n",
|
|
"\n",
|
|
" return P_w"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"alpha = 0.0001\n",
|
|
"P_w = feature_weights(N_wA, alpha)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Calculate Probability Function P(w|A) and P(w|NotA) on Training Data\n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/probability_function.PNG?token=APoO9rWEZ1g_OgvWT_pleQlhT2DEFw3tks5YnIHzwA%3D%3D\">"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def word_probability_in_answer(N_wA, P_w, beta):\n",
|
|
" # N_V is the count of unique words in the vocabulary\n",
|
|
" N_V = N_wA.shape[0]\n",
|
|
" # N_WA is the total count of all words in questions on answer A \n",
|
|
" # colSum of count matrix (N_wA)\n",
|
|
" N_WA = np.sum(N_wA, axis=0)\n",
|
|
" # P(w|A) = (N_w|A + beta N_V P(w))/(N_W|A + beta * N_V)\n",
|
|
" N = (N_wA.T + beta * N_V * P_w).T\n",
|
|
" D = N_WA + beta * N_V\n",
|
|
" P_wA = N / D\n",
|
|
" \n",
|
|
" return P_wA"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def word_probability_Notin_answer(N_wA, P_w, beta):\n",
|
|
" # N_V is the count of unique words in the vocabulary\n",
|
|
" N_V = N_wA.shape[0]\n",
|
|
" # N_wNotA is the count of w over all documents but not on answer A\n",
|
|
" # N_wNotA = N_w - N_wA\n",
|
|
" N_w = np.sum(N_wA, axis = 1)\n",
|
|
" N_wNotA = (N_w - N_wA.T).T\n",
|
|
" # N_WNotA is the count of all words over all documents but not on answer A\n",
|
|
" # N_WNotA = N_W - N_WA\n",
|
|
" N_W = np.sum(N_wA)\n",
|
|
" N_WA = np.sum(N_wA, axis=0)\n",
|
|
" N_WNotA = N_W - N_WA\n",
|
|
" # P(w|NotA) = (N_w|NotA + beta * N_V * P(w))/(N_W|NotA + beta * N_V)\n",
|
|
" N = (N_wNotA.T + beta * N_V * P_w).T\n",
|
|
" D = N_WNotA + beta * N_V\n",
|
|
" P_wNotA = N / D\n",
|
|
" \n",
|
|
" return P_wNotA"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"beta = 0.0001\n",
|
|
"P_wA = word_probability_in_answer(N_wA, P_w, beta)\n",
|
|
"P_wNotA = word_probability_Notin_answer(N_wA, P_w, beta)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Calculate Naive Bayes Weights\n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/NB_weight.PNG?token=APoO9s-2DejCvW03RgK6zXgiXX6UT5WWks5YnjiRwA%3D%3D\">"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 21,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# given an answer set A, get the NB weights for each word w: {answerId: [(word_index1, weight1), (word_index2, weight2)]}\n",
|
|
"NBWeights = np.log(P_wA / P_wNotA)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Calculate Normalized TF of Each Word w in Training and Test sets\n",
|
|
"\n",
|
|
"Each document/question d is typically represented by a feature vector x that represents the contents of d. Because different documents can have different lengths, it can be useful to apply L1 normalmalized feature vector x. \n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/tf.PNG?token=APoO9tMyEVzqoUJYT9ALcdF3_BryHHEVks5YnIQywA%3D%3D\">"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 22,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def normalize_tf(frame, token2IdHash):\n",
|
|
" N_wQ = count_matrix(frame, token2IdHash, uniqueAnswerId=None)\n",
|
|
" N_WQ = np.sum(N_wQ, axis=0)\n",
|
|
" \n",
|
|
" # find the index where N_WQ is zero\n",
|
|
" zeroIdx = np.where(N_WQ == 0)[0]\n",
|
|
" \n",
|
|
" # if N_WQ is zero, then the x_w for that particular question would be zero.\n",
|
|
" # for a simple calculation, we convert the N_WQ to 1 in those cases so the demoninator is not zero. \n",
|
|
" if len(zeroIdx) > 0:\n",
|
|
" N_WQ[zeroIdx] = 1\n",
|
|
" \n",
|
|
" # x_w = P_wd = count(w)/sum(count(i in V))\n",
|
|
" x_w = N_wQ / N_WQ\n",
|
|
" \n",
|
|
" return x_w"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 23,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"x_wTrain = normalize_tf(trainQ, token2IdHash)\n",
|
|
"x_wTest = normalize_tf(testQ, token2IdHash)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Score Each Question in Test Set Against a Specific Answer\n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/NB_scores.PNG?token=APoO9vABVheo1aZRkUYQq41utE6VRM1Yks5YnITBwA%3D%3D\">"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 24,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"beta_A = 0\n",
|
|
"NBScoresTrain = -beta_A + np.dot(x_wTrain.T, NBWeights)\n",
|
|
"NBScoresTest = -beta_A + np.dot(x_wTest.T, NBWeights)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Fit One-vs-Rest SVM using NB Scores and Calibrate SVM Scores into Probabiilty Estimates\n",
|
|
"\n",
|
|
"Traditional SVM training finds a hyperplane which maximally seperates positive and negative training tokens in a vector space. In its standard form, an SVM is a two-class classifier. To create a multi-class SVM for a problem with N_A classes, a one-versus-rest SVM classifier is typically learned for each answer class a. \n",
|
|
"\n",
|
|
"Firstly, we fit a linear one-vs-rest Support Vector Classifier using _svm.LinearSVC()_ from an open-source Python package **Scikit Learn**. The features are used to train the Classifier are Naive Bayes scores obtained on the training set. Like most surpervised learning methods, SVM Classifier outputs scores s(x) that can be used to rank the questions in the test set from the most probable member to the least probable member of a class a. However, those SVM scores are not equivalent to probabilities, especially in a multi-class classification case. \n",
|
|
"\n",
|
|
"In order to map scores into probability estimates, a parametric approach proposed by John Platt for SVM scores consists in finding the parameters A and B for a sigmoid function of the form P(a|X) such that the negative log-likelihood of the data is minimized.\n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/calibration.PNG?token=APoO9l6Ra5QZVJjn5tR0-jcQUq8wCdufks5YnLoXwA%3D%3D\">\n",
|
|
"\n",
|
|
"**Scikit Learn** has an implementation of such probability calibration. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 25,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# NB Scores as training features\n",
|
|
"# AnswerIds as targets\n",
|
|
"X_train = NBScoresTrain\n",
|
|
"Y_train = np.array(trainQ['AnswerId'])\n",
|
|
"X_test = NBScoresTest"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 26,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Wall time: 16min 50s\n"
|
|
]
|
|
},
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"CalibratedClassifierCV(base_estimator=LinearSVC(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
|
|
" intercept_scaling=1, loss='squared_hinge', max_iter=7,\n",
|
|
" multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
|
|
" verbose=0),\n",
|
|
" cv=3, method='sigmoid')"
|
|
]
|
|
},
|
|
"execution_count": 26,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"# first, fit a Linear SVC model \n",
|
|
"est = svm.LinearSVC(dual=False, multi_class='ovr', max_iter=7)\n",
|
|
"# then fit a Calibrated Classifier with 3-fold cross-validation\n",
|
|
"clf = CalibratedClassifierCV(est, cv=3, method='sigmoid')\n",
|
|
"%time clf.fit(X_train, Y_train) "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 27,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# predict probabilities on the test set\n",
|
|
"Y_test_pred = clf.predict_proba(X_test)\n",
|
|
"testQ['SVMProb'] = list(Y_test_pred)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Rank the Predicted Probability and Calcualte Average Rank \n",
|
|
"\n",
|
|
"We use two evaluation matrices to test our model performance. For each question in the test set, we calculate a calibrated probability against each answer. Then we rank the answers based on their probabilities to calculate Average Rank and Top 10 Percentage in the Test set using the below formula:\n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/evaluation.PNG?token=APoO9hyYDFxGc9FRbmIXU3VGv0wdeCaPks5YnIVtwA%3D%3D\">"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 28,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# sort the predicted probability in descending order and map them to the corresponding AnswerId in Answer set\n",
|
|
"def rank(frame, scores, uniqueAnswerId):\n",
|
|
" frame['SortedAnswers'] = list(np.array(uniqueAnswerId)[np.argsort(-scores, axis=1)])\n",
|
|
" \n",
|
|
" rankList = []\n",
|
|
" for i in range(len(frame)):\n",
|
|
" rankList.append(np.where(frame['SortedAnswers'].iloc[i] == frame['AnswerId'].iloc[i])[0][0] + 1)\n",
|
|
" frame['Rank'] = rankList\n",
|
|
" \n",
|
|
" return frame"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 29,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"testQ = rank(testQ, Y_test_pred, uniqueAnswerId)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 30,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Average of rank: 38.0\n",
|
|
"Total number of questions in test set: 3671\n",
|
|
"Total number of answers: 1275\n",
|
|
"Total number of unique features: 3184\n",
|
|
"Percentage of questions find answers in top 10: 0.612\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print('Average of rank: ' + str(np.floor(testQ['Rank'].mean())))\n",
|
|
"print('Total number of questions in test set: ' + str(len(testQ)))\n",
|
|
"print('Total number of answers: ' + str(len(uniqueAnswerId)))\n",
|
|
"print('Total number of unique features: ' + str(len(featureHash)))\n",
|
|
"print('Percentage of questions find answers in top 10: ' + str(round(len(testQ.query('Rank <= 10'))/len(testQ), 3)))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 31,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# check some results.\n",
|
|
"# uncomment it to execute.\n",
|
|
"# testQ.query('Rank <= 3')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Plots and Results\n",
|
|
"\n",
|
|
"Same as Part 4, we plot the Average Rank and Top 10 Percentage against different numbers of features we use to train the model. We also experiment with different combination of hyperparameters (alpha, beta, and beta_A) and the best performance on this test set is obtained as below.\n",
|
|
"\n",
|
|
"By implementing the One-vs-Rest SVM Classifier, we have again improved the Average Rank from 44 (Part 4) to 37 and Top 10 Percentage from 61.8% (Part 4) to 62%.\n",
|
|
"\n",
|
|
"<img src=\"https://raw.githubusercontent.com/Azure/Document_Matching/master/pic/SVM_results.PNG?token=APoO9tM_VEMo55HNM7JE3r8NkTBV109Wks5YnIluwA%3D%3D\">\n",
|
|
"\n",
|
|
"Please note the script below may take a while to process, so we have provided the results directly. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 41,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def plot(topNList, alpha, beta, beta_A, P_Aw, token2IdHashInit, uniqueAnswerId, trainQ, testQ):\n",
|
|
"\n",
|
|
" numFeatureList = []\n",
|
|
" avgRankList = []\n",
|
|
" top10List = []\n",
|
|
" \n",
|
|
" for topN in topNList: \n",
|
|
" \n",
|
|
" print('TopN = ' + str(topN))\n",
|
|
"\n",
|
|
" featureHash = feature_selection(P_Aw, token2IdHashInit, topN)\n",
|
|
" token2IdHash = tokens_to_ids(trainQ['Tokens'], featureHash)\n",
|
|
" N_wA = count_matrix(trainQ, token2IdHash, uniqueAnswerId)\n",
|
|
"\n",
|
|
" P_w = feature_weights(N_wA, alpha)\n",
|
|
"\n",
|
|
" P_wA = word_probability_in_answer(N_wA, P_w, beta)\n",
|
|
" P_wNotA = word_probability_Notin_answer(N_wA, P_w, beta)\n",
|
|
"\n",
|
|
" NBWeights = np.log(P_wA / P_wNotA)\n",
|
|
"\n",
|
|
" x_wTrain = normalize_tf(trainQ, token2IdHash)\n",
|
|
" x_wTest = normalize_tf(testQ, token2IdHash)\n",
|
|
"\n",
|
|
" NBScoresTrain = -beta_A + np.dot(x_wTrain.T, NBWeights)\n",
|
|
" NBScoresTest = -beta_A + np.dot(x_wTest.T, NBWeights)\n",
|
|
" \n",
|
|
" X_train = NBScoresTrain\n",
|
|
" Y_train = np.array(trainQ['AnswerId'])\n",
|
|
" X_test = NBScoresTest\n",
|
|
" \n",
|
|
" est = svm.LinearSVC(dual=False, multi_class='ovr', max_iter=7)\n",
|
|
" # determine the number of folders in Cross-valdation\n",
|
|
" countHash = {}\n",
|
|
" for i in trainQ['AnswerId']:\n",
|
|
" if i not in countHash.keys():\n",
|
|
" countHash[i] = 1\n",
|
|
" else:\n",
|
|
" countHash[i] += 1\n",
|
|
" cv = sorted(countHash.items(), key=operator.itemgetter(1))[0][1]\n",
|
|
" clf = CalibratedClassifierCV(est, cv=cv, method='sigmoid')\n",
|
|
" %time clf.fit(X_train, Y_train) \n",
|
|
"\n",
|
|
" Y_test_pred = clf.predict_proba(X_test)\n",
|
|
" testQ = rank(testQ, Y_test_pred, uniqueAnswerId)\n",
|
|
"\n",
|
|
" numFeatureList.append(len(featureHash))\n",
|
|
" avgRankList.append(np.floor(testQ['Rank'].mean()))\n",
|
|
" top10List.append(round(len(testQ.query('Rank <= 10'))/len(testQ) * 100, 3) )\n",
|
|
" \n",
|
|
" gc.collect() \n",
|
|
" \n",
|
|
" gc.collect() \n",
|
|
"\n",
|
|
" return numFeatureList, avgRankList, top10List"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 72,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"topNList = [1, 2, 3, 4, 5, 10, 20, 30, 50, 80, 100, 300, 500, 1000, len(token2IdHashInit)]\n",
|
|
"alpha = 0.0001\n",
|
|
"beta = 0.0001\n",
|
|
"beta_A = 0"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Note: this process may take a few hours to complete dependes on the machine that you're running on. \n",
|
|
"# Uncomment the script when you're ready to run.\n",
|
|
"# %time numFeatureList, avgRankList, top10List = plot(topNList, alpha, beta, beta_A, P_Aw, token2IdHashInit, uniqueAnswerId, trainQ, testQ)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {
|
|
"collapsed": true
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"# Results from the plot() function with different number of features.\n",
|
|
"topNList = [1, 2, 3, 4, 5, 10, 20, 30, 50, 80, 100, 300, 500, 1000, 4977]\n",
|
|
"numFeatureList = [655, 1077, 1439, 1743, 2043, 3181, 4458, 4739, 4868, 4898, 4921, 4970, 4977, 4977, 4977]\n",
|
|
"avgRankList_SVM = [69.0, 53.0, 48.0, 40.0, 39.0, 37.0, 37.0, 38.0, 38.0, 37.0, 37.0, 38.0, 38.0, 38.0, 38.0]\n",
|
|
"top10List_SVM = [52.168, 55.979, 57.532, 60.065, 59.956, 61.101, 61.373, 61.972, 62.136, 61.782, 61.782, 61.863, 61.863, 61.863, 61.863]\n",
|
|
"\n",
|
|
"# Results from Naive Bayes Classifier in Part 4.\n",
|
|
"avgRankList_NB = [59.0, 45.0, 44.0, 44.0, 44.0, 46.0, 48.0, 48.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0, 49.0]\n",
|
|
"top10List_NB = [58.05, 60.91, 61.673, 61.645, 61.782, 61.182, 61.618, 61.863, 61.89, 61.918, 61.999, 62.027, 62.027, 62.027, 62.027]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {
|
|
"collapsed": false
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\nMzVmzBgxxkhYWJhUq1ZNrly5Yre/Tp062X4/GGPkmWeeydZWr169xNPTU65evZrnObt06SJVqlSR\n8+fPZ9uX9XeLqyUmJrr8HJl/7y1YsMD22Zjxmdm2bVsBBAiT/D7D86vg6g2YD3ybpWwysDWPY2oC\n14CuuewPc/UHQ8uPWsp9n93nsvZV0ShsEnH16lXp+2jffH8pOcIVbT/55JNisVhkx44dBar/8ccf\nS/v27aVy5cri4+MjDRs2lOnTp2erlzWJOHr0qBhjZO7cubayjA+/uLg4iYyMlICAAKlevbq89tpr\ndm1lHPv222/LO++8I6GhoeLp6Sk///yzJCUlyauvvirh4eFSpkwZCQgIkDZt2simTZuyHW+xWMQY\nY9syJxQHDhyQ++67T8qXLy++vr5y++23y/Lly7Nd1969e6Vdu3bi5+cnNWvWlHHjxsnHH39coCTC\n19dXHn300Xzf482bN4sxRiZPnpxt35IlS8QYIwsWLMj2Pn7yySfi6+srCQkJtn0//PCDWCwWWbZs\nme09zEtYWJjcd5/9763GjRuLMUZ++eUXW9miRYvEGCMHDhwQEZHZs2eLMcb2HtSpU8fuvTbG2L4f\nMpKI77//XoYPHy6VKlWSgIAAiY6Olvj4+HzfnzFjxojFYpEvv/wyx/epMEnEkCFDxMvLS65du5bn\nOevXry/t27fPN7YMn376qdx5553i7+8v5cqVk7Zt28r69evt6kybNk0aNWokPj4+Ur16dXn66afl\n77//tqtz9913S5MmTSQmJkbatGkj/v7+Mnz4cNv+1atXS5s2bSQgIEACAwPl3nvvlb1799q1cfLk\nSenfv7/UrFlTfHx8pFq1atK9e/c8v1/z+72Xsb8gSURxGM6YDLQwxowwxoQaYx4CHgPeAzDGBBhj\nJhpjmhtjahtjOgBfAr8BbpuYYA21siFuAympKe4KQbnBjFkzWPzdYmbMmlEi2l65ciUhISE0b968\nYDHMmEGdOnUYOXIkkyZNolatWjz11FM5disXREpKCp07d6ZatWq8+eab3H777YwePZoxY8Zkq/vx\nxx/z3nvvMWjQIN5++23Kly/P+fPn+fjjj2nXrh0TJ05k7NixxMfH07lzZ3bv3g1ApUqVmDFjBiJC\nz549bV3aPXv2BNIe892iRQt+/fVXRowYwaRJkyhVqhQ9evTgq6++sp3/1KlTREREsHv3bl5++WWG\n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\naNEi5s2bR3BwcIHuomnXrh3jxo3jvffeo3LlygWKLbOMeRETJkygadOmtiGqNm3asHHjRmJiYgo0\nlBEQEFBk4/Bt27bl7rvvZsKECYVaYXX58uUYY2jWrFme9XJbpCxj/kL9+vUB6NGjB8YYXnvttVx7\nVDp27IiXl1e2Rao++ugjzp8/T9euXfON22q1Urp0af71r3/ZEqHMMr5vL1++nG2uSHBwMIGBgQW6\no8UZtCfiOllDrSzZvwQRKdLMXBWdbT9so8YfNbCczJ5zp15LZdsP2xwednBl25D2l/iCBQt48MEH\nadCgAf369aNx48YkJSWxbds2lixZwoABA4C0Ff+8vLzo2rUrgwYN4sKFC3z00UdUqVIlxw/ggvDx\n8eHrr7+mf//+NG/enNWrV7NmzRpGjhxJhQoV8j2+a9euLF26lB49enDvvfcSFxfHBx98QKNGjez+\nuvT19aVhw4Z89tln1KtXj/Lly9O4cWMaNWrEtGnTaNOmDU2aNOHxxx8nJCSEU6dOsX37dv744w9+\n+uknIC3h+vTTT7FarTz77LP4+/szc+ZM6tSpY7udNC/du3cnODiYbt26ERoayqVLl1i/fj0rV66k\nefPmdOvWLdsxffv25YknnuDEiRM5ztnIiTGGl19+uUB1cxIaGkrVqlX57bffeOaZZ2zlbdu25cUX\nX8QYU6AkIjw8nBkzZvDGG29Qt25dKleubBvDz+0DtrBDGZmNHj06xzkCGX777Tfmz58PpK1gun37\ndj755BPq1atH375982z7mWeeITExkejoaOrXr2/7+fj8888JCQmxTXwMDQ1l5MiRtkmzPXv2xMfH\nh//85z/UqFGDN954g4oVKzJixAhee+01OnfuTFRUFAcOHGD69OnceeedBeptCgwMZPr06fTr14+w\nsDAefPBBKlWqxPHjx1m1apVtyfrffvuNDh060Lt3bxo2bIinpydLly7l9OnTBZpQ6hT53b5REjeK\n4BbPDGsOrhHGIHtP782/sip2bvQVKzMcOnRIBg0aJCEhIeLr6yulS5eWu+66S6ZOnWp3O+nKlSul\nWbNm4u/vLyEhIfLWW2/J7Nmzs93eFxERYbc4z9GjR8VisWS7xbN06dJy5MgRsVqtUqpUKalWrVqO\ni01ZLBaZNGlSjrGPHz9egoODxc/PT8LDw2X16tXSv39/CQkJsau3Y8cOueOOO8TX11csFovd7Z5H\n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\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x130cfd40cf8>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"import matplotlib.pyplot as plt\n",
|
|
"line1, = plt.plot(numFeatureList, avgRankList_NB, linestyle='-', marker='o', color='red')\n",
|
|
"line2, = plt.plot(numFeatureList, avgRankList_SVM, linestyle='-', marker='^', color='green')\n",
|
|
"plt.xlabel('Number of Features')\n",
|
|
"plt.ylabel('Average Rank')\n",
|
|
"plt.xlim([500,5500])\n",
|
|
"plt.ylim([35,70])\n",
|
|
"ax = plt.axes() \n",
|
|
"ax.yaxis.grid(True) # horizontal lines\n",
|
|
"ax.legend(handles=[line1, line2], labels=['Naive Bayes', 'Calibrated SVM with NB Scores'], loc=1)\n",
|
|
"plt.show()\n",
|
|
"plt.close()"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"metadata": {
|
|
"collapsed": false,
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n8vbp0wdV9euNWLJkCWlpaTker3fv3qxbt45Dhw6xZs0aDh486DcOIDdxcXGoqncWy/r167n++uvp\n0KGDtyciNTWVb775hri4uDyXm5mI8OCDDwYc+9y5c+zfvz9f9fX0QuXWG9GlSxdWr17N6tWref/9\n93nqqaf48MMPvQNUc3LrrbeyadMmunTpwrZt23jxxRdJSEigRo0afre93n33XVSVkSNHZlvW6tWr\nOXPmTMCA5QceeIBy5coFjEEKCQkJGPy5atUqUlNTueeee/w+syJCq1at+PTTTwEICwujdOnSrFu3\njt9++y3X8ywKNrDSmDxIT09n4syJnE50poulNU7jpRkv8dLJl87/t+gsMB9wT2w43eg0E2dO5KEB\nD53XYLaIiAiAfF38N27cyKhRo9i8eTOnTp3yposIqamp+X7ug8vlIjo62i+tQYMGgDPo01dkZGSW\nZcydO5cJEyawa9cuzpz548W9mcvNyp49e1BVnn76af7+978HbBcRDh06RPXq1dm/fz+tW7cOyOPp\n0s+LDh060KFDB37//Xe2bt3K4sWLmTZtGp07d2bXrl3e++tNmjQhJiaGhQsXei9ICxYsoFKlSnTs\n2DHb8jt16kS5cuVYtGgRX331FS1btiQqKirPF+YqVapQv3591q9fzwMPPMD69etp164dcXFxDBo0\niH379rF9+3ZU9byCCIBatWr5rV955ZWAE9jlx+jRo7nllluYPn06gwcPzjZfzZo1/cZlJCYmUqFC\nBZ544glWrlzJHXfckeNxYmNjWbJkCWfPnuW///0v7777LhMnTuSuu+7iq6++4pprriElJQWXy0XD\nhg2zLcfzs/B8zj2Cg4OJjo4O+FnVqFEjYMzGd999h6p6b234EhHv73bp0qV54YUX+Otf/0rVqlVp\n3bo1iYmJ9O3bl6pVqwbsWxQsiDAmD7y9EJ7XwZWCkOtCeKzMY/T6U+7fdHKycO5CXmv+GmlBad6y\nPb0Rf3n4LwUut1y5clx11VV+A+ZykpKSwq233krDhg2ZOHEitWrVonTp0qxcuZJXXnklzwMMCyqr\nEenz58+nf//+dO/enWHDhlGlShWCgoJ47rnnSElJybVMT53/+te/kpCQkGWeevXqnV/Fs+CZTXHT\nTTdRsWJFxo4dy4cffug3BbZPnz4MHz6c5ORkatSowbp163j44YdzvH9funRpunXrxty5c0lJSWHM\nmDH5rtvNN9/M2rVrvYHO6NGjiYmJoXz58qxfv54dO3ZQtmzZPI+zyE5QUNbvTtR8zqSJi4sjPj6e\n8ePHM3DgwHzt2759e2/PS25BhEepUqWIjY0lNjaW+vXr079/f9555x2efvrpfB07r7L63GdkZCAi\nzJ8/P8tgwDfoGDx4MElJSbz33nt8/PHHjBw5kn/84x98+umnXHvttUVSZ7+6FPkRjLnIZe6F8Ehr\nnMaSt5cw7vFxBe4xSE9PZ8nbS0hL9O+qLazeiMTERGbOnMkXX3yR6+DK5cuXk56ezvLly6lRo4Y3\nfc2aNQU+fkZGBikpKX4Xas+I/+x6HnwtXbqUunXrsmTJEr/0zN3J2T07wNNbERwcHDB7ILM6derw\n3XffBaTv2rUr13rmpEWLFqiq97aJR69evRg+fDgLFiygdu3aZGRk5OnWSe/evZk9ezZBQUHcc889\n+a5PXFwcc+bMYdGiRWRkZHDDDTcgItx888189tln7Ny5kxtvvDHX504U14PEwOmNaNu2LTNmzMjX\nfmfPngXgxIkTBTpuixYtALw/u7p165KRkcGOHTto2rRplvvUqVMHcD7nvp/xM2fOsHfvXjp06JDr\ncevWrYuqUrly5Vw/t+DMlhk6dChDhw7l+++/59prr+Xll1/OcrZUYbMxEcbkIqAXwqPU+Y9fKMqy\nAYYNG0Z4eDj3338/hw4dCtj+/fffex+m4/nm6NvjkJqaypw5c86rDpmf+Dd58mRKly5N+/btc903\nq2+zX3zxRcAYg/DwcICA+8KVK1cmPj6eGTNm8PPPPweU5fsMgE6dOrF582a2bNniTTt8+HCOD4by\n5Ts639fKlSsRkYDbIrVq1SIuLo5FixYxf/58oqKi8jSLpm3btjz77LNMnjw5y2m7ufGMi3jhhRdo\n2rSp9xZVXFwca9asYevWrXm6lVGmTJliuw/fpk0bbrnlFl544YV8PWH1/fffR0Ro1qxZjvmye0iZ\nZ/zCNddcA0DXrl0REcaOHZttj8qtt95KcHBwwEOqZs2axbFjx0hMTMy13gkJCURERPDcc895AyFf\nns/t6dOnA8aKREVFUa5cuTzNaCkM1hNhTC42/nsjNX6ogevnwJg741wGG/+9scC3HYqybHC+iS9Y\nsIB77rmHhg0b0rdvX2JiYkhPT2fjxo0sWbKE/v37A84T/4KDg0lMTGTgwIEcP36cWbNmUbVq1Swv\nwHkREhLCRx99RL9+/WjVqhUffPABH374ISNGjPB7mFJ2EhMTWbZsGV27duWOO+4gJSWFGTNm0Lhx\nY79vl6GhoTRq1IjFixdTv359KlSoQExMDI0bN2bKlCnExcXRpEkTHnjgAaKjozl48CCbNm3ihx9+\n4MsvvwScgGvevHkkJCQwePBgwsPDmTlzJpGRkd7ppDnp0qULUVFRdO7cmbp163Ly5ElWrVrFihUr\naNWqFZ07dw7Yp0+fPjz44IP89NNPWY7ZyIqI8NRTT+Upb1bq1q1LtWrV+Pbbb/2eEdKmTRuefPJJ\nRCRPQURsbCzTp09n3Lhx1KtXjypVqnjv4Wd3gc3vrQxfo0aNynKMgMe3337LW2+9BThPMN20aRNv\nvvkm9evXp0+fPjmW/dhjj3Hq1Cm6devGNddc4/39ePvtt4mOjvYOfKxbty4jRozwDprt3r07ISEh\n/Oc//6FGjRqMGzeOSpUqMXz4cMaOHcttt91GUlISu3btYtq0aVx//fV56m0qV64c06ZNo2/fvjRv\n3px77rmHypUrc+DAAVauXOl9ZP23335L+/bt6dmzJ40aNaJUqVIsW7aMQ4cO5WlAaaHIbfrGxbhg\nUzxNHuVniufFbM+ePTpw4ECNjo7W0NBQjYiI0BtvvFFfe+01v+mkK1as0GbNmml4eLhGR0frSy+9\npG+88UbA9L74+Hht166dd33fvn3qcrkCpnhGRETo3r17NSEhQcuWLavVq1fXsWPH+tXNs++ECROy\nrPvzzz+vUVFRGhYWprGxsfrBBx9ov379NDo62i/f5s2btWXLlhoaGqoul8tvuufevXu1X79+etVV\nV2lISIjWqlVLk5KS9N133/Ur45tvvtG2bdtqeHi41qpVS5977jnv1M3cpnguXrxYe/furfXr19cy\nZcpoeHi4xsTE6MiRI/XEiRNZ7nP06FENDQ3VoKAg77TLzDztmJPc2jCznj17qsvl0nfeecebdubM\nGS1TpoyGhYUFTDHOaornwYMHtXPnznrFFVeoy+XyTvf05M38O7Vu3Tp1uVz6r3/9K8e6+U7xzMwz\nJTIpKckv3eVy+S3BwcFau3Ztffjhh/Xw4cO5tsfHH3+s999/vzZq1EgjIiI0NDRUGzRooEOGDMly\n/zlz5mhsbKyGhYVpxYoVtW3btrpmzRq/PFOnTtVGjRppSEiIVq9eXQcNGqSpqakB59O0adNs6/Wv\nf/1Lb7/9dr3yyis1PDxc69evr3/+8581OTlZVVWPHDmijz32mDZq1EjLlSunV155pd5www26dOnS\nHM+3MKd4ip5HZHihEpHmwNatW7fSvHnzkq6OuYAlJycTGxuLfVaMMZeL3P7uebYDsaqa41xqGxNh\njDHGmAKxIMIYY4wxBWJBhDHGGGMKxIIIY4wxxhSIBRHGGGOMKRALIowxxhhTIBZEGGOMMaZALIgw\nxhhjTIHYY6+NAXbu3FnSVTDGmGJRmH/vLIgwl7VKlSoRHh6e67P1jTHmUhIeHk6lSpXOuxwLIsxl\nrXbt2uzcudPvbY7GGHOpq1SpErVr1z7vciyIMJe92rVrF8ovkzHGXG5KfGCliIwSkYxMy45MecaK\nyI8ickpEVolIvZKqb3FYuHBhSVfhsmNtXvyszYuftXnxu9TbvMSDCLdvgKpANfdys2eDiDwJDAIe\nBK4HTgIfi0jpEqhnsbjUP3QXImvz4mdtXvyszYvfpd7mF8rtjLOqejibbYOBZ1R1BYCI9AUOAl2B\nt4upfsYYY4zJ5ELpiagvIj+IyPciMl9EagGISBROz8QaT0ZVPQZ8AdxQMlU1xhhjDFwYQcRmoB+Q\nADwERAGfiUgZnABCcXoefB10bzPGGGNMCSnx2xmq+rHP6jci8m9gP9AT2FXAYkPh4n2AUGpqKsnJ\nySVdjcuKtXnxszYvftbmxe9ibHOfa2dobnlFVYu2NgXgDiRWAbOA74FmqrrNZ/s64EtVHZrN/r2B\nt4qhqsYYY8yl6l5VXZBThhLvichMRMoC9YC5qrpXRH4G2gPb3NsjgFbAlByK+Ri4F9gH/F6kFTbG\nGGMuLaFAJM61NEcl3hMhIi8Cy3FuYdQAxgBNgUaqekREhgFP4oyb2Ac8AzQGGqtqeknU2RhjjDEX\nRk9ETWABUBE4DGwAWqvqEQBVHS8i4cAMoDywHrjdAghjjDGmZJV4T4QxxhhjLk4XwhRPY4wxxlyE\nLIgwxhhjTIFYEFEERCRORN53P4UzQ0SSssiT40vFRCRERKaIyC8iclxElohIlUx5rhSRt0QkVUSO\nisgs90O6LisiMlxE/i0ix0TkoIi8KyINsshnbV5IROQhEfmvux1SReRzEbktUx5r7yIkIn9z/32Z\nkCnd2r2QFMYLIi/19rYgomiUAb4CHsF54qYfydtLxV4B7gDuBNoAVwFLMxW1AGiIMwX2Dne+GYV5\nIheJOOA1nKm/twLBwCciEubJYG1e6P6HM2uqORALrAX+KSINwdq7qIlIS5y2/W+mdGv3wne+/TCh\nhAAACZBJREFUL4i8tNtbVW0pwgXIAJIypf0IDPVZjwBOAz191tOAbj55rnaXdb17vaF7/TqfPAnA\nWaBaSZ93Cbd5JXfb3GxtXqztfgTob+1d5O1cFtgNtAM+BSb4bLN2L9y2HgUk57D9sm9v64koZpK3\nl4q1wJl+65tnN3DAJ09r4KiqfulT/Gqcno9WRVX/i0R5nHb4FazNi5qIuETkHiAc+Nzau8hNAZar\n6lrfRGv3InM+L4i85Nv7QnhOxOUmLy8Vqwqkuz+Q2eWpBhzy3aiq50TkVy7jl5OJiOB0H25QVc+9\nS2vzIiAiMcAmnKfbHcf5trVbRG7A2rtIuIO1ZjgXp8zsc174PC+I3A1UB0bjvCAyBmtvwIIIc+mZ\nCjQCbirpilwGdgHXAlcAPYA3RaRNyVbp0iUiNXEC5FtV9UxJ1+dyoEXzgshLit3OKH4/A4ITofqq\n6t7myVNanPeE5JQn8wjfIKCCT57LiohMBjoB8ar6k88ma/MioKpnVTVFVb9U1RE4g/wGY+1dVGKB\nykCyiJwRkTPALcBgEUnH+XZr7V6EVDUV+Bbn/U72OceCiGKnqntxPhjtPWnyx0vFPncnbcUZVOOb\n52qgNk73Me5/y4vIdT7Ft8f5UH9RVPW/ULkDiC5AW1U94LvN2rzYuIAQa+8isxpognM741r3sgWY\nD1yrqilYuxcp+eMFkT/a59ytpEd2XooLzhTPa3F+2TOAIe71Wu7tw3BGsnfG+aPwHvAdUNqnjKnA\nXiAe5xvIRmB9puN8gPNHpCVO9/1uYF5Jn38JtPdU4CjOVM+qPkuoTx5r88Jt8+fc7V0HiAH+gfPH\nsp21d7H+HDLPzrB2L9z2fRFnumUd4EZgFU6PT0Vrb3fdS7oCl+KC08WYAZzLtMz2yTMaZ3rQKZzX\nrdbLVEYIzrMPfsEZtPYOUCVTnvI430JScS6iM4Hwkj7/EmjvrNr6HNA3Uz5r88Jr81lACs50tp+B\nT3AHENbexfpzWItPEGHtXujtuxD4P/fn/ADO8xyirL3/WOwFXMYYY4wpEBsTYYwxxpgCsSDCGGOM\nMQViQYQxxhhjCsSCCGOMMcYUiAURxhhjjCkQCyKMMcYYUyAWRBhjjDGmQCyIMMYYY0yBWBBhjDHG\nmAKxIMKYy4CI1BGRDBFpWtJ18RCRq0Vkk4icFpHkkq6PMSb/LIgwphiIyBz3RXxYpvQuIpJRTNW4\n0J5xPwY4AdTH5y2HvkTkDXe7nXP/6/l/dGFVwn2MZYVVnjGXEwsijCkeivMSnydF5IosthUHKfQC\nRYLPY/e6wAZV/T9VPZpDvg+Baj5LdZy3Il5QRMQlIoXexsZcyCyIMKb4rMZ54+VT2WUQkVEi8mWm\ntMEistdn/Q0ReVdEhovIzyJyVET+LiJBIjJeRI6IyP9EpF8Wh2goIhvdtxC+FpE2mY4VIyIfiMhx\nd9lvikhFn+2fishrIjJRRA4DH2VzHiIiI931+F1EvhSRBJ/tGUBzYJS7Z2FkDu2WpqqHVfWQz6I+\nxxkuIikicsp9nDt9juMSkVk+23eJyF982xv4E9DFp5ejjYjc4l6P8Ml7rTuttnv9T+627ywi24Hf\ngVrubfeLyA53O+8QkYd9ygkWkcki8qN7+14ReTKH8zfmgmVBhDHF5xxOAPGYiFyVQ76seiYyp7XD\n+UYeBwwFxgIrgF+B64HpwIwsjjMeeBFoBmwClovIlQDuHpI1wFacC3wCUAV4O1MZfYE04EbgoWzO\nYYi7Xo8DTXBekfy+iNR1b68G7ABecp/HS9mUk5ungD7Ag0AjYCIwT0Ti3NtdwP+AO4GGOLdQxolI\nD/f2l9zn9xFQ1V2Xz93b8vJzCAeGAQOAxsAhEbkX5/XQw4Fr3HUcKyL3ufcZDCQCPYAGwL3Avnyf\nuTEXgpJ+F7kttlwOC/AGsMz9/8+Bme7/dwHO+eQbBSRn2ncwkJKprJRMeXYC63zWXcBxoKd7vQ6Q\nAfzVJ08QcMCTBowAPsxUbk33fvXc658CW/Jwvv8HPJkp7QvgNZ/1L4GReWi3M+5z8SyL3dtK44yp\naJVpn5nA/BzKfA14O6ufjU/aLThBX4RP2rXutNru9T+512My7fsdcHemtBE4t24AJgGrSvozaYst\nhbGUylOkYYwpTE8Ca0SkoN++AbZnWj8IfO1ZUdUMETmC05Pga7NPnnMisgXnGzo4F8l2InI80z6K\nM35hj3t9a04VE5FywFX88Y3eYyNQkNkha3F6PDzjDU66/62H0xOwKtNYhGCcAMVTn0eB/kBtIAwn\n+PC7ZXQe0lX1G59jheO01esiMssnXxDwm/v/c9x13o3TA7JCVVcVUn2MKVYWRBhTzFR1vYh8DDyP\nc0HxlUHgAMisBi+eyVxsNmn5uWVZFngfp3s+cx1+8vn/SYrXSVXNaiBlWfe/nYAfM21LAxCRe3Bu\n3wzFCaCO45zf9bkc0zNjJnNwktnpbOp0P/DvTNvOAajqlyISCdwO3Aq8LSKrVLVnLnUy5oJjQYQx\nJWM48BWwO1P6YZzxAr6uK8TjtgY2AIhIEBALvOrelgx0B/araoGnnarqcRH5EbgJWO+z6SacWxqF\nZQdOsFBHVTdkk+dGYKOqzvAk+IzL8EjH6SnwdRgngKgOpLrTcv05qOoh97nXVdVFOeQ7AbwDvCMi\nS4EPRaS8qv6W3T7GXIgsiDCmBKjqNyLyFvCXTJvWAZPFeZ7EEpxvq7fxx4XsfD0qIntwxlA8DpTH\nGRMAMAXnG/QiERmPM0izPnA3MEBV8zMV9UVgtIik4ARLf8a5XdK7UM4C50LsviU00R0QbQCuwAlW\nUlV1Hs74hPtEpCPOtND7gJZAik9R+4COItIAOILT1ntwBmSOFpG/A1fjtFdejAImicgxnNsVIUAL\noLyqviIiQ3F6dr7E6S3qCfxsAYS5GNnsDGNKzkic30HvxVlVdwGPuJevcC4+L+ahrLzMJFDgb+7l\nK5xv6Z1V9Vf3sX/CuQC7cGZTbAMmAEd9Aoi8BhKvuvd9yV1OR/exvs+lzvmiqk8Dz+Cc0w6cZ0p0\n4o/nSMwAlgGLcG5nVMAJlnzNxOkR2gIcAm5U1bPAPTizK/4LPIEzODIvdXodJxjrj3Pu63AGYXrq\n5Lml8h+cnpna7jobc9GR/H25MMYYY4xxWE+EMcYYYwrEgghjjDHGFIgFEcYYY4wpEAsijDHGGFMg\nFkQYY4wxpkAsiDDGGGNMgVgQYYwxxpgCsSDCGGOMMQViQYQxxhhjCsSCCGOMMcYUiAURxhhjjCmQ\n/w9zubMJ3wEJKgAAAABJRU5ErkJggg==\n",
|
|
"text/plain": [
|
|
"<matplotlib.figure.Figure at 0x130cfe592b0>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"line1, = plt.plot(numFeatureList, top10List_NB, linestyle='-', marker='o', color='red')\n",
|
|
"line2, = plt.plot(numFeatureList, top10List_SVM, linestyle='-', marker='^', color='green')\n",
|
|
"plt.xlabel('Number of Features')\n",
|
|
"plt.ylabel('Top 10 (%)')\n",
|
|
"plt.xlim([500,5500])\n",
|
|
"plt.ylim([50,65])\n",
|
|
"ax = plt.axes() \n",
|
|
"ax.yaxis.grid(True) # horizontal lines\n",
|
|
"ax.legend(handles=[line1, line2], labels=['Naive Bayes', 'Calibrated SVM with NB Scores'], loc=4)\n",
|
|
"plt.show()\n",
|
|
"plt.close()"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"anaconda-cloud": {},
|
|
"kernelspec": {
|
|
"display_name": "Python [default]",
|
|
"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.5.2"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 1
|
|
}
|