Created
November 29, 2016 17:39
-
-
Save vitillo/f14980fcf17ae602fc490b6aef3de738 to your computer and use it in GitHub Desktop.
Threeherder failure classification
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": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from sklearn.datasets import load_files\n", | |
"from sklearn.feature_extraction.text import CountVectorizer\n", | |
"from sklearn.feature_extraction.text import TfidfTransformer\n", | |
"from sklearn.linear_model import SGDClassifier\n", | |
"from sklearn.metrics.pairwise import cosine_similarity\n", | |
"from sklearn.model_selection import train_test_split\n", | |
"\n", | |
"import matplotlib.pyplot as plt\n", | |
"import os\n", | |
"import numpy as np\n", | |
"import pandas as pd\n", | |
"\n", | |
"%matplotlib inline " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"training_set = load_files('training')\n", | |
"count_vect = CountVectorizer(token_pattern=r\"\\b[a-zA-Z]\\w+\\b\")\n", | |
"tfidf_transformer = TfidfTransformer()\n", | |
"X_train_counts = count_vect.fit_transform(training_set.data)\n", | |
"X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"testing_set = load_files('testing')\n", | |
"X_test_counts = count_vect.transform(testing_set.data)\n", | |
"X_test_tfidf = tfidf_transformer.transform(X_test_counts)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"X_train = X_train_tfidf\n", | |
"y_train = np.array([training_set.target_names[target] for target in training_set.target])\n", | |
"\n", | |
"permutation = range(X_train.shape[0])\n", | |
"np.random.seed(17)\n", | |
"np.random.shuffle(permutation)\n", | |
"X_train = X_train[permutation]\n", | |
"y_train = y_train[permutation]\n", | |
"\n", | |
"X_test = X_test_tfidf\n", | |
"y_test = np.array([testing_set.target_names[target] for target in testing_set.target])\n", | |
"\n", | |
"permutation = range(X_test.shape[0])\n", | |
"np.random.shuffle(permutation)\n", | |
"X_test = X_test[permutation]\n", | |
"y_test = y_test[permutation]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"class SimilarityModel:\n", | |
" def __init__(self, X_train, y_train, X_test, y_test):\n", | |
" self.y_train = y_train\n", | |
" self.y_test = y_test\n", | |
" self.similarity_matrix = pd.DataFrame(cosine_similarity(X_train, X_test))\n", | |
" self.bugs_train = set(y_train)\n", | |
" \n", | |
" def predict(self, df=1, ignore_threshold = 0.9):\n", | |
" for i in self.similarity_matrix:\n", | |
" column = self.similarity_matrix[i]\n", | |
" max_similarity_idx = column.idxmax()\n", | |
" max_similarity = column[max_similarity_idx]\n", | |
"\n", | |
" if max_similarity < ignore_threshold:\n", | |
" yield None # No relevant Bugs found\n", | |
" continue\n", | |
" \n", | |
" top_idx = np.argpartition(column, len(column) - df)[-df:] \n", | |
" yield set(self.y_train[top_idx.values])\n", | |
" \n", | |
" def score(self, predictions):\n", | |
" correct = 0.\n", | |
" for truth, prediction in zip(self.y_test, predictions): \n", | |
" if prediction is None:\n", | |
" if truth not in self.bugs_train:\n", | |
" correct += 1 \n", | |
" elif truth in prediction:\n", | |
" correct += 1\n", | |
" \n", | |
" return correct/len(self.y_test)\n", | |
" \n", | |
" \n", | |
"def cross_validate(X, y):\n", | |
" X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.9) \n", | |
" model = SimilarityModel(X_train, y_train, X_test, y_test)\n", | |
"\n", | |
" results = []\n", | |
" for df in [1, 3, 5, 10, 50, 25, 100]:\n", | |
" for ignore in [0.6, 0.7, 0.8, 0.9, 0.95]:\n", | |
" predictions = list(model.predict(df=df, ignore_threshold=ignore)) \n", | |
" results.append([df, ignore, model.score(predictions)])\n", | |
" \n", | |
" results = pd.DataFrame(results, columns=[\"df\", \"ignore\", \"score\"])\n", | |
" return results.reset_index()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [], | |
"source": [ | |
"validation = cross_validate(X_train, y_train)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\nq6ioYPHixWzbtq2vL6WF/tjeIiIiIiIiPSkWRx3zUO3qli8iIiIiIiKS4hTci4iIiIiIiKQ4dcuX\nbqP2FhERERER6Rx1yxcRERERERERQMG9iIiIiIiISMpTcC8iIiIiIiKS4hTci4iIiIiIiKQ4Bfci\nIiIiIiIiKU7BvYiIiIiIiEiKU3DfBzIzMxk6dChDhw7F6XQyePDg+LYnnniiW891/fXXM2bMGIYO\nHcqECRO48847u7V+ERERERER6Xua576PjR8/nvLyck477bQeqf+f//wno0ePZsiQIXz66aecfvrp\n/PznP+fcc8/t9nOlQnuLiIiIiIgkE81z309Ya1sExPX19fzwhz8kPz+fsWPHcuONNxIOhwGoqKjg\ni1/8IrfddhsjR45kwoQJPPnkk23W/6UvfYkhQ4YAEIlEcDgcfPjhhz13QyIiIiIiItLrFNwnodLS\nUrZu3UplZSWbN29m48aNrF69Ol6+fft2QqEQ1dXVrF27lquuuoodO3a0Wd+KFSvIyMhg3LhxWGu5\n7LLLeuM2REREREREpJcM6G75Zvkx93wAwN7a9TYsKiqivLyc008/Pb5t9OjRPP7445x66qkAPPvs\nsyxbtox3332XiooKLr74Yvbv34/H4wFg5syZnHLKKSxZsqTdc7355pv84Q9/4MYbbyQ9Pb3L19wW\ndcsXERERERHpnO7qlu/qjotJVccSlPckv9/P2LFj4+uFhYXs2rUrvp6TkxMP7BvLq6qqOqx3ypQp\nPPfcc6xcuZKf/vSn3XvRIiIiIiIi0mfULT8Jeb3eJt3sd+zYQUFBQXy9pqaGQCAQX9+5cyf5+flH\nVXcoFOLjjz/uvosVERERERGRPqfgPgkVFxezfPly9u7dy+7du1m1ahVz586NlwcCAVauXEkwGOTl\nl19mw4YNXHrppS3qCQQCPPjggxw4cABrLa+99hplZWWceeaZvXk7IiIiIiIi0sMGdLf8ZGBMy1cr\nVqxYwdKlS5k4cSJOp5PZs2dzww03xMuLiopwuVzk5eWRlZXFww8/zLhx41qt/9e//jU33ngjwWCQ\ngoICli1bxoIFC3rqdkRERERERKQPDOgB9VJRRUUFixcvZtu2bX19KS30x/YWERERERHpSRpQT/q1\n7du389e//hWn09nix+FwHNW2Y93X4XC02rNCREREREQk2Si4l6S0a9cunn/+ecLhcJOfSCTSYltb\n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\nAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x1062ee8d0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.figure(figsize=(17, 10))\n", | |
"for df, data in validation.groupby(\"df\"):\n", | |
" plt.plot(data[\"ignore\"], data[\"score\"], label=\"Top {}\".format(df))\n", | |
" plt.xlabel(\"ignore threshold\")\n", | |
" plt.ylabel(\"score\")\n", | |
" plt.title(\"Model accuracy\")\n", | |
" plt.legend(loc=\"best\")" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": { | |
"collapsed": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"The final score on the test data is 0.91\n" | |
] | |
} | |
], | |
"source": [ | |
"model = SimilarityModel(X_train, y_train, X_test, y_test)\n", | |
"predictions = list(model.predict(df=3, ignore_threshold=0.8))\n", | |
"score = model.score(predictions)\n", | |
"print \"The final score on the test data is {:.2f}\".format(score)" | |
] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 2", | |
"language": "python", | |
"name": "python2" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 2 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython2", | |
"version": "2.7.12" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 0 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment