{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# CS579: Lecture 15 \n", "\n", "**Regularization and feature selection**\n", "\n", "*[Dr. Aron Culotta](http://cs.iit.edu/~culotta)* \n", "*[Illinois Institute of Technology](http://iit.edu)*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Recall Error function for logistic regression.\n", "\n", "Given labeled dataset $D=\\{(x_1, y_1), \\ldots (x_n, y_n)\\}$\n", "\n", "$$\n", "E(D, \\theta) = - \\prod_{i \\in D} p(y_i|x_i)\n", "$$\n", "\n", "$$\n", "p(y_i|x_i) = \\frac{1}{1 + e^{-y_i x_i \\cdot \\theta}}\n", "$$" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import math" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.8" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.array([1,0,0,1]) # feature vector\n", "theta = np.array([.9, -.9, .1, -.1]) # model coefficients\n", "x.dot(theta)\n", "# E.g., \n", "# feature 0 (.9) is strongly predictive of y=1\n", "# feature 1 (-.9) is strongly predictive of y=-1\n", "# feature 2 (.1) is weakly predictive of y=1\n", "# feature 3 (-.1) is weakly predictive of y=-1\n", "# dot product: (1 * .9) - (1*.1)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "for x= [1 0 0 1]\n", "p(y=1|x)=0.69\n", "p(y=-1|x)=0.31\n" ] } ], "source": [ "def logistic(x, theta, y):\n", " \"\"\"logistic function :=\n", " probability of class y for feature vector x\n", " \"\"\"\n", " return 1 / (1 + math.exp(-y * x.dot(theta)))\n", "\n", "print('for x=', x)\n", "print('p(y=1|x)=%.3g' % logistic(x, theta, 1))\n", "print('p(y=-1|x)=%.3g' % logistic(x, theta, -1))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "for x= [1 0 1 0]\n", "p(y=1|x)=0.731\n", "p(y=-1|x)=0.269\n" ] } ], "source": [ "x = np.array([1, 0, 1, 0])\n", "print('for x=', x)\n", "print('p(y=1|x)=%.3g' % logistic(x, theta, 1.))\n", "print('p(y=-1|x)=%.3g' % logistic(x, theta, -1.))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "for x= [0 1 1 0]\n", "p(y=1|x)=0.31\n", "p(y=-1|x)=0.69\n" ] } ], "source": [ "x = np.array([0, 1, 1, 0])\n", "print('for x=', x)\n", "print('p(y=1|x)=%.3g' % logistic(x, theta, 1.))\n", "print('p(y=-1|x)=%.3g' % logistic(x, theta, -1.))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "for x= [1 0 0 0]\n", "p(y=1|x)=0.711\n" ] } ], "source": [ "# A way to interpret coefficient theta_j: \n", "# probability of positive class is 1 / (1 + e^-theta_j)\n", "x = np.array([1, 0, 0, 0])\n", "print('for x=', x)\n", "print('p(y=1|x)=%.3g' % logistic(x, theta, 1.))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.7109495026250039" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1/ (1 + math.exp(-.9))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def error(X, y, theta):\n", " \"\"\"\n", " negative product of probabilities of\n", " correct labels for each instance in X.\n", " \"\"\"\n", " error = 1\n", " for xi, yi in zip(X, y):\n", " prob = logistic(xi, theta, yi)\n", " print('probability of %d for %s=%.3f' % \n", " (yi, str(xi), prob))\n", " error *= prob\n", " return -error" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "X = np.array([\n", " [1, 0, 0, 0],\n", " [1, 0, 1, 0],\n", " [0, 1, 0, 0],\n", " [0, 1, 0, 1],\n", "])\n", "\n", "y = np.array([\n", " 1,\n", " 1,\n", " -1,\n", " -1\n", " ])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "error for coefficients theta= [ 0.9 -0.9 0.1 -0.1]\n", "probability of 1 for [1 0 0 0]=0.711\n", "probability of 1 for [1 0 1 0]=0.731\n", "probability of -1 for [0 1 0 0]=0.711\n", "probability of -1 for [0 1 0 1]=0.731\n" ] }, { "data": { "text/plain": [ "-0.2701356268331891" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print('error for coefficients theta=', theta)\n", "error(X, y, theta)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "probability of 1 for [1 0 0 0]=1.000\n", "probability of 1 for [1 0 1 0]=1.000\n", "probability of -1 for [0 1 0 0]=1.000\n", "probability of -1 for [0 1 0 1]=1.000\n" ] }, { "data": { "text/plain": [ "-0.9999092022016287" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make theta even better:\n", "theta = np.array([10, -10, 10, -10])\n", "error(X, y, theta)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "probability of 1 for [1 0 0 0]=0.000\n", "probability of 1 for [1 0 1 0]=0.000\n", "probability of -1 for [0 1 0 0]=0.000\n", "probability of -1 for [0 1 0 1]=0.000\n" ] }, { "data": { "text/plain": [ "-8.755715690797854e-27" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make theta much, much worse:\n", "theta = np.array([-10, 10, -10, 10])\n", "error(X, y, theta)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "probability of 1 for [1 0 0 0]=1.000\n", "probability of 1 for [1 0 1 0]=1.000\n", "probability of -1 for [0 1 0 0]=1.000\n", "probability of -1 for [0 1 0 1]=1.000\n" ] }, { "data": { "text/plain": [ "-1.0" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Make theta even better:\n", "theta = np.array([100, -100, 100, -100])\n", "error(X, y, theta)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What is range of error values?\n", "\n", "<br><br><br><br><br><br>\n", "error $ \\in \\{-1, 0\\} $" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Which is best?\n", "```python\n", "theta = np.array([-10, 10, -10, 10]) # error=0\n", "theta = np.array([100, -100, 100, -100]) # error=-1.0\n", "theta = np.array([10, -10, 10, -10]) # error=-0.999\n", "```\n", "\n", "<br><br><br>\n", "\n", "Is the second really better than the first?\n", "\n", "<br><br><br><br>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Regularization\n", "\n", "Controls how many parameters the model has, or how large each parameter can get.\n", "\n", "E.g. L2 Regularization for logistic regression:\n", "\n", "$$\n", "E(D, \\theta) = - \\prod_{i \\in D} p(y_i|x_i) + \\frac{1}{C}||\\vec{\\theta}||^2_2\n", "$$\n", "\n", "$$\n", " = - \\prod_{i \\in D} p(y_i|x_i) + \\frac{1}{C}\\sum_k \\theta_k^2\n", "$$\n", "\n", "As $C \\rightarrow 0$, the classifier prefers smaller and smaller coefficients.\n", "\n", "This is the $C$ parameter of the `LogisticRegression` class in sklearn.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below, we will investigate the effect of regularization using the IMDB sentiment classification data." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "from collections import Counter\n", "import glob\n", "import hashlib\n", "import io\n", "import math\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import os\n", "import re\n", "from sklearn.model_selection import KFold\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import accuracy_score\n", "import tarfile\n", "import urllib.request\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "def get_data():\n", " \"\"\" Download and unzip data.\"\"\"\n", " urllib.request.urlretrieve('https://www.dropbox.com/s/8oehplrobcgi9cq/imdb.tgz?dl=1', 'imdb.tgz')\n", " tar = tarfile.open(\"imdb.tgz\")\n", " tar.extractall()\n", " tar.close()\n", " \n", "get_data()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "subdirectories are:['test', 'train']\n" ] } ], "source": [ "# Here is the path to the data directory.\n", "path = 'data'\n", "print('subdirectories are:' + str(os.listdir(path)))" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "def get_files(path):\n", " \"\"\" Return a list of file names in this directory that end in .txt \n", " The list should be sorted alphabetically by file name.\n", " Params:\n", " path....a directory containing .txt review files.\n", " Returns:\n", " a list of .txt file names, sorted alphabetically.\n", " \"\"\"\n", " return sorted([f for f in glob.glob(path + os.sep + '*.txt')])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "found 200 positive and 200 negative training files\n", "first positive file: data/train/pos/10057_9.txt\n", "first negative file: data/train/neg/10108_1.txt\n" ] } ], "source": [ "pos_train_files = get_files(path + os.sep + 'train' + os.sep + 'pos')\n", "neg_train_files = get_files(path + os.sep + 'train' + os.sep + 'neg')\n", "all_train_files = pos_train_files + neg_train_files\n", "\n", "print('found %d positive and %d negative training files' %\n", " (len(pos_train_files), len(neg_train_files)))\n", "print('first positive file: %s' % pos_train_files[0])\n", "print('first negative file: %s' % neg_train_files[0])" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "first 3 and last 3 labels are: [1 1 1 0 0 0]\n" ] } ], "source": [ "def get_true_labels(file_names):\n", " \"\"\"Return a *numpy array* of ints for the true sentiment labels of each file.\n", " 1 means positive, 0 means negative. Use the name of the file to determine\n", " the true label.\n", " Params:\n", " file_names....a list of .txt file paths, e.g., data/train/pos/10057_9.txt\n", " Returns:\n", " a numpy array of 1 or 0 values corresponding to each element\n", " of file_names, where 1 indicates a positive review, and 0\n", " indicates a negative review.\n", " \"\"\"\n", " return np.array([1 if 'pos' in f else 0 for f in file_names])\n", "\n", "labels = get_true_labels(all_train_files)\n", "print('first 3 and last 3 labels are: %s' % str(labels[[1,2,3,-3,-2,-1]]))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"This is a great film!! The first time I saw it I thought it was absorbing from start to finish and I still do now. I may not have seen the play, but even if I had it wouldn't stop me thinking that the film is just as good.\"" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Here's what a positive review looks like.\n", "def file2string(filename):\n", " return io.open(filename, encoding='utf8').readlines()[0]\n", " \n", "file2string(pos_train_files[10])" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['hi',\n", " 'how',\n", " 's',\n", " 'it',\n", " 'going',\n", " 'an_underscore',\n", " 'is',\n", " 'not',\n", " 'really',\n", " 'punctuation']" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def tokenize(text):\n", " \"\"\"Given a string, return a list of tokens such that: (1) all\n", " tokens are lowercase, (2) all punctuation is removed. Note that\n", " underscore (_) is not considered punctuation.\n", " Params:\n", " text....a string\n", " Returns:\n", " a list of tokens\n", " \"\"\"\n", " return re.findall('\\w+', text.lower())\n", "\n", "tokenize(\"Hi! How's it going??? an_underscore is not *really* punctuation.\")" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "matrix represents 400 documents with 10708 features\n", "first doc has terms:\n", "[128, 170, 202, 253, 260, 312, 355, 439, 504, 514, 560, 673, 683, 702, 750, 860, 869, 961, 985, 1013, 1222, 1254, 1312, 1341, 1403, 1444, 1451, 1469, 1504, 1657, 1664, 1742, 2467, 2539, 2998, 3111, 3208, 3231, 3358, 3370, 3517, 3636, 3708, 3718, 3761, 3812, 3928, 4017, 4061, 4063, 4089, 4141, 4207, 4209, 4224, 4312, 4369, 4387, 4415, 4438, 4475, 4513, 4527, 4634, 4693, 4760, 4801, 5065, 5077, 5228, 5279, 5292, 5294, 5317, 5365, 5423, 5614, 5615, 5651, 5698, 5766, 5893, 5937, 5953, 6121, 6248, 6263, 6299, 6428, 6444, 6583, 6624, 6680, 6700, 6864, 6946, 7098, 7629, 8053, 8248, 8336, 8341, 8474, 8767, 8988, 9204, 9411, 9435, 9439, 9504, 9507, 9522, 9549, 9557, 9633, 9683, 9689, 9834, 9854, 9856, 10045, 10335, 10351, 10429, 10439, 10444, 10446, 10517]\n" ] } ], "source": [ "def do_vectorize(filenames, tokenizer_fn=tokenize, min_df=1,\n", " max_df=1., binary=True, ngram_range=(1,1)):\n", " \"\"\"\n", " Convert a list of filenames into a sparse csr_matrix, where\n", " each row is a file and each column represents a unique word.\n", " Use sklearn's CountVectorizer: http://goo.gl/eJ2PJ5\n", " Params:\n", " filenames.......list of review file names\n", " tokenizer_fn....the function used to tokenize each document\n", " min_df..........remove terms from the vocabulary that don't appear\n", " in at least this many documents\n", " max_df..........remove terms from the vocabulary that appear in more\n", " than this fraction of documents\n", " binary..........If true, each documents is represented by a binary\n", " vector, where 1 means a term occurs at least once in \n", " the document. If false, the term frequency is used instead.\n", " ngram_range.....A tuple (n,m) means to use phrases of length n to m inclusive.\n", " E.g., (1,2) means consider unigrams and bigrams.\n", " Return:\n", " A tuple (X, vec), where X is the csr_matrix of feature vectors,\n", " and vec is the CountVectorizer object.\n", " \"\"\"\n", " vec = CountVectorizer(input='filename', tokenizer=tokenizer_fn,\n", " binary=binary, min_df=min_df, max_df=max_df,\n", " ngram_range=ngram_range)\n", " X = vec.fit_transform(filenames)\n", " return (X, vec)\n", " \n", "matrix, vec = do_vectorize(all_train_files)\n", "print ('matrix represents %d documents with %d features' % (matrix.shape[0], matrix.shape[1]))\n", "print('first doc has terms:\\n%s' % (str(sorted(matrix[0].nonzero()[1]))))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "first shuffled document data/train/neg/971_3.txt has label 0 and terms: [8, 101, 170, 195, 266, 278, 289, 355, 439, 464, 504, 514, 702, 750, 762, 765, 834, 913, 961, 962, 990, 997, 1013, 1068, 1103, 1248, 1254, 1403, 1445, 1883, 2048, 2107, 2280, 2399, 2508, 2742, 2920, 2937, 3008, 3029, 3047, 3124, 3153, 3154, 3314, 3363, 3377, 3397, 3535, 3596, 3619, 3625, 3653, 3684, 3718, 3921, 4029, 4035, 4089, 4094, 4155, 4387, 4475, 4527, 4599, 4611, 4614, 4630, 4693, 4732, 4744, 4801, 5065, 5077, 5083, 5217, 5481, 5569, 5614, 5617, 5793, 5953, 5992, 6115, 6116, 6206, 6293, 6299, 6446, 6460, 6583, 6624, 6626, 6663, 6700, 6765, 6854, 7475, 7615, 7618, 7620, 7625, 7908, 7912, 8104, 8187, 8206, 8258, 8474, 8698, 8699, 8767, 8794, 8800, 8909, 9068, 9099, 9347, 9499, 9504, 9507, 9532, 9541, 9549, 9557, 9571, 9572, 9613, 9633, 9796, 9856, 9977, 10045, 10158, 10162, 10222, 10225, 10339, 10346, 10351, 10362, 10444, 10455, 10483, 10517, 10561, 10567, 10580, 10657]\n" ] } ], "source": [ "\"\"\"\n", "Shuffle order of documents (since all positive documents\n", "come before all negatives).\n", "\"\"\"\n", "import random\n", "\n", "def shuffle(X, y, filenames):\n", " random.seed(42)\n", " indices = sorted(range(X.shape[0]), key=lambda x: random.random())\n", " return X[indices], y[indices], np.array(filenames)[indices]\n", "\n", "X, y, filenames = shuffle(matrix, labels, all_train_files)\n", "\n", "print('first shuffled document %s has label %d and terms: %s' % \n", " (filenames[0], y[0], sorted(X[0].nonzero()[1])))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# Creates a LogsticRegression object.\n", "def get_clf(c=1, penalty='l2'):\n", " return LogisticRegression(random_state=42, C=c, penalty=penalty, solver='liblinear')" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "fold 0 accuracy=0.825\n", "fold 1 accuracy=0.8\n", "fold 2 accuracy=0.7125\n", "fold 3 accuracy=0.7375\n", "fold 4 accuracy=0.6875\n", "test accuracy=0.7525 (0.02) train accuracy=1.0000 (0.00)\n" ] } ], "source": [ "def do_cross_validation(X, y, n_folds=5, c=1, penalty='l2', verbose=False):\n", " \"\"\"\n", " Perform n-fold cross validation, calling get_clf() to train n\n", " different classifiers. Use sklearn's KFold class: http://goo.gl/wmyFhi\n", " Be sure not to shuffle the data, otherwise your output will differ.\n", " Params:\n", " X.........a csr_matrix of feature vectors\n", " y.........the true labels of each document\n", " n_folds...the number of folds of cross-validation to do\n", " verbose...If true, report the testing accuracy for each fold.\n", " Return:\n", " the average testing accuracy across all folds.\n", " \"\"\"\n", " cv = KFold(n_splits=n_folds, shuffle=False)\n", " accuracies = []\n", " train_accuracies = []\n", " for foldi, (train, test) in enumerate(cv.split(X)):\n", " clf = get_clf(c=c, penalty=penalty)\n", " clf.fit(X[train], y[train])\n", " train_accuracies.append(accuracy_score(clf.predict(X[train]), y[train]))\n", " pred = clf.predict(X[test])\n", " acc = accuracy_score(pred, y[test])\n", " accuracies.append(acc)\n", " if verbose:\n", " print('fold %d accuracy=%.4g' % (foldi, acc))\n", " return (np.mean(accuracies),\n", " np.std(accuracies) / math.sqrt(n_folds),\n", " np.mean(train_accuracies),\n", " np.std(train_accuracies) / math.sqrt(n_folds))\n", " \n", "def print_results(results):\n", " print('test accuracy=%.4f (%.2f) train accuracy=%.4f (%.2f)' % \n", " results)\n", "\n", "results = do_cross_validation(X, y, verbose=True)\n", "print_results(results) " ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "def do_expt(filenames, y, tokenizer_fn=tokenize,\n", " min_df=1, max_df=1., binary=True,\n", " ngram_range=(1,1), n_folds=5, c=1, penalty='l2'):\n", " \"\"\"\n", " Run one experiment, which consists of vectorizing each file,\n", " performing cross-validation, and returning the average accuracy.\n", " You should call do_vectorize and do_cross_validation here.\n", " Params:\n", " filenames.......list of review file names\n", " y...............the true sentiment labels for each file\n", " tokenizer_fn....the function used to tokenize each document\n", " min_df..........remove terms from the vocabulary that don't appear\n", " in at least this many documents\n", " max_df..........remove terms from the vocabulary that appear in more\n", " than this fraction of documents\n", " binary..........If true, each documents is represented by a binary\n", " vector, where 1 means a term occurs at least once in \n", " the document. If false, the term frequency is used instead.\n", " ngram_range.....A tuple (n,m) means to use phrases of length n to m inclusive.\n", " E.g., (1,2) means consider unigrams and bigrams.\n", " n_folds.........The number of cross-validation folds to use.\n", " Returns:\n", " the average cross validation testing accuracy.\n", " \"\"\"\n", " X, vec = do_vectorize(filenames, tokenizer_fn=tokenizer_fn,\n", " binary=binary, min_df=min_df,\n", " max_df=max_df, ngram_range=ngram_range)\n", " return do_cross_validation(X, y, verbose=False, n_folds=n_folds, c=c, penalty=penalty)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "accuracy using default settings:\n", "test accuracy=0.7525 (0.02) train accuracy=1.0000 (0.00)\n" ] } ], "source": [ "print('accuracy using default settings:')\n", "print_results(do_expt(filenames, y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Compare accuracy of various settings\n", "\n", "Next, we'll try out a few different settings to see how they affect cross-validation accuracy." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "([0.71,\n", " 0.7275,\n", " 0.7449999999999999,\n", " 0.7525000000000001,\n", " 0.7550000000000001,\n", " 0.7550000000000001,\n", " 0.7449999999999999,\n", " 0.735],\n", " [0.9425000000000001, 0.9893750000000001, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def compare_c(filenames, y, penalty='l2', cs=[1, 5, 10, 1000, 10000]):\n", " accs = []\n", " train_accs = []\n", " for c in cs:\n", " test_acc, test_sd, train_acc, train_sd = \\\n", " do_expt(filenames, y, c=c, penalty=penalty)\n", " accs.append(test_acc)\n", " train_accs.append(train_acc)\n", " # plot train accuracy\n", " plt.figure()\n", " plt.errorbar(cs, train_accs, fmt='go-', label='train acc', yerr=train_sd)\n", " plt.xlabel('C')\n", " plt.ylabel('train accuracy')\n", " plt.xscale('log')\n", " plt.show()\n", " # plot test accuracy\n", " plt.figure()\n", " plt.errorbar(cs, accs, fmt='bo-', label='test acc', yerr=test_sd)\n", " plt.xlabel('C')\n", " plt.ylabel('test accuracy')\n", " plt.xscale('log')\n", " plt.show()\n", " return accs, train_accs\n", " \n", "cs = [.001, .01, .1, 1, 5, 10, 1000, 10000]\n", "compare_c(filenames, y, cs=cs)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[0.01640794018703204,\n", " 0.1146999934443533,\n", " 0.40789919547410275,\n", " 0.8404559900333362,\n", " 1.1763613493643088,\n", " 1.3264186628108598,\n", " 2.3516251487475905,\n", " 2.7393176574515805]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def compare_c_coef(X, y, cs, penalty='l2'):\n", " max_coef = []\n", " for c in cs:\n", " clf = get_clf(c=c, penalty=penalty)\n", " clf.fit(X, y)\n", " max_coef.append(max(np.abs(clf.coef_[0])))\n", " plt.figure()\n", " plt.plot(cs, max_coef, 'bo-')\n", " plt.xlabel('C')\n", " plt.ylabel('max coef')\n", " plt.xscale('log')\n", " plt.show()\n", " return max_coef\n", " \n", "compare_c_coef(X, y, cs=cs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## L1 Regularization\n", "\n", "Penalize by absolute value of coefficients (rather than square):\n", "\n", "$$\n", "E(D, \\theta) = - \\prod_{i \\in D} p(y_i|x_i) + \\frac{1}{C}\\sum_k |\\theta_k|\n", "$$\n" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "([0.6199999999999999,\n", " 0.68,\n", " 0.6725,\n", " 0.665,\n", " 0.6825,\n", " 0.7375,\n", " 0.7150000000000001,\n", " 0.7050000000000001],\n", " [0.683125, 0.9643750000000001, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "compare_c(filenames, y, penalty='l1', cs=[.1, .5, 1., 10, 1e2, 1e3, 1e4, 1e5])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(400, 10708)" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "[9, 181, 236, 331, 783, 3303, 5876]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def compare_num_feats(X, y, cs=[.1, 1., 10, 1e2, 1e3, 1e4, 1e5]):\n", " nnzs = []\n", " for c in cs:\n", " clf = get_clf(c=c, penalty='l1')\n", " clf.fit(X, y)\n", " nnz = len(np.where(clf.coef_[0]!=0)[0])\n", " nnzs.append(nnz)\n", " plt.figure()\n", " plt.plot(cs, nnzs, 'bo-')\n", " plt.xlabel('C')\n", " plt.ylabel('# nonzero coefficients')\n", " plt.xscale('log')\n", " plt.show()\n", " return nnzs\n", " \n", "compare_num_feats(X, y)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Top Coefficients\n", "Positive Terms:\n", "great (0.207901)\n", "best (0.207508)\n", "will (0.112245)\n", "film (0.0667848)\n", "worth (0.0246236)\n", "well (0.00193315)\n", "fantastic (0)\n", "farce (0)\n", "far (0)\n", "fanzine (0)\n", "\n", "NegativeTerms:\n", "worst (-0.726754)\n", "bad (-0.313761)\n", "nothing (-0.299507)\n", "policeman (0)\n", "point (0)\n", "pointed (0)\n", "pointless (0)\n", "points (0)\n", "poise (0)\n", "poison (0)\n" ] } ], "source": [ "# What features are selected?\n", "def print_top_terms(model, vec, n=10):\n", " terms = np.array(vec.get_feature_names())\n", " print('\\nTop Coefficients')\n", " coef = model.coef_[0]\n", " srted = np.argsort(coef)\n", " topi = srted[::-1][:n]\n", " boti = srted[:n]\n", " print('Positive Terms:\\n' + '\\n'.join('%s (%g)' % (n, c) for n, c in zip(terms[topi], coef[topi])))\n", " print('\\nNegativeTerms:\\n' + '\\n'.join('%s (%g)' % (n, c) for n, c in zip(terms[boti], coef[boti])))\n", "\n", "clf = get_clf(c=.1, penalty='l1')\n", "clf.fit(X, y)\n", "print_top_terms(clf, vec)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.])" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf.intercept_" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.47502081 0.52497919]]\n", "intercept=0.1\n", "[1]\n" ] } ], "source": [ "# How to predict when no features?\n", "clf.intercept_=.1\n", "print(clf.predict_proba([[0] * len(vec.vocabulary_)]))\n", "print('intercept=%g' % clf.intercept_)\n", "print(clf.predict([[0] * len(vec.vocabulary_)]))" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.50358714 0.49641286]]\n", "intercept=-0.0143488\n", "Counter({0: 200, 1: 200})\n" ] } ], "source": [ "clf = get_clf(c=1000, penalty='l1')\n", "clf.fit(X, y)\n", "print(clf.predict_proba([[0] * len(vec.vocabulary_)]))\n", "print('intercept=%g' % clf.intercept_)\n", "print(Counter(y))" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.05059168])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clf = get_clf(c=1, penalty='l2')\n", "clf.fit(X, y)\n", "clf.intercept_" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Feature Selection\n", "\n", "Rather than using L1 regularization, we can explicitly look for terms that are highly correlated with the class label.\n", "\n", "Intuitively, we want terms that are very probable in one class, but not the other." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "One way to compute this is the chi-squared statistic: $\\chi^2$\n", "\n", "The chi-squared statistic is used in hypothesis testing to determine whether two variables are independent.\n", "\n", "$$A \\perp B \\iff P(A,B) \\equiv P(A)P(B)$$\n", "\n", "To apply this to feature selection, we wish to know whether the occurrence of a term is independent of the class label. \n", "- If they are independent, then it is not a useful feature. \n", "- If they are highly dependent, then it is a useful feature." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To compute the chi-squared statistic for term $t$ and class label $y$:\n", "\n", "- Let $N^t_{i,j}$ indicate the number of documents that contain/don't contain term $t$ and have class label $y$.\n", " - E.g., $N^t_{0,0}=10$ means that 10 document have class label $0$ and do **not** have term $t$.\n", " - E.g., $N^t_{1,1}=10$ means that 10 documents have class label $1$ and do have term $t$.\n", " \n", "So, for each term we have a table like this:\n", "\n", "| | y=1 | y=0 |\n", "|---------|---------------|--------------|\n", "| **t=1** | $N^t_{11}$ | $N^t_{10}$ |\n", "| **t=0** | $N^t_{01}$ | $N^t_{00}$ |\n", "\n", "The chi-squared statistic measures how much these values deviate from what would be expected if $t$ and $y$ were independent.\n", "\n", "If we assume independence between $t$ and $y$, then the probability of $t$ appearing in a document with class $y=1$ is just $p(t=1) * p(y=1)$.\n", "\n", "If $N$ is the total number of documents, then the expected value $E_{11}$ (for $t=1$, $y=1$) is:\n", "\n", "$$\n", "p(t=1) = \\frac{N^t_{11} + N^t_{10}}{N}\n", "$$\n", "\n", "$$\n", "p(y=1) = \\frac{N^t_{11} + N^t_{01}}{N}\n", "$$\n", "\n", "$$\n", "E_{11} = N * p(t=1) * p(y=1)\n", "$$\n", "Then, the chi-squared statistic is as follows:\n", "$$\n", "\\chi^2 = \\sum_{ij} \\frac{(N^t_{ij} - E^t_{ij})^2}{E^t_{ij}}\n", "$$\n", "\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "from sklearn.feature_selection import chi2\n", "\n", "chi, pvals = chi2(X,y)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.hist(pvals, bins=20)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.hist(chi, bins=20)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "index=10575 chisq=29.88 worst\n", "index=10342 chisq=20.00 waste\n", "index=9471 chisq=16.13 terrible\n", "index=6501 chisq=16.07 nothing\n", "index=10576 chisq=15.21 worth\n", "index=1216 chisq=14.44 boring\n", "index=869 chisq=13.79 bad\n", "index=9244 chisq=13.00 superb\n", "index=7161 chisq=12.57 poor\n", "index=837 chisq=12.57 awful\n" ] } ], "source": [ "feats = vec.get_feature_names()\n", "# Top chi-sq terms:\n", "for i in np.argsort(chi)[::-1][:10]:\n", " print('index=%d chisq=%.2f %s' % (i, chi[i], feats[i]))" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "index=4601 chisq=0.00 hopeless\n", "index=927 chisq=0.00 barry\n", "index=2809 chisq=0.00 distinct\n", "index=10222 chisq=0.00 visit\n", "index=2818 chisq=0.00 distraught\n", "index=8498 chisq=0.00 shifty\n", "index=2830 chisq=0.00 division\n", "index=2833 chisq=0.00 diy\n", "index=10217 chisq=0.00 virtually\n", "index=8503 chisq=0.00 shining\n" ] } ], "source": [ "# Bottom chi-sq terms:\n", "for i in np.argsort(chi)[:10]:\n", " print('index=%d chisq=%.2f %s' % (i, chi[i], feats[i]))" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "41" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# How many times does \"worst\" appear?\n", "X.sum(axis=0).A1[10575]" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({0: 38, 1: 3})" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# What labels do the documents containing \"worst\" have?\n", "Counter(y[np.where(X[:, 10575].T.toarray()[0]==1)])\n", "# Clearly skewed toward negative class, so high chisq value." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "13" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# How many times does \"superb\" appear?\n", "X.sum(axis=0).A1[9244]" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({1: 13})" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# What labels do the documents containing \"superb\" have?\n", "Counter(y[np.where(X[:, 9244].T.toarray()[0]==1)])\n", "# all positive" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "94" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# How about \"bad\"\n", "X.sum(axis=0).A1[869]" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({0: 65, 1: 29})" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter(y[np.where(X[:, 869].T.toarray()[0]==1)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So, 29 positive movies have the term \"bad\"." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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MHJkwTvAUUcdxaBBg8jJySE7O5uHH36YmjVrsnbtWlatWpX43r/+9a8fHSs/P59Zs2Yltj/99FM+//zzxHSYY445hkWLFnHYYYf96FWu3E8/+2vGjBmJzzFGZs2atUtTbSRJUmrxyZ/SZrm50KULbNgA5cotoXv3cVx++enUrVuXjz/+mPnz53P55ZfTvn17qlSpwvXXX0///v155513uOeee350vHLlytGvXz/Gjh1LpUqV6N+/P0ceeSQnnHACAH/4wx847bTTaNCgAWeffTblypVjwYIFzJo1i9tuu+0n67333ntp0qQJLVu25J577uGTTz7h8ssvL/LfRZIk7R2OmEub5eQUhPJNm2Djxsq8/fYHdO/enSZNmnD++efTs2dPBg0aRI0aNZg8eTIvv/wyLVu25P7772f48OE/Ol5aWhqDBw/mvPPOo3379uTn5/P0008npreceOKJPP/887z66qu0a9eOdu3aceutt3LIIYckVe+tt97KmDFjOOqoo5g6dSrPPPMM9erVK8qfRJIk7UVh27my+6O2bdtGH1+un7L1iHmFCjBtGmx1f+UumTBhAn369GH16tVFW6QkSUppIYS5Mcbtr9zwE5zKIm2WlVUQxnNyIDt790O5JEnS7jCYS1vJyjKQS5KkkuEc8/3Upk2buOmmm2jUqFHice833ngjeXl5JV1aqdCrVy+nsUiSpF3iiPl+atSoUdx99908/PDDtGzZkvnz53P++eeTlpbGTTfdVNLlSZIkaRsG8/3UW2+9RdeuXenatSsADRs25PTTT2fmzJklXJkkSZK2x6ks+6mOHTvy6quvsmjRIgDee+89/vnPf3LKKaeUcGWSJEnaHkfM91ODBg3i+++/p3nz5pQtW5a8vDwGDx7MFVdcUdKlSZIkaTscMd9PPfHEE0ycOJFHH32Ut99+m4kTJ3LPPffw4IMPlnRpRW7ChAmkp6eXdBmSJEl7xAcM7afq16/PgAED6Nu3b2LfzTffzIQJE/joo49KsLKi98MPP/D9999z0EEHlXQpkiSplPMBQ0rIzS14QM6qVWspW7ZsobayZcuSn59fMoUVo0qVKlGpUqWSLkOSJGmPOJVlP7LlkfI33QRr1nRl2LBbef7551m6dCnPPPMMY8aM4de//vUenWPq1Kkcd9xxZGZmUqNGDU488UQWLlwIwNKlSwkh8Pjj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OKhoy5IkSZJKl2SD+YfAqZs/nwO8tflJoAB1gK+LujBJkiSpNEl2KstoYFII4XwgE+i+VVtnYH5RFyZJkiSVJkmNmMcYH6VgXvlIoHOM8emtmr8E/lQMtakEDB06lBYtWpR0GZIkSaWODxhSIatXr2b9+vUccIBL1EuSJO2qYn/AUAjh2BDCaVttHxBCeCyE8O8QwugQQtndOblST3p6uqFckiSpBCR78+etQJuttm8HTgE+AC4HbijiuvY7U6dO5bjjjiMzM5MaNWpw4oknsnDhQgCWLl1KCIGnnnqKX/7yl1SuXJnmzZvz8ssvJ76fk5NDCIFp06bRvn17KleuTNu2bXn77bcLnefpp5+mZcuWpKWlUb9+fUaMGMGWfxUZNmzYdqep/PznP+fqq68GfjyVpVevXpx22mmMHTuWunXrkpmZyQUXXMDatWsTfdasWcN5551Heno6tWrVYuTIkZx22mn06tWryH4/SZKk/V2ywbwZMAcghFAe+B+gf4zxLGAw0KN4ytt/rFmzhn79+jFr1ixycnLIyMiga9eubNiwIdFn8ODBXH311bzzzjv87Gc/45xzzmH16tWFjnP99ddz66238vbbb3PAAQfQs2fPRPCeO3cu3bt358wzz+Tf//43t956KyNHjuTPf/4zAL1792bRokXMmjUrcbz333+ft956iwsvvHCHtb/++ussWLCAV155hSeeeIJnnnmGsWPHJtqvueYaXnvtNQ499FA6d+7MpEmT+Mc//sHjjz/OgAEDyM8vWGnzm2++4fzzzyczM5NKlSpxwgkn8O677yaOM2HCBNLT05k2bRotWrSgSpUqdO7cmSVLlhSqZ8qUKbRp04aKFSvSqFEjBg8eXOh3lCRJ2ifFGH/yRcFTP4/b/PnnwCbgoM3bxwNrkjlOSb3atGkTU83q1atjmTJl4uuvvx6XLFkSgXjfffcl2v/zn/9EIL7++usxxhhfffXVCMSpU6cm+rzxxhsRiJ999lmMMcYePXrEzp07FzrPkCFDYt26dRPbp556arz00ksT29dee23c+vcZMmRIPPLIIxPb559/fqxXr17My8tL7Lvoootily5dYowxfv/997F8+fLxsccei506dYrVqlWLgwYNitWqVYudOnWKZcuWjY8++miMMcbTTz89HnHEEfG1116L8+fPj127do316tWLa9eujTHGOH78+FiuXLnYpUuXOHPmzPjOO+/Eo48+Ov7qV79KnHvq1KmxatWq8aGHHoofffRR/Oc//xmbNGkSr7nmml39n0CSJKnIAXPibmbWZEfMlwFHbf58MrAgxrhi83YmsHa731LC4sWL6dGjB40bN6ZatWrUqlWL/Px8Pv3000SfVq1aJT7XqVMHgBUrVhQ6zs76LFy4kJ///OeF+nfs2JFly5axatUqAC6++GIef/xxfvjhBzZt2sSkSZN2OloO0Lx5c8qW/b/bCOrUqZM45+LFi9m4cSPt2rVL9L311ltp1aoVDRs2pHPnzkybNo0PP/yQZ599lvvvv5/jjz+eli1bMmnSJFatWsXkyZMTx87Ly+Puu++mXbt2tGrVigEDBpCTk5P4V4ERI0YwcOBALrjgAho3bkznzp0ZNWoU9913X6KPJEnSvijZdcwfA24JIWRTMLd8yFZtx1DwACLtxGmnnUa9evUYN24cdevWpVy5cjRv3rzQFIzy5csnPocQABLTQHalz/Zs6XvqqadSuXJlnnrqKTIyMvj222/p0WPnM5G2PueWY+3onFv/4QD/F+IXLlxImTJlyMrKSrRlZGTQsmVL3nvvvcS+tLQ0jjjiiELf37BhA9988w01atRg7ty5zJo1i1GjRiX65Ofn88MPP/DFF19w8MEH/8QvIUmSlJqSDeZDgXVABwpuBL1zq7ajgL8VbVn7l//+978sWrSIe+65h86dOwPw9ttvk5eXV6TnadasGW+++WahfW+88Qb16tWjatWqAJQrV45evXrx0EMPkZGRwZlnnklGRsZun7Nx48aUL1+e2bNnAwUhfu3atSxYsIDGjRvvNMRvseWPhi31ba9tyzHy8/MZMmQI3bt3Z1s1a9bc7euQJEkqaUkF8xjjJmDEDtrOKNKK9iO5uZCTA8cfn8mBBx7IAw88QP369Vm2bBkDBw78UQjdU9dccw0/+9nPGDp0KD169GD27Nnccccd3HLLLYX6XXTRRYwaNYoyZcrw0ksv7dE509PT6d27N4MGDSIjI4Ovv/6aiy66iPz8fEIIieklzZo1Iz8/n9zcXI4//ngAVq1axb///W8uuOCCpM93zDHHsGjRIg477LA9qluSJCnV7FIyDCG0ouBmzwOAcTHGL0IIhwFfxhi/L44C91W5udClC2zYABUqlGHUqCcYN+5qWrRowWGHHcYdd9zBWWedVaTnPOaYY/jb3/7GkCFDuOWWW6hVqxbXXXcdffr0KdTv0EMPpVOnTnzyySdkZ2fv8Xm7dx/NzJlrmD//UT788EP+8Ic/8OWXX1KxYkV++OEHAA4//HC6devGpZdeyv3330/16tUZPHgw1apV+8mpNFv7wx/+wGmnnUaDBg04++yzKVeuHAsWLGDWrFncdttte3wtkiRJJSaZO0SBNAqmq2wC8je/H7O57Wng1t29+3RvvEpiVZZbbomxbNkYoeD9llv2egk71axZs3jzzTfv8XHeeivGSpUKrrFMmU7xrLOujOvWrYu1atWKo0ePjueff3489dRTY4wxfv311/G8886L1atXjxUrVoxdunSJCxYsSBxr/PjxsUqVKoWOv2U1mq+++iqx78UXX4wdO3aMlSpVilWrVo1t2rSJf/rTn/b4WiRJkvYUe7AqS4hJrGQRQhgNXAhcCbwMfAm0jTG+HUK4GLgixti6yP9qKCJt27aNc+bM2avnLDxiDtOmwVb3PZaYr776iieffJJrrrmGTz/9lAMPPHCPjjdyJNx44zzy8xdSpkw7rrjie776ahRTpkzh/fffp169ekVUuSRJUuoLIcyNMbbdne8mO5XlXODGGOOjIYSy27QtARruzsn3Z1lZBWE8Jweys1MjlAMcdNBBHHjggYwbN26PQzkUXFv58rB+/Rjy89/n4YfL0abN0UyfPt1QLkmStAuSDeYHAAt30FaGgqku2kZWVuoE8i2S+ReSXZGVBa++2pqcnDkp9QeIJEnSvibZYL4EyAL+uZ22dsD7RVaR9jmp+AeIJEnSvibZJ39OBK4LIfQEtjxtJoYQOgP9gYeKozhJkiSptEg2mN8GPA9MAr7ZvO8N4BVgaozxT8VQmyRJklRqJBXMY4ybYoznAJ2AO4C/AHcBv4gx9izG+pRCsrOzufzyy7nmmmuoUaMGNWvWZOzYsaxfv54rr7yS6tWrc8ghhzBp0qTEd5YtW8Y555xDZmYmmZmZnHrqqXz44YeJ9s8++4xu3bpRo0YNKleuTNOmTXn88ccT7cOGDaNBgwakpaVRu3ZtzjvvvL16zZIkSXvLT84xDyFUAC4HpsUYXwdeL/aqlLImT57M73//e2bOnMmzzz5Lv379mDp1KieddBJz5szh4Ycf5qKLLuKEE04gIyODzp07c+yxx/Laa69RoUIFRo8ezQknnMDChQupXLkyV1xxBevWrePVV1+lWrVqvP/+/92u8NRTTzF69Ggee+wxWrZsyYoVK5gxY0YJXr0kSVLxSXYd8x+AE2OM04u/pKJXEuuY74+ys7NZv349ubm5QMEKLwcddBBZWVk8++yzAGzcuJEqVarw6KOPsmrVKkaOHMkHH3xACAGATZs2cdBBB3Hvvfdy9tln06pVK8466yyGDBnyo/ONGTOGcePGsWDBAsqXL/+jdkmSpFSzJ+uYJzvHfCFw6O6cQPuXVq1aJT6HEDjooINo2bJlYl/58uXJzMxkxYoVzJ07lyVLllC1alXS09NJT08nIyODb775hsWLFwPQt29fbr75ZrKysrjxxhuZO3du4ljdu3dn3bp1NGrUiAsvvJC//e1vrF+/fu9drCRJ0l6UbDD/A3BTCKHlT/bUfm3bkesQwnb35efnk5+fz9FHH82//vWvQq8PPviASy+9FIALL7yQJUuWcMEFF/DBBx9w7LHHMnToUADq16/P+++/z7hx46hWrRrXXHMNbdq0Yc2aNXvlWiVJkvamZIP5ICAdmBdC+CiE8HoIYfpWr9eKsUaVsNxcGDkSVq3ate8dc8wxfPTRRxx44IEcdthhhV41atRI9KtXrx6XXHIJf/3rXxk2bBj3339/oq1ixYqceuqp3HnnncyePZt3332XN998s6guTZIkKWUk+4ChTcB7xVmIUlNuLnTpAhs2QIxw6C5MaOrZsyejR4+mW7duDBs2jEMOOYTPPvuMv//971x22WUcfvjh9O3bl5NPPpkmTZqwatUqpk6dSvPmzQGYMGECeXl5tG/fnvT0dJ544gnKly/P4YcfXkxXK0mSVHKSCuYxxuxirkMpKienIJRv2lSwvWxZ8t+tXLky06dP57rrrqN79+5899131KlTh86dO5OZmQlAfn4+V111FZ999hlVq1alS5cu3HHHHQBUr16dUaNGMWDAADZu3Ejz5s15+umnadSoURFfpSRJUslLalWWfZ2rsuy+rUfMK1SAadMgK6ukq5IkSUpNe7IqS1Ij5iGE43fSnA98ByyKMW7cnSKUurKyCsJ4Tg5kZxvKJUmSikuyc8xzgJ8aWl8bQrgrxjh4z0ra//Tq1YuVK1fy3HPPlXQpuyUry0AuSZJU3JIN5t2APwHvAE8CXwK1gLOBVsBNQDvg2hDCNzHG0cVQqyRJkrTfSjaYnwFMjTFets3+SSGEcUDnGOMFIYR84ELAYC5JkiTtgmTXMf818NQO2p6kYEQdYCrgkhk7MXXqVI477jgyMzOpUaMGJ554IgsXLky0L126lBACjz/+OJ06daJSpUq0bt2a+fPns2DBAo499liqVKlCx44dWbJkSaFjT5kyhTZt2lCxYkUaNWrE4MGD2bBhw96+RO0lK1euJIRATk5OSZciSZKKQLLBvCzQeAdth21uB1i/+aUdWLNmDf369WPWrFnk5OSQkZFB165dfxSghwwZwqBBg5g3bx7Vq1fn3HPP5aqrrmLEiBHMmjWLdevWcfXVVyf6v/jii/Ts2ZM+ffrw7rvv8tBDD/Hkk09yww037O1LlCRJ0m5IdirLP4BbQghfAf8vxrgphFCWgpH0EcDzm/sdCSwu+jL3H2eddVah7fHjx1OtWjVmzZpFx44dE/t///vfc8oppwBwzTXX0LVrV4YPH07nzp0B6NOnD3369En0HzFiBAMHDuSCCy4AoHHjxowaNYrf/va33H777YQQivvSJEmStAeSHTG/CngX+BvwQwjhS+AH4K+b91+1ud93wC1FXeT+ZPHixfTo0YPGjRtTrVo1atWqRX5+Pp9++mmhfq1atUp8rlWrFgAtW7YstG/NmjWsXbsWgLlz5zJixAjS09MTrx49erBmzRq++OKLvXBlJWf69Ol06NCB9PR0MjIyaNeuHQsWLGDChAmkp6cX6puTk0MIgZUrVwIk+kyZMoUmTZpQsWJFOnfuzMcff5z4ztChQ2nRogV/+ctfOOSQQ6hUqRJnnHFG4hhQ8KCk4cOHU79+fdLS0mjZsiV///vfC5172LBhNGjQgLS0NGrXrs15552XaIsxctttt9G4cWMqVapEy5YteeSRRwp9f/bs2YmpSq1bt2bmzJlF9htKkqSSl+yTP1cCx4UQfgV0AGoDy4EZMcaXt+r3cLFUuR857bTTqFevHuPGjaNu3bqUK1eO5s2b/2gqS/ny5ROft4x2b29ffn5+4n3IkCF07979R+esWbNmkV9HqsjLy6Nbt25ceOGFTJ48mY0bN/L2229TtmzZn/7yZuvXr+ePf/wj48ePp3LlyvTt25czzzyTefPmJX7npUuX8sgjj/D3v/+dtWvXcskll9C7d2+effZZAMaOHcvtt9/OfffdR9u2bXnkkUc488wz+f/t3Xl0VdX9///nhhCITEahIDKqKCCISgSiSK+Cih8Q6q9VP6L9iDih0goVrBSHKK0oItUWB9A6YvvVUsdq0ZoSVAxDVJRJFC1agYpaW2QykOzfHzekgAQDJOQSno+17rr3nLPPOe+Tdbzr5Wbffd58802OPvpo/vSnPzF+/Hj+8Ic/0KlTJ1atWsWsWbNKa7juuuuYOnUqd999N0cccQT5+flccsklZGZm0rdvX9asWUPfvn35/ve/zyOPPMLy5csZNmxYxf4xJUlSlSrvUBYAYowvAy9XUi3V3pdffsl7773HPffcUzok5a233mLTpk27fexjjz2W9957j8MOO2y3j7U3Wb16Nf/+978544wzOPTQ5M8g2rVrB1DuHuVNmzZx1113ccIJJwDw2GOPccghh5Cbm0vv3r0BWL9+PY8++igtW7YEYNKkSZx44ol88MEHtG3blvHjxzNixAgGDhwIJHvHX331VcaPH8+UKVP4+OOPOeiggzj11FOpVasWLVu2JCsr+VCwtWvXMmHCBF5++WVOPPFEANq0acOcOXO4++676du3L7///e8pLCzkoYceol69enTs2JHRo0fz4x//uIL+kpIkqaqVO5iHZNfhGUBP4EAgJ8b4cQjh+8AHMcYVlVTjXis/P/nEzM8/hxAgMzOTRo0acf/999OiRQuWL1/OyJEjSUvbqf8/2q4bbriBfv360apVK84++2zS0tJYsGABc+bMYdy4cbt/MSnqgAMOYNCgQZx22mn06tWLXr168aMf/ag0QJdHjRo16Nq1a+lyq1ataNasGYsWLSoN5gcffPBWx+zWrRs1atRg8eLFNGnShBUrVpQG+8169OjBiy++CMBZZ53FXXfdRZs2bTjttNPo06cP/fv3p3bt2ixatIgNGzbQp0+frX4LsHHjRlq3bg3A4sWLOeqoo7YampPtU58kSapWyjXGPISQCbwBPANcAvwfyXBOyfK1lVLdXiw/H3r1guuvh5degq++SgbAJ554gnfffZeOHTty5ZVXMmbMGGrXrr3b5zvttNN44YUXmD59Ol27dqVr167ceuutOxVQ91YPPfQQs2fPpmfPnjz33HMcccQRvPTSS9SoUYMYt35g7caNG7d7jMr6cezm47Zo0YIlS5YwadIkGjRowNVXX02XLl1Yu3Zt6XCk559/nnnz5pW+Fi5cyMsv+w9UkiTtK8rbVXs70AI4AZgLbDkg+hVgZAXXtdfLy4PCQigqgpo1H6Zfv+T6k08+mQULFmzVds2aNaWfW7du/a0wmZWV9a11ffr0+da6U089lVNPPbXiLiKFbf7XiEQCsrOhc+fOdO7cmZ///OecfvrpPPLII/z4xz9m3bp1rF69mgYNGgAwb968bx2ruLiYOXPmcPzxxwPwySefsGLFCtq3b1/aZvny5fzjH/+gRYsWAMyZM4fi4mLat29PgwYNaNasGTNnzqRXr16l+7z++ut06NChdLlOnTr07duXvn37cu2119K0aVNmzpxJdnY2tWvX5uOPP+bkk0/e7vW2b9+ehx9+mLVr11K3bl2ArcaoS5KkvV95g/kAYESMMb9kmsQtfUIytGsLiQSkpyfDeXp6clkVY/O/RhQWQlra3znrrElcfnl/Dj74YD766CPeffddLr/8crp164IybegAACAASURBVEbdunUZNWoUw4cP55133uGee+751vHS0tIYNmwYd911FxkZGQwfPpwjjzyydBgLQEZGBhdccAETJkxg/fr1DBkyhL59+9K2bVsARo4cyQ033EDbtm3p0qULU6ZM4bXXXuOtt94CkrO/bNq0iW7dulGvXj2eeOIJatWqRdu2balfvz4jRoxgxIgRxBjp2bMna9asYdasWdSoUYNLL72UgQMHMnr0aAYPHswNN9zAihUr+NWvfrVn/uCSJGnPiDF+54vk1Ii9Sz7XBIqBY0uW/wf4ujzHqapXly5dYlV4440Yb7kl+a6Kc8stMdasGSPEWKPGP2OHDmfGZs2axfT09NiiRYs4cuTIWFhYGGOM8Zlnnolt27aNderUiaeeemp87LHHIhA///zzGGOMDz30UKxbt2585pln4mGHHRbT09Njz5494wcffFB6vhtvvDEeeeSRcdKkSbF58+axTp06sX///nHVqlWlbYqKiuLNN98cmzdvHmvVqhU7duwYn3766dLtTz/9dOzevXts2LBh3G+//WJWVlZ8/vnnS7cXFxfH3/zmN7F9+/YxPT09NmrUKPbu3Tu+/PLLpW1mzZoVjznmmJienh6POuqo+Nxzz0UgTp8+vbL+1JIkaScBBXEXM2uI2wyH2J4Qwjzg5RjjNSU95huBrBjjWyGE24ATY4zHV/z/NlSMrKysWFBQUNVlqIJs2WOeng65ucnhLLvi4Ycf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2wnlxBjnV1w5kiRJ0r6pzGAeQrgBeCDGuKLk847EGOOYii1NkiRJ2nfsqMc8B5gGrGDrMeXbEwGDuaSUFkLgj3/8Iz/60Y9YtmwZbdq0Ye7cuWRlZW23fXnaSJJUUcoM5jHGGtv7LEmVIZFI0LFjRyZOnFhp51i5ciWZmZmVdnxJknaHgVtStVFYWLjD9U2bNqV27dp7siRJksrNYC6pyg0aNIgZM2Zw9913E0IghMCyZctYtGgRffv2pX79+nzve9/j3HPP5Z///OdW+/Xr14/bbruN5s2b07x5cwBat25NTk4OgwcPZv/99+e8884DkkNZpk6dutW533//fXr06EGdOnVo164dL7/88g5r/a6aJEnaVeUK5iGE4hBCURmvTSGEL0MIfw0hnFrZBUuqfu666y6ys7O58MILWblyJStXrqRWrVr07NmTjh07MmfOHF555RXWrFnDgAEDKC4uLt13xowZvPvuu0ybNo3c3NzS9RMmTKBdu3YUFBRwyy23lHnua665hp/+9KfMmzePU045hQEDBrB8+fLttl25cmW5apIkaVeUd7rEMcAFJB8u9ALwGdAU+B9gA/AMkAD+EkIYEGP8c8WXKqm6atiwIenp6ey33340bdoUgBtuuIHOnTtz2223lbZ79NFHOeCAAygoKKBr164A1KlThwcffPBbQ1S+//3vc80113znuS+//HLOPvtsIPk/CC+99BL33nsvv/zlL7/V9t577y1XTZIk7YryBvMNwN+B02OMGzavDCFkAH8BPgeOJRnafwEYzCXtljfffJNXX32VevXqfWvbhx9+WBqCO3bsuN1x4+WdRSU7O7v0c40aNejWrRuLFi3arZokSdoV5Q3mQ4CfbBnKAWKM60MIvwYmxhh/FUJ4AHikoouUtO8pLi6mb9++jB8//lvbmjRpUvq5bt26292/rPV7oiZJknZFeYN5Y6BWGdvSgQNLPn8BhN0tStK+Jz09naKiotLlY489lieffJJWrVpRq1ZZXz+7b9asWZx88skAxBiZM2cOP/rRj7bbdk/VJEnaN5V3VpY3gZwQwkFbrgwhNANuBApKVrUi+UAiSSqX/HwYOxYyMlozZ84cli1bxhdffMGVV17Jf/7zH8455xxmz57NRx99xCuvvMKll17K119/XWHnv/fee5k6dSpLlixh2LBhfPzxx1x++eXbbbun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Y9myZcyePZvXX3+dDh06ANCqVStCCLzwwgt8/vnnrFmzhvr16zNixAhGjBjBgw8+yNKlS5k3bx733XcfkydP3uN/F0naGQZzSdJuyc+HXr3g+uuT7/n5yeEsmzZtKg3hderUoVu3btSuXbt0fPlll13G2WefzcCBAznuuONYtmwZV199delxa9asyVdffcWgQYM44ogjOPPMM8nOzmbChAkAHHzwwdx0002MHj2aJk2alPa8jxkzhpycHMaPH8+RRx7JKaecwp/+9CfatGmzZ/8wkrSTnJVFkrRbxo5NhvKiIqhZE8aMgVGjqroqSaoauzMriz3mkqql1q1bM378+N1uo++WSEB6ejKUp6cnlyVJO88ff0raqz388MMMHTqUNWvW7PS+c+fOpW7dupVQ1b4lOxtycyEvLxnKs7OruiJJ2jsZzCXtsxo3blzVJVQb2dkGcknaXQ5lkVSlEokEV1xxBb/4xS9o1KgR3/ve9xgxYkTpfNRfffUVF1xwAZmZmWRkZNC7d28WLlwIJJ/8eOGFF7J27VpCCIQQyMnJKT32hg0buOyyy2jQoAHNmzfn9ttv3+rc2w5lCSEwefJkliL44QAADutJREFUzjrrLOrWrcshhxzClClTttpn9uzZHHvssdSpU4djjjmGF198kRDCVo+clyRpVxjMJVW5xx9/nLS0NN544w0mTpzInXfeyRNPPAHAoEGDmD17Ns8++yxz5sxhv/32o0+fPqxfv57jjz+eO++8k/3224+VK1eycuVKRowYUXrcX//613Tq1Im33nqLn//851xzzTXk5+fvsJabb76ZAQMG8M4773DOOecwePBgPvnkEwDWrFlDv379aNeuHW+++Sbjxo1j5MiRlfeHkSTtUwzmkqpchw4duPnmmzn88MM5++yzOemkk8jNzeWDDz7gueeeY/LkyfTs2ZNOnTrx2GOPsXr1ah5//HHS09Np2LAhIQSaNm1K06ZNqVevXulxTz31VIYOHcphhx3GT37yEw477DByc3N3WMuPf/xjzj//fA477DDGjBlDWloar776KpD8H4iioiJ+97vflU7DN3r06Er920iS9h0Gc0lV7qijjtpquVmzZqxatYrFixdTo0YNsrcYvNywYUM6derEokWLdvm45d0nLS2Nxo0bl+7z3nvv0bFjRzIyMkrbdOvW7TvrkCSpPAzmkqpc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\n", "text/plain": [ "<Figure size 864x720 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "clf = get_clf(c=10, penalty='l2')\n", "clf.fit(X, y)\n", "topi = np.argsort(chi)[::-1][:20]\n", "plt.figure(figsize=(12,10))\n", "for feature_idx in topi:\n", " chiscore = chi[feature_idx]\n", " coef = clf.coef_[0][feature_idx]\n", " plt.plot(chiscore, coef, 'b.')\n", " plt.text(chiscore, coef, vec.get_feature_names()[feature_idx], fontsize=14)\n", "plt.xlabel('chisq', size=16)\n", "plt.ylabel('logistic regression coefficient', size=16)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "code_folding": [ 0 ] }, "outputs": [ { "data": { "text/html": [ "<link href=\"https://fonts.googleapis.com/css?family=Droid+Sans+Mono\" rel=\"stylesheet\" type='text/css'>\n", "\n", "<link href=\"https://fonts.googleapis.com/css?family=Exo+2\" rel=\"stylesheet\" type='text/css'>\n", "\n", "<link href=\"https://fonts.googleapis.com/css?family=Lora\" rel=\"stylesheet\" type='text/css'>\n", "\n", "<link href=\"https://fonts.googleapis.com/css?family=Fira+Mono\" rel=\"stylesheet\" type='text/css'>\n", "\n", "<style>\n", "\n", "div#site {\n", " height: 100% !important;\n", "}\n", "\n", "strong {\n", " font-weight: 900 !important;\n", "}\n", "\n", ".container { width:90% !important; }\n", "\n", "\n", "div#notebook {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 20pt;\n", " line-height: 170%;\n", " color: #303030;\n", "}\n", "body,\n", "div.body {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 20pt;\n", " color: #303030;\n", " background-color: #ffffff;\n", " background: #ffffff;\n", "}\n", "body.notebook_app {\n", " padding: 0;\n", " background-color: #ffffff;\n", " background: #ffffff;\n", " padding-right: 0px !important;\n", " overflow-y: hidden;\n", "}\n", "a {\n", " font-family: \"Exo_2\", sans-serif;\n", " color: #303030;\n", "}\n", "a:hover,\n", "a:focus {\n", " color: #2f2f2f;\n", "}\n", ".list_header,\n", "div#notebook_list_header.row.list_header {\n", " font-size: 20pt;\n", " color: #2f2f2f;\n", " background-color: #ffffff;\n", "}\n", "div#cluster_list_header.row.list_header,\n", "div#running .row.list_header {\n", " font-size: 20pt;\n", " color: #303030;\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border-bottom: 2px solid rgba(180,180,180,.30);\n", "}\n", "div#cluster_list > div.list_item.row,\n", "div#cluster_list > div.list_item.row:hover {\n", " background: #fafafa;\n", " background-color: #fafafa;\n", "}\n", "div#clusters.tab-pane.active {\n", " font-size: 12.0pt;\n", " padding: 4px 0 4px 0;\n", "}\n", "#running .panel-group .panel .panel-heading {\n", " font-size: 14pt;\n", " color: #303030;\n", " padding: 8px 8px;\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", "}\n", "#running .panel-group .panel .panel-heading a {\n", " font-size: 14pt;\n", " color: #303030;\n", "}\n", "#running .panel-group .panel .panel-heading a:focus,\n", "#running .panel-group .panel .panel-heading a:hover {\n", " font-size: 14pt;\n", " color: #303030;\n", "}\n", "#running .panel-group .panel .panel-body .list_container .list_item {\n", " background: #fafafa;\n", " background-color: #fafafa;\n", " padding: 2px;\n", " border-bottom: 2px solid rgba(180,180,180,.30);\n", "}\n", "#running .panel-group .panel .panel-body .list_container .list_item:hover {\n", " background: #fafafa;\n", " background-color: #fafafa;\n", "}\n", "#running .panel-group .panel .panel-body {\n", " padding: 2px;\n", "}\n", "div.running_list_info.toolbar_info {\n", " font-size: 12.0pt;\n", " padding: 4px 0 4px 0;\n", " height: inherit;\n", " line-height: inherit;\n", " text-shadow: none;\n", "}\n", ".list_placeholder {\n", " font-weight: normal;\n", "}\n", "#tree-selector {\n", " padding: 0px;\n", "}\n", "#project_name > ul > li > a > i.fa.fa-home {\n", " color: #ff7823;\n", " font-size: 17pt;\n", " display: inline-block;\n", " position: static;\n", " padding: 0px 0px;\n", " font-weight: normal;\n", " text-align: center;\n", " vertical-align: text-top;\n", "}\n", "#project_name {\n", " display: inline-flex;\n", " padding-left: 7px;\n", " margin-left: -2px;\n", " margin-bottom: -20px;\n", " text-align: -webkit-auto;\n", " vertical-align: text-top;\n", "}\n", "div#notebook_toolbar div.dynamic-instructions {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12.0pt;\n", "}\n", ".toolbar_info {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12.0pt;\n", " color: #303030;\n", " text-shadow: none;\n", " border: none;\n", " height: inherit;\n", " line-height: inherit;\n", "}\n", ".list_container {\n", " font-size: 12.0pt;\n", " color: #303030;\n", " border: none;\n", " text-shadow: none !important;\n", "}\n", ".list_container > div {\n", " border-bottom: 1px solid rgba(180,180,180,.14);\n", " font-size: 12.0pt;\n", "}\n", ".list_header > div,\n", ".list_item > div {\n", " padding-left: 0px;\n", "}\n", ".list_header > div input,\n", ".list_item > div input {\n", " top: 0px;\n", "}\n", ".list_header > div .item_link,\n", ".list_item > div .item_link {\n", " margin-left: -1px;\n", " vertical-align: middle;\n", " line-height: 22px;\n", " font-size: 12.0pt;\n", "}\n", ".item_icon {\n", " font-size: 12.0pt;\n", " vertical-align: middle;\n", "}\n", ".list_item input:not([type=\"checkbox\"]) {\n", " padding-right: 0px;\n", " height: auto;\n", " width: 20%;\n", " margin: 6px 0 0;\n", " margin-top: 1px;\n", "}\n", "#button-select-all {\n", " height: auto;\n", " font-size: 12.0pt;\n", " padding: 5px;\n", " min-width: 65px;\n", " z-index: 0;\n", "}\n", "button#tree-selector-btn {\n", " height: auto;\n", " font-size: 12.0pt;\n", " padding: 5px;\n", "}\n", "input#select-all.pull-left.tree-selector {\n", " margin-left: 7px;\n", " margin-right: 2px;\n", " margin-top: 5px;\n", "}\n", "input[type=\"radio\"],\n", "input[type=\"checkbox\"] {\n", " margin: 6px 0 0;\n", " margin-top: 1px;\n", " line-height: normal;\n", "}\n", ".list_container a {\n", " font-size: 17px;\n", " color: #303030;\n", " border: none;\n", " text-shadow: none !important;\n", " font-weight: normal;\n", " font-style: normal;\n", "}\n", "div.list_container a:hover {\n", " color: #2f2f2f;\n", "}\n", "div.list_item:hover {\n", " background-color: #fafafa;\n", "}\n", ".breadcrumb > li {\n", " font-size: 12.0pt;\n", " color: #303030;\n", " border: none;\n", " text-shadow: none !important;\n", "}\n", "ul#tabs a {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " font-weight: normal;\n", " font-style: normal;\n", " border-color: transparent;\n", " text-shadow: none !important;\n", "}\n", ".nav-tabs {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " font-weight: normal;\n", " font-style: normal;\n", " background: #ffffff;\n", " text-shadow: none !important;\n", " border-color: transparent;\n", " border-bottom-color: rgba(180,180,180,.30);\n", "}\n", ".nav-tabs > li > a:hover {\n", " color: #2f2f2f;\n", " background-color: rgba(180,180,180,.14);\n", "}\n", ".nav-tabs > li > a:active,\n", ".nav-tabs > li > a:focus,\n", ".nav-tabs > li.active > a,\n", ".nav-tabs > li.active > a:focus,\n", ".nav-tabs > li.active > a:hover,\n", ".nav-tabs > li.active > a,\n", ".nav-tabs > li.active > a:hover,\n", ".nav-tabs > li.active > a:focus {\n", " color: #1c1c1c;\n", " background-color: #eeeeee;\n", " border: 1px solid transparent;\n", " border-bottom-color: transparent;\n", " cursor: default;\n", "}\n", ".nav > li > a:hover,\n", ".nav > li > a:focus {\n", " text-decoration: none;\n", " background-color: rgba(180,180,180,.14);\n", "}\n", ".nav > li.disabled > a,\n", ".nav > li.disabled > a:hover {\n", " color: #aaaaaa;\n", "}\n", "div#notebook {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 20pt;\n", " padding-top: 4px;\n", "}\n", ".notebook_app {\n", " background-color: #ffffff;\n", "}\n", "#notebook-container {\n", " padding: 13px;\n", " background-color: #ffffff;\n", " min-height: 0px;\n", " box-shadow: none;\n", " width: 980px;\n", " margin-right: auto;\n", " margin-left: auto;\n", "}\n", "div#ipython-main-app.container {\n", " width: 980px;\n", " margin-right: auto;\n", " margin-left: auto;\n", " margin-right: auto;\n", " margin-left: auto;\n", "}\n", ".container {\n", " width: 980px;\n", " margin-right: auto;\n", " margin-left: auto;\n", "}\n", ".notebook_app #header {\n", " box-shadow: none !important;\n", " background-color: #ffffff;\n", " border-bottom: 2px solid rgba(180,180,180,.14);\n", "}\n", "#header {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 22pt;\n", " box-shadow: none;\n", " background-color: #ffffff;\n", "}\n", "#header .header-bar {\n", " background: #ffffff;\n", " background-color: #ffffff;\n", "}\n", "body > #header .header-bar {\n", " width: 100%;\n", " background: #ffffff;\n", "}\n", "#menubar {\n", " background-color: #ffffff;\n", "}\n", "#menubar .navbar,\n", ".navbar-default {\n", " background-color: #ffffff;\n", " margin-bottom: 0px;\n", " margin-top: 5px;\n", "}\n", ".navbar {\n", " border: none;\n", "}\n", "div.navbar-text,\n", ".navbar-text {\n", " margin-top: 6px !important;\n", " margin-bottom: 0px;\n", "}\n", ".navbar-default {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " background-color: #ffffff;\n", " border-color: rgba(180,180,180,.14);\n", " line-height: 1.5em;\n", " padding-bottom: 0px;\n", "}\n", ".navbar-default .navbar-nav > li > a {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " color: #303030;\n", " display: block;\n", " line-height: 1.5em;\n", " padding-top: 9px;\n", " padding-bottom: 6px;\n", "}\n", ".navbar-default .navbar-nav > li > a:hover,\n", ".navbar-default .navbar-nav > li > a:focus {\n", " color: #2f2f2f;\n", " background-color: rgba(180,180,180,.14);\n", " border-color: rgba(180,180,180,.14);\n", " line-height: 1.5em;\n", "}\n", ".navbar-default .navbar-nav > .open > a,\n", ".navbar-default .navbar-nav > .open > a:hover,\n", ".navbar-default .navbar-nav > .open > a:focus {\n", " color: #1c1c1c;\n", " background-color: rgba(180,180,180,.14);\n", " border-color: rgba(180,180,180,.14);\n", " line-height: 1.5em;\n", "}\n", ".edit_mode .modal_indicator:before {\n", " font-size: 15pt;\n", " color: #2c85f7;\n", " content: \"\\f040\";\n", " padding-top: 5px;\n", " padding-bottom: 0px;\n", " vertical-align: bottom;\n", "}\n", ".command_mode .modal_indicator:before {\n", " font-size: 17pt;\n", " color: #2c85f7;\n", " content: \"\\f1f9\";\n", " padding-top: 5px;\n", " padding-bottom: 0px;\n", " vertical-align: bottom;\n", "}\n", ".item_icon {\n", " color: #126dce;\n", "}\n", ".item_buttons .kernel-name {\n", " font-size: 13pt;\n", " color: #126dce;\n", " line-height: 22px;\n", "}\n", ".running_notebook_icon:before {\n", " color: #009e07 !important;\n", "}\n", ".item_buttons .running-indicator {\n", " padding-top: 2px;\n", " color: #009e07;\n", "}\n", "#modal_indicator {\n", " float: right !important;\n", " color: #126dce;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", "}\n", "#kernel_indicator {\n", " float: right !important;\n", " color: #ff7823;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " font-size: 16pt;\n", " border-left: 2px solid #ff7823;\n", " padding-bottom: 2px;\n", "}\n", "#kernel_indicator .kernel_indicator_name {\n", " color: #ff7823;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " font-size: 16pt;\n", " padding-left: 5px;\n", " padding-right: 5px;\n", " margin-top: 10px;\n", " vertical-align: text-bottom;\n", " padding-bottom: 0px;\n", "}\n", "#kernel_indicator .kernel_indicator_name {\n", " color: #ff7823;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " font-size: 15.5pt;\n", " padding-left: 5px;\n", " padding-right: 5px;\n", " margin-top: 10px;\n", " vertical-align: text-bottom;\n", " padding-bottom: 0px;\n", "}\n", "div.notification_widget.info,\n", ".notification_widget.info,\n", ".notification_widget:active:hover,\n", ".notification_widget.active:hover,\n", ".open > .dropdown-toggle.notification_widget:hover,\n", ".notification_widget:active:focus,\n", ".notification_widget.active:focus,\n", ".open > .dropdown-toggle.notification_widget:focus,\n", ".notification_widget:active.focus,\n", ".notification_widget.active.focus,\n", ".open > .dropdown-toggle.notification_widget.focus,\n", "div#notification_notebook.notification_widget.btn.btn-xs.navbar-btn,\n", "div#notification_notebook.notification_widget.btn.btn-xs.navbar-btn:hover,\n", "div#notification_notebook.notification_widget.btn.btn-xs.navbar-btn:focus {\n", " color: #126dce;\n", " background-color: #ffffff;\n", " border-color: #ffffff;\n", "}\n", "#notification_area,\n", "div.notification_area {\n", " float: right !important;\n", " position: static;\n", "}\n", "#kernel_logo_widget,\n", "#kernel_logo_widget .current_kernel_logo {\n", " display: none;\n", "}\n", "div#ipython_notebook {\n", " display: none;\n", "}\n", "i.fa.fa-icon {\n", " -webkit-font-smoothing: antialiased;\n", " -moz-osx-font-smoothing: grayscale;\n", " text-rendering: auto;\n", "}\n", ".fa {\n", " display: inline-block;\n", " font: normal normal normal 12pt/1 \"FontAwesome\", \"Exo_2\", sans-serif;\n", " text-rendering: auto;\n", " -webkit-font-smoothing: antialiased;\n", " -moz-osx-font-smoothing: grayscale;\n", "}\n", ".dropdown-menu {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " box-shadow: none;\n", " padding: 0px;\n", " text-align: left;\n", " border: 2px solid rgba(180,180,180,.30);\n", " background-color: #ffffff;\n", " background: #ffffff;\n", " line-height: 1.3;\n", " margin: 0px;\n", "}\n", ".dropdown-menu:hover {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " border: 2px solid rgba(180,180,180,.30);\n", " background-color: #ffffff;\n", " box-shadow: none;\n", " line-height: 1.3;\n", "}\n", ".dropdown-header {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " display: block;\n", " color: #ff7823;\n", " text-decoration: underline;\n", " white-space: nowrap;\n", " padding: 8px 0px 0px 6px;\n", " line-height: 1.3;\n", "}\n", ".dropdown-menu > li > a {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12.0pt;\n", " line-height: 1.3;\n", " display: block;\n", " padding: 10px 25px 10px 14px;\n", " color: #303030;\n", " background-color: #ffffff;\n", " background: #ffffff;\n", "}\n", ".dropdown-menu > li > a:hover {\n", " color: #2f2f2f;\n", " background-color: rgba(180,180,180,.14);\n", " background: rgba(180,180,180,.14);\n", " border-color: rgba(180,180,180,.14);\n", "}\n", ".dropdown-menu .divider {\n", " height: 2px;\n", " margin: 0px 0px;\n", " overflow: hidden;\n", " background-color: rgba(180,180,180,.30);\n", "}\n", ".dropdown-submenu > .dropdown-menu {\n", " top: 0;\n", " left: 100%;\n", " margin-top: -2px;\n", " margin-left: 0px;\n", " padding-top: 0px;\n", "}\n", ".dropdown-menu > .disabled > a,\n", ".dropdown-menu > .disabled > a:hover,\n", ".dropdown-menu > .disabled > a:focus {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12.0pt;\n", " font-weight: normal;\n", " color: #aaaaaa;\n", " padding: none;\n", " display: block;\n", " clear: both;\n", " line-height: 1.2;\n", " white-space: nowrap;\n", "}\n", ".dropdown-submenu > a:after {\n", " color: #303030;\n", " margin-right: -16px;\n", "}\n", ".dropdown-submenu:hover > a:after,\n", ".dropdown-submenu:active > a:after,\n", ".dropdown-submenu:focus > a:after,\n", ".dropdown-submenu:visited > a:after {\n", " color: #ff7823;\n", " margin-right: -16px;\n", "}\n", "div.kse-dropdown > .dropdown-menu,\n", ".kse-dropdown > .dropdown-menu {\n", " min-width: 0;\n", " top: 94%;\n", "}\n", ".btn,\n", ".btn-default {\n", " font-family: \"Exo_2\", sans-serif;\n", " color: #303030;\n", " background: #ebebeb;\n", " background-color: #ebebeb;\n", " border: 2px solid #e8e8e8;\n", " font-weight: normal;\n", " box-shadow: none;\n", " text-shadow: none;\n", " border-radius: 2px;\n", " font-size: inherit;\n", "}\n", ".btn:hover,\n", ".btn:active:hover,\n", ".btn.active:hover,\n", ".btn-default:hover,\n", ".open > .dropdown-toggle.btn-default:hover,\n", ".open > .dropdown-toggle.btn:hover {\n", " color: #2f2f2f;\n", " background-color: #e4e4e4;\n", " background: #e4e4e4;\n", " border-color: #e4e4e4;\n", " background-image: none;\n", " box-shadow: none !important;\n", " border-radius: 2px;\n", "}\n", ".btn:active,\n", ".btn.active,\n", ".btn:active:focus,\n", ".btn.active:focus,\n", ".btn:active.focus,\n", ".btn.active.focus,\n", ".btn-default:focus,\n", ".btn-default.focus,\n", ".btn-default:active,\n", ".btn-default.active,\n", ".btn-default:active:hover,\n", ".btn-default.active:hover,\n", ".btn-default:active:focus,\n", ".btn-default.active:focus,\n", ".btn-default:active.focus,\n", ".btn-default.active.focus,\n", ".open > .dropdown-toggle.btn:focus,\n", ".open > .dropdown-toggle.btn.focus,\n", ".open > .dropdown-toggle.btn-default {\n", " color: #1c1c1c;\n", " background-color: #e4e4e4;\n", " background: #e4e4e4;\n", " border-color: #e4e4e4;\n", " background-image: none;\n", " box-shadow: none !important;\n", " border-radius: 1px;\n", "}\n", ".item_buttons > .btn,\n", ".item_buttons > .btn-group,\n", ".item_buttons > .input-group {\n", " margin-left: 5px;\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border: 1px solid #eeeeee;\n", "}\n", ".item_buttons > .btn:hover,\n", ".item_buttons > .btn-group:hover,\n", ".item_buttons > .input-group:hover {\n", " margin-left: 5px;\n", " background: #e9e9e9;\n", " background-color: #e9e9e9;\n", " border: 1px solid #e9e9e9;\n", "}\n", ".btn-group > .btn-mini,\n", ".btn-sm,\n", ".btn-group-sm > .btn,\n", ".btn-xs,\n", ".btn-group-xs > .btn,\n", ".alternate_upload .btn-upload,\n", ".btn-group,\n", ".btn-group-vertical {\n", " font-size: 12.0pt;\n", " font-weight: normal;\n", "}\n", ".btn-xs,\n", ".btn-group-xs > .btn {\n", " font-size: 12.0pt;\n", " background-image: none;\n", " font-weight: normal;\n", " text-shadow: none;\n", " display: inline-table;\n", "}\n", ".btn-group > .btn:first-child {\n", " margin-left: 3px;\n", "}\n", ".alternate_upload .btn-upload {\n", " display: none;\n", "}\n", "button.close {\n", " border: 0px none;\n", " font-family: sans-serif;\n", " font-size: 25pt;\n", "}\n", ".dynamic-buttons {\n", " font-size: inherit;\n", " padding-top: 0px;\n", " display: inline-block;\n", "}\n", ".close {\n", " color: #de143d;\n", " opacity: .5;\n", " text-shadow: none;\n", "}\n", ".close:hover {\n", " color: #de143d;\n", " opacity: 1;\n", "}\n", "div.btn.btn-default.output_collapsed {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border-color: #eeeeee;\n", "}\n", "div.btn.btn-default.output_collapsed:hover {\n", " background: #e9e9e9;\n", " background-color: #e9e9e9;\n", " border-color: #e9e9e9;\n", "}\n", "div.nbext-enable-btns .btn[disabled],\n", "div.nbext-enable-btns .btn[disabled]:hover,\n", ".btn-default.disabled,\n", ".btn-default[disabled],\n", ".btn-default.disabled:hover,\n", ".btn-default[disabled]:hover,\n", "fieldset[disabled] .btn-default:hover,\n", ".btn-default.disabled:focus,\n", ".btn-default[disabled]:focus,\n", "fieldset[disabled] .btn-default:focus,\n", ".btn-default.disabled.focus,\n", ".btn-default[disabled].focus,\n", "fieldset[disabled] .btn-default.focus {\n", " color: #4a4a4a;\n", " background: #e8e8e8;\n", " background-color: #e8e8e8;\n", " border-color: #e8e8e8;\n", "}\n", ".input-group-addon {\n", " padding: 2px 5px;\n", " font-size: 12.0pt;\n", " font-weight: normal;\n", " height: auto;\n", " color: #303030;\n", " text-align: center;\n", " background-color: #ffffff;\n", " border: none;\n", "}\n", ".btn-group > .btn + .dropdown-toggle {\n", " padding-left: 8px;\n", " padding-right: 8px;\n", " height: 100%;\n", " border-left: 2px solid #ff7823 !important;\n", "}\n", ".btn-group > .btn + .dropdown-toggle:hover {\n", " border-left: 2px solid #ff7823 !important;\n", "}\n", ".input-group-btn {\n", " position: relative;\n", " font-size: inherit;\n", " white-space: nowrap;\n", "}\n", ".input-group-btn:first-child > .btn,\n", ".input-group-btn:first-child > .btn-group {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border: 1px solid #ebebeb;\n", " margin: 2px;\n", " font-size: inherit;\n", "}\n", ".input-group-btn:first-child > .btn:hover,\n", ".input-group-btn:first-child > .btn-group:hover {\n", " background: #e9e9e9;\n", " background-color: #e9e9e9;\n", " border: 1px solid #e9e9e9;\n", " margin: 2px;\n", " font-size: inherit;\n", "}\n", "div.modal .btn-group > .btn:first-child {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border: 1px solid #ebebeb;\n", " margin-top: 0px !important;\n", " margin-left: 0px;\n", " margin-bottom: 2px;\n", "}\n", "div.modal .btn-group > .btn:first-child:hover {\n", " background: #e9e9e9;\n", " background-color: #e9e9e9;\n", " border: 1px solid #e9e9e9;\n", "}\n", "div.modal > button,\n", "div.modal-footer > button {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border-color: #eeeeee;\n", "}\n", "div.modal > button:hover,\n", "div.modal-footer > button:hover {\n", " background: #e9e9e9;\n", " background-color: #e9e9e9;\n", " border-color: #e9e9e9;\n", "}\n", ".modal-content {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12.0pt;\n", " position: relative;\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border: none;\n", " border-radius: 1px;\n", " background-clip: padding-box;\n", " outline: none;\n", "}\n", ".modal-header {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " color: #303030;\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border-color: rgba(180,180,180,.30);\n", " padding: 12px;\n", " min-height: 16.4286px;\n", "}\n", ".modal-content h4 {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 16pt;\n", " color: #303030;\n", " padding: 5px;\n", "}\n", ".modal-body {\n", " background-color: #ffffff;\n", " position: relative;\n", " padding: 15px;\n", "}\n", ".modal-footer {\n", " padding: 10px;\n", " text-align: right;\n", " background-color: #fafafa;\n", " border-top: 1px solid rgba(180,180,180,.30);\n", "}\n", ".alert-info {\n", " background-color: #fdfdfd;\n", " border-color: rgba(180,180,180,.30);\n", " color: #303030;\n", "}\n", ".modal-header .close {\n", " margin-top: -5px;\n", " font-size: 25pt;\n", "}\n", ".modal-backdrop,\n", ".modal-backdrop.in {\n", " opacity: 0.85;\n", " background-color: #d6d6d6;\n", "}\n", "div.panel,\n", "div.panel-default,\n", ".panel,\n", ".panel-default {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12.0pt;\n", " background-color: #fafafa;\n", " color: #303030;\n", " margin-bottom: 14px;\n", " border: 0;\n", " box-shadow: none;\n", "}\n", "div.panel > .panel-heading,\n", "div.panel-default > .panel-heading {\n", " font-size: 14pt;\n", " color: #303030;\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border: 0;\n", "}\n", ".modal .modal-dialog {\n", " min-width: 950px;\n", " margin: 50px auto;\n", "}\n", "div.container-fluid {\n", " margin-right: auto;\n", " margin-left: auto;\n", " padding-left: 7px;\n", " padding-right: 12px;\n", "}\n", "div.form-control,\n", ".form-control {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: inherit;\n", " color: #303030;\n", " background-color: #ffffff;\n", " border: 2px solid #e7e7e7;\n", " margin-left: 2px;\n", " height: auto;\n", " box-shadow: none;\n", " padding: 6px 12px;\n", " transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s;\n", "}\n", ".form-group.list-group-item {\n", " color: #303030;\n", " background-color: #fafafa;\n", " border-color: rgba(180,180,180,.30);\n", " margin-bottom: 0px;\n", "}\n", "input,\n", "button,\n", "select,\n", "textarea {\n", " background-color: #ffffff;\n", " font-weight: normal;\n", " border: 1px solid rgba(180,180,180,.30);\n", "}\n", "select.form-control.select-xs {\n", " height: auto;\n", "}\n", "div.output.output_scroll {\n", " box-shadow: none;\n", "}\n", "::-webkit-scrollbar-track {\n", " -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.11);\n", " background-color: #d0d0d0;\n", " border-radius: 6px;\n", "}\n", "::-webkit-scrollbar {\n", " width: 14px;\n", " height: 20px;\n", " background-color: #d0d0d0;\n", " border-radius: 6px;\n", "}\n", "::-webkit-scrollbar-thumb {\n", " background-color: #ffffff;\n", " background-image: -webkit-gradient(linear,40% 0%,75% 86%,from(#ff6b0f ),color-stop(0.5,#ff8b42 ),to(#ff6b0f ));\n", " min-height: 100px;\n", " border-radius: 2px;\n", "}\n", "div.input_area {\n", " background-color: #efefef;\n", " padding-right: 1.2em;\n", " border: 0px;\n", " border-top-left-radius: 0px;\n", " border-top-right-radius: 2px;\n", " border-bottom-left-radius: 0px;\n", " border-bottom-right-radius: 0px;\n", "}\n", "div.cell {\n", " padding: 0px;\n", " background: #efefef;\n", " background-color: #efefef;\n", " border: medium solid #ffffff;\n", " border-top-right-radius: 2px;\n", " border-top-left-radius: 2px;\n", "}\n", "div.cell.selected {\n", " background: #efefef;\n", " background-color: #efefef;\n", " border: medium solid #ff7823;\n", " padding: 0px;\n", " border-top-right-radius: 2px;\n", " border-top-left-radius: 2px;\n", "}\n", ".edit_mode div.cell.selected {\n", " padding: 0px;\n", " background: #efefef;\n", " background-color: #efefef;\n", " border: medium solid #ffd5bb;\n", " border-top-right-radius: 2px;\n", " border-top-left-radius: 2px;\n", "}\n", "div.cell.edit_mode {\n", " padding: 0px;\n", " background: #efefef;\n", " background-color: #efefef;\n", " border: medium solid #ffd5bb;\n", " border-top-right-radius: 2px;\n", " border-top-left-radius: 2px;\n", "}\n", "div.prompt,\n", ".prompt {\n", " font-family: \"Fira Mono\", monospace;\n", " font-size: 9.5pt;\n", " font-weight: normal;\n", " color: #aaaaaa;\n", " line-height: 170%;\n", " padding: 0px;\n", " padding-top: 4px;\n", " padding-left: .25em;\n", " text-align: left !important;\n", " min-width: 12ex;\n", " width: 12ex;\n", "}\n", "div.prompt.input_prompt {\n", " background-color: #efefef;\n", " border-right: 2px solid rgba(240,147,43,.50);\n", " border-top-left-radius: 2px;\n", " border-top-right-radius: 0px;\n", " border-bottom-left-radius: 0px;\n", " border-bottom-right-radius: 0px;\n", " min-width: 12ex;\n", " width: 12ex !important;\n", "}\n", "div.output_wrapper {\n", " background-color: #ffffff;\n", " border: 0px;\n", " margin-bottom: 0em;\n", " margin-top: 0em;\n", " border-top-right-radius: 0px;\n", " border-top-left-radius: 0px;\n", " border-bottom-left-radius: 2px;\n", " border-bottom-right-radius: 2px;\n", "}\n", "div.output_subarea.output_text.output_stream.output_stdout,\n", "div.output_subarea.output_text {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 10.0pt;\n", " line-height: 150% !important;\n", " background-color: #ffffff;\n", " color: #303030;\n", " border-top-right-radius: 0px;\n", " border-top-left-radius: 0px;\n", " border-bottom-left-radius: 2px;\n", " border-bottom-right-radius: 2px;\n", "}\n", "div.output_area pre {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 10.0pt;\n", " line-height: 150% !important;\n", " color: #303030;\n", " border-top-right-radius: 0px;\n", " border-top-left-radius: 0px;\n", " border-bottom-left-radius: 2px;\n", " border-bottom-right-radius: 2px;\n", "}\n", "div.output_area {\n", " display: -webkit-box;\n", "}\n", "div.output_html {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 10.0pt;\n", " color: #353535;\n", " background-color: #ffffff;\n", " background: #ffffff;\n", "}\n", "div.output_subarea {\n", " overflow-x: auto;\n", " padding: .8em;\n", " -webkit-box-flex: 1;\n", " -moz-box-flex: 1;\n", " box-flex: 1;\n", " flex: 1;\n", " max-width: 90%;\n", "}\n", "div.prompt.output_prompt {\n", " font-family: \"Fira Mono\", monospace;\n", " font-size: 9.5pt;\n", " background-color: #ffffff;\n", " color: #ffffff;\n", " border-bottom-left-radius: 2px;\n", " border-top-right-radius: 0px;\n", " border-top-left-radius: 0px;\n", " border-bottom-right-radius: 0px;\n", " min-width: 12ex;\n", " width: 12ex;\n", "}\n", "div.out_prompt_overlay.prompt {\n", " font-family: \"Fira Mono\", monospace;\n", " font-size: 9.5pt;\n", " background-color: #ffffff;\n", " border-bottom-left-radius: 2px;\n", " border-top-right-radius: 0px;\n", " border-top-left-radius: 0px;\n", " border-bottom-right-radius: 0px;\n", " min-width: 12ex;\n", " width: 12ex;\n", "}\n", "div.out_prompt_overlay.prompt:hover {\n", " background-color: #ffffff;\n", " box-shadow: #e8e8e8 2px 1px 2px 2.5px inset;\n", " border-bottom-left-radius: 2px;\n", " -webkit-border-: 2px;\n", " -moz-border-radius: 2px;\n", " border-top-right-radius: 0px;\n", " border-top-left-radius: 0px;\n", " min-width: 12ex;\n", " width: 12ex !important;\n", "}\n", "div.text_cell,\n", "div.text_cell_render pre,\n", "div.text_cell_render {\n", " font-family: \"Lora\", serif;\n", " font-size: 20pt;\n", " line-height: 170% !important;\n", " color: #353535;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " border-radius: 2px;\n", " min-height: 500px;\n", "}\n", "div.cell.text_cell.rendered.selected {\n", " font-family: \"Lora\", serif;\n", " border: medium solid #126dce;\n", " line-height: 170% !important;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " border-radius: 2px;\n", " \n", "}\n", "div.cell.text_cell.unrendered.selected {\n", " font-family: \"Lora\", serif;\n", " line-height: 170% !important;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " border: medium solid #126dce;\n", " border-radius: 2px;\n", "}\n", "div.cell.text_cell.selected {\n", " font-family: \"Lora\", serif;\n", " line-height: 170% !important;\n", " border: medium solid #126dce;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " border-radius: 2px;\n", "}\n", ".edit_mode div.cell.text_cell.selected {\n", " font-family: \"Lora\", serif;\n", " line-height: 170% !important;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " border: medium solid #87b0db;\n", " border-radius: 2px;\n", "}\n", "div.text_cell.unrendered,\n", "div.text_cell.unrendered.selected,\n", "div.edit_mode div.text_cell.unrendered {\n", " font-family: \"Lora\", serif;\n", " line-height: 170% !important;\n", " background: #ffffff;\n", " background-color: #ffffff;\n", " border-radius: 2px;\n", "}\n", "div.cell.text_cell.rendered .input_prompt {\n", " font-family: \"Fira Mono\", monospace;\n", " font-size: 9.5pt;\n", " font-weight: normal;\n", " color: #aaaaaa;\n", " text-align: left !important;\n", " min-width: 0ex;\n", " width: 0ex !important;\n", " background-color: #ffffff;\n", " border-right: 2px solid transparent;\n", "}\n", "div.cell.text_cell.unrendered .input_prompt {\n", " font-family: \"Fira Mono\", monospace;\n", " font-size: 9.5pt;\n", " font-weight: normal;\n", " color: #aaaaaa;\n", " text-align: left !important;\n", " min-width: 0ex;\n", " width: 0ex !important;\n", " border-right: 2px solid transparent;\n", "}\n", "div.rendered_html code {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt;\n", " padding-top: 3px;\n", " color: #303030;\n", " background: #efefef;\n", " background-color: #efefef;\n", "}\n", "pre,\n", "code,\n", "kbd,\n", "samp {\n", " white-space: pre-wrap;\n", "}\n", "code {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt !important;\n", " line-height: 170% !important;\n", " color: #353535;\n", " background: #efefef;\n", " background-color: #efefef;\n", "}\n", "kbd {\n", " padding: 4px;\n", " font-size: 11pt;\n", " color: #303030;\n", " background-color: #efefef;\n", " border: 0;\n", " box-shadow: none;\n", "}\n", "pre {\n", " display: block;\n", " padding: 8.5px;\n", " margin: 0 0 9px;\n", " font-size: 12.0pt;\n", " line-height: 1.42857143;\n", " color: #303030;\n", " background-color: #efefef;\n", " border: 1px solid #e7e7e7;\n", " border-radius: 2px;\n", "}\n", "div.rendered_html {\n", " color: #353535;\n", "}\n", "div.rendered_html pre,\n", "div.text_cell_render pre {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt !important;\n", " line-height: 170% !important;\n", " color: #353535;\n", " background: #efefef;\n", " background-color: #efefef;\n", " border: 2px #e7e7e7 solid;\n", " max-width: 86%;\n", " border-radius: 2px;\n", " padding: 5px;\n", " min-height: 1px;\n", "}\n", "div.text_cell_render h1,\n", "div.rendered_html h1,\n", "div.text_cell_render h2,\n", "div.rendered_html h2,\n", "div.text_cell_render h3,\n", "div.rendered_html h3,\n", "div.text_cell_render h4,\n", "div.rendered_html h4,\n", "div.text_cell_render h5,\n", "div.rendered_html h5 {\n", " font-family: \"Exo_2\", sans-serif;\n", "}\n", ".rendered_html h1:first-child,\n", ".rendered_html h2:first-child,\n", ".rendered_html h3:first-child,\n", ".rendered_html h4:first-child,\n", ".rendered_html h5:first-child,\n", ".rendered_html h6:first-child {\n", " margin-top: 0.2em;\n", "}\n", ".rendered_html h1,\n", ".text_cell_render h1 {\n", " color: #126dce;\n", " font-size: 220%;\n", " text-align: center;\n", " font-weight: lighter;\n", "}\n", ".rendered_html h2,\n", ".text_cell_render h2 {\n", " text-align: left;\n", " font-size: 170%;\n", " color: #126dce;\n", " font-style: normal;\n", " font-weight: lighter;\n", "}\n", ".rendered_html h3,\n", ".text_cell_render h3 {\n", " font-size: 150%;\n", " color: #126dce;\n", " font-weight: lighter;\n", " text-decoration: italic;\n", " font-style: normal;\n", "}\n", ".rendered_html h4,\n", ".text_cell_render h4 {\n", " font-size: 120%;\n", " color: #126dce;\n", " font-weight: underline;\n", " font-style: normal;\n", "}\n", ".rendered_html h5,\n", ".text_cell_render h5 {\n", " font-size: 100%;\n", " color: #2f2f2f;\n", " font-weight: lighter;\n", " text-decoration: underline;\n", "}\n", ".rendered_html table,\n", ".rendered_html tr,\n", ".rendered_html td {\n", " font-family: \"Fira Mono\", monospace;\n", " font-size: 10.0pt !important;\n", " line-height: 150% !important;\n", " border: 1px solid #d6d6d6;\n", " color: #353535;\n", " background-color: #ffffff;\n", " background: #ffffff;\n", "}\n", "table.dataframe,\n", ".rendered_html tr,\n", ".dataframe * {\n", " font-family: \"Fira Mono\", monospace;\n", " font-size: 10.0pt !important;\n", " border: 1px solid #d6d6d6;\n", "}\n", ".dataframe th,\n", ".rendered_html th {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 11pt !important;\n", " font-weight: bold;\n", " border: 1px solid #c4c4c4;\n", " background: #eeeeee;\n", "}\n", ".dataframe td,\n", ".rendered_html td {\n", " font-family: \"Fira Mono\", monospace;\n", " font-size: 10.0pt !important;\n", " color: #353535;\n", " background: #ffffff;\n", " border: 1px solid #d6d6d6;\n", " text-align: left;\n", " min-width: 4em;\n", "}\n", ".dataframe-summary-row tr:last-child,\n", ".dataframe-summary-col td:last-child {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 11pt !important;\n", " font-weight: bold;\n", " color: #353535;\n", " border: 1px solid #d6d6d6;\n", " background: #eeeeee;\n", "}\n", "div.widget-area {\n", " background-color: #ffffff;\n", " background: #ffffff;\n", " color: #303030;\n", "}\n", "div.widget-area a {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12.0pt;\n", " font-weight: normal;\n", " font-style: normal;\n", " color: #303030;\n", " text-shadow: none !important;\n", "}\n", "div.widget-area a:hover,\n", "div.widget-area a:focus {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12.0pt;\n", " font-weight: normal;\n", " font-style: normal;\n", " color: #2f2f2f;\n", " background: rgba(180,180,180,.14);\n", " background-color: rgba(180,180,180,.14);\n", " border-color: transparent;\n", " background-image: none;\n", " text-shadow: none !important;\n", "}\n", "div.widget_item.btn-group > button.btn.btn-default.widget-combo-btn,\n", "div.widget_item.btn-group > button.btn.btn-default.widget-combo-btn:hover {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border: 2px solid #eeeeee !important;\n", " font-size: inherit;\n", " z-index: 0;\n", "}\n", "div.jupyter-widgets.widget-hprogress.widget-hbox,\n", "div.widget-hbox,\n", ".widget-hbox {\n", " display: inline-table;\n", "}\n", "div.jupyter-widgets.widget-hprogress.widget-hbox .widget-label,\n", "div.widget-hbox .widget-label,\n", ".widget-hbox .widget-label {\n", " font-size: 11pt;\n", " min-width: 100%;\n", " padding-top: 5px;\n", " padding-right: 10px;\n", " text-align: left;\n", " vertical-align: text-top;\n", "}\n", ".progress {\n", " overflow: hidden;\n", " height: 20px;\n", " margin-bottom: 10px;\n", " padding-left: 10px;\n", " background-color: #c6c6c6;\n", " border-radius: 4px;\n", " -webkit-box-shadow: none;\n", " box-shadow: none;\n", "}\n", ".rendered_html :link {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 100%;\n", " color: #2c85f7;\n", " text-decoration: underline;\n", "}\n", ".rendered_html :visited,\n", ".rendered_html :visited:active,\n", ".rendered_html :visited:focus {\n", " color: #2e6eb2;\n", "}\n", ".rendered_html :visited:hover,\n", ".rendered_html :link:hover {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 100%;\n", " color: #eb6a18;\n", "}\n", "a.anchor-link:link:hover {\n", " font-size: inherit;\n", " color: #eb6a18;\n", "}\n", "a.anchor-link:link {\n", " font-size: inherit;\n", " text-decoration: none;\n", " padding: 0px 20px;\n", " visibility: none;\n", " color: #126dce;\n", "}\n", ".navbar-text {\n", " margin-top: 4px;\n", " margin-bottom: 0px;\n", "}\n", "div#nbextensions-configurator-container.container,\n", "#nbextensions-configurator-container.container {\n", " width: 100%;\n", " margin-right: auto;\n", " margin-left: auto;\n", "}\n", "div.nbext-selector > nav > .nav > li > a {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12pt;\n", "}\n", "div.nbext-readme > .nbext-readme-contents > .rendered_html {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 12pt;\n", " line-height: 145%;\n", " padding: 1em 1em;\n", " color: #353535;\n", " background-color: #ffffff;\n", " -webkit-box-shadow: none;\n", " -moz-box-shadow: none;\n", " box-shadow: none;\n", "}\n", ".nbext-icon,\n", ".nbext-desc,\n", ".nbext-compat-div,\n", ".nbext-enable-btns,\n", ".nbext-params {\n", " margin-bottom: 8px;\n", " font-size: 12pt;\n", "}\n", "div.nbext-readme > .nbext-readme-contents {\n", " padding: 0;\n", " overflow-y: hidden;\n", "}\n", "div.nbext-readme > .nbext-readme-contents:not(:empty) {\n", " margin-top: 0.5em;\n", " margin-bottom: 2em;\n", " border: none;\n", " border-top-color: rgba(180,180,180,.30);\n", "}\n", ".nbext-showhide-incompat {\n", " padding-bottom: 0.5em;\n", " color: #4a4a4a;\n", " font-size: 12.0pt;\n", "}\n", ".shortcut_key,\n", "span.shortcut_key {\n", " display: inline-block;\n", " width: 16ex;\n", " text-align: right;\n", " font-family: monospace;\n", "}\n", "mark,\n", ".mark {\n", " background-color: #ffffff;\n", " color: #353535;\n", " padding: .15em;\n", "}\n", "a.text-warning,\n", "a.text-warning:hover {\n", " color: #aaaaaa;\n", "}\n", "a.text-warning.bg-warning {\n", " background-color: #ffffff;\n", "}\n", "span.bg-success.text-success {\n", " background-color: transparent;\n", " color: #009e07;\n", "}\n", "span.bg-danger.text-danger {\n", " background-color: #ffffff;\n", " color: #de143d;\n", "}\n", ".has-success .input-group-addon {\n", " color: #009e07;\n", " border-color: transparent;\n", " background: inherit;\n", " background-color: rgba(83,180,115,.10);\n", "}\n", ".has-success .form-control {\n", " border-color: #009e07;\n", " -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.025);\n", " box-shadow: inset 0 1px 1px rgba(0,0,0,0.025);\n", "}\n", ".has-error .input-group-addon {\n", " color: #de143d;\n", " border-color: transparent;\n", " background: inherit;\n", " background-color: rgba(192,57,67,.10);\n", "}\n", ".has-error .form-control {\n", " border-color: #de143d;\n", " -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,0.025);\n", " box-shadow: inset 0 1px 1px rgba(0,0,0,0.025);\n", "}\n", ".kse-input-group-pretty > kbd {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " color: #303030;\n", " font-weight: normal;\n", " background: transparent;\n", "}\n", ".kse-input-group-pretty > kbd {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " color: #303030;\n", " font-weight: normal;\n", " background: transparent;\n", "}\n", "div.nbext-enable-btns .btn[disabled],\n", "div.nbext-enable-btns .btn[disabled]:hover,\n", ".btn-default.disabled,\n", ".btn-default[disabled] {\n", " background: #e8e8e8;\n", " background-color: #e8e8e8;\n", " color: #282828;\n", "}\n", "label#Keyword-Filter {\n", " display: none;\n", "}\n", ".nav-pills > li.active > a,\n", ".nav-pills > li.active > a:hover,\n", ".nav-pills > li.active > a:focus {\n", " color: #ffffff;\n", " background-color: #126dce;\n", "}\n", ".input-group .nbext-list-btn-add,\n", ".input-group-btn:last-child > .btn-group > .btn {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border-color: #eeeeee;\n", "}\n", ".input-group .nbext-list-btn-add:hover,\n", ".input-group-btn:last-child > .btn-group > .btn:hover {\n", " background: #e9e9e9;\n", " background-color: #e9e9e9;\n", " border-color: #e9e9e9;\n", "}\n", "#notebook-container > div.cell.code_cell.rendered.selected > div.widget-area > div.widget-subarea > div > div.widget_item.btn-group > button.btn.btn-default.dropdown-toggle.widget-combo-carrot-btn {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border-color: #eeeeee;\n", "}\n", "#notebook-container > div.cell.code_cell.rendered.selected > div.widget-area > div.widget-subarea > div > div.widget_item.btn-group > button.btn.btn-default.dropdown-toggle.widget-combo-carrot-btn:hover {\n", " background: #e9e9e9;\n", " background-color: #e9e9e9;\n", " border-color: #e9e9e9;\n", "}\n", "input.raw_input {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt !important;\n", " color: #303030;\n", " background-color: #efefef;\n", " border-color: #ececec;\n", " background: #ececec;\n", " width: auto;\n", " vertical-align: baseline;\n", " padding: 0em 0.25em;\n", " margin: 0em 0.25em;\n", " -webkit-box-shadow: none;\n", " box-shadow: none;\n", "}\n", "audio,\n", "video {\n", " display: inline;\n", " vertical-align: middle;\n", " align-content: center;\n", " margin-left: 20%;\n", "}\n", ".cmd-palette .modal-body {\n", " padding: 0px;\n", " margin: 0px;\n", "}\n", ".cmd-palette form {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", "}\n", ".typeahead-field input:last-child,\n", ".typeahead-hint {\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " z-index: 1;\n", "}\n", ".typeahead-field input {\n", " font-family: \"Exo_2\", sans-serif;\n", " color: #303030;\n", " border: none;\n", " font-size: 28pt;\n", " display: inline-block;\n", " line-height: inherit;\n", " padding: 3px 10px;\n", " height: 70px;\n", "}\n", ".typeahead-select {\n", " background-color: #eeeeee;\n", "}\n", "body > div.modal.cmd-palette.typeahead-field {\n", " display: table;\n", " border-collapse: separate;\n", " background-color: #fafafa;\n", "}\n", ".typeahead-container button {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 28pt;\n", " background-color: #d0d0d0;\n", " border: none;\n", " display: inline-block;\n", " line-height: inherit;\n", " padding: 3px 10px;\n", " height: 70px;\n", "}\n", ".typeahead-search-icon {\n", " min-width: 40px;\n", " min-height: 55px;\n", " display: block;\n", " vertical-align: middle;\n", " text-align: center;\n", "}\n", ".typeahead-container button:focus,\n", ".typeahead-container button:hover {\n", " color: #2f2f2f;\n", " background-color: #ff7823;\n", " border-color: #ff7823;\n", "}\n", ".typeahead-list > li.typeahead-group.active > a,\n", ".typeahead-list > li.typeahead-group > a,\n", ".typeahead-list > li.typeahead-group > a:focus,\n", ".typeahead-list > li.typeahead-group > a:hover {\n", " display: none;\n", "}\n", ".typeahead-dropdown > li > a,\n", ".typeahead-list > li > a {\n", " color: #303030;\n", " text-decoration: none;\n", "}\n", ".typeahead-dropdown,\n", ".typeahead-list {\n", " font-family: \"Exo_2\", sans-serif;\n", " font-size: 13pt;\n", " color: #303030;\n", " background-color: #ffffff;\n", " border: none;\n", " background-clip: padding-box;\n", " margin-top: 0px;\n", " padding: 3px 2px 3px 0px;\n", " line-height: 1.7;\n", "}\n", ".typeahead-dropdown > li.active > a,\n", ".typeahead-dropdown > li > a:focus,\n", ".typeahead-dropdown > li > a:hover,\n", ".typeahead-list > li.active > a,\n", ".typeahead-list > li > a:focus,\n", ".typeahead-list > li > a:hover {\n", " color: #2f2f2f;\n", " background-color: #fafafa;\n", " border-color: #fafafa;\n", "}\n", ".command-shortcut:before {\n", " content: \"(command)\";\n", " padding-right: 3px;\n", " color: #aaaaaa;\n", "}\n", ".edit-shortcut:before {\n", " content: \"(edit)\";\n", " padding-right: 3px;\n", " color: #aaaaaa;\n", "}\n", "ul.typeahead-list i {\n", " margin-left: 1px;\n", " width: 18px;\n", " margin-right: 10px;\n", "}\n", "ul.typeahead-list {\n", " max-height: 50vh;\n", " overflow: auto;\n", "}\n", ".typeahead-list > li {\n", " position: relative;\n", " border: none;\n", "}\n", "div.input.typeahead-hint,\n", "input.typeahead-hint,\n", "body > div.modal.cmd-palette.in > div > div > div > form > div > div.typeahead-field > span.typeahead-query > input.typeahead-hint {\n", " color: #aaaaaa !important;\n", " background-color: transparent;\n", " padding: 3px 10px;\n", "}\n", ".typeahead-dropdown > li > a,\n", ".typeahead-list > li > a {\n", " display: block;\n", " padding: 5px;\n", " clear: both;\n", " font-weight: 400;\n", " line-height: 1.7;\n", " border: 1px solid #ffffff;\n", " border-bottom-color: rgba(180,180,180,.30);\n", "}\n", "body > div.modal.cmd-palette.in > div {\n", " min-width: 750px;\n", " margin: 150px auto;\n", "}\n", ".typeahead-container strong {\n", " font-weight: bolder;\n", " color: #ff7823;\n", "}\n", "#find-and-replace #replace-preview .match,\n", "#find-and-replace #replace-preview .insert {\n", " color: #ffffff;\n", " background-color: #ff7823;\n", " border-color: #ff7823;\n", " border-style: solid;\n", " border-width: 1px;\n", " border-radius: 0px;\n", "}\n", "#find-and-replace #replace-preview .replace .match {\n", " background-color: #de143d;\n", " border-color: #de143d;\n", " border-radius: 0px;\n", "}\n", "#find-and-replace #replace-preview .replace .insert {\n", " background-color: #009e07;\n", " border-color: #009e07;\n", " border-radius: 0px;\n", "}\n", "div.CodeMirror,\n", "div.CodeMirror pre {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt;\n", " line-height: 170%;\n", " color: #303030;\n", "}\n", "div.CodeMirror-lines {\n", " padding-bottom: .6em;\n", " padding-left: .5em;\n", " padding-right: 1.5em;\n", " padding-top: 4px;\n", "}\n", "span.ansiblack {\n", " color: #dc4384;\n", "}\n", "span.ansiblue {\n", " color: #009e07;\n", "}\n", "span.ansigray {\n", " color: #ff7823;\n", "}\n", "span.ansigreen {\n", " color: #333333;\n", "}\n", "span.ansipurple {\n", " color: #653bc5;\n", "}\n", "span.ansicyan {\n", " color: #055be0;\n", "}\n", "span.ansiyellow {\n", " color: #ff7823;\n", "}\n", "span.ansired {\n", " color: #de143d;\n", "}\n", "div.output-stderr {\n", " background-color: #ebb5b7;\n", "}\n", "div.output-stderr pre {\n", " color: #000000;\n", "}\n", "div.js-error {\n", " color: #de143d;\n", "}\n", ".ipython_tooltip {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt;\n", " line-height: 170%;\n", " border: 2px solid #dadada;\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " border-radius: 2px;\n", " overflow-x: visible;\n", " overflow-y: visible;\n", " box-shadow: none;\n", " position: absolute;\n", " z-index: 1000;\n", "}\n", ".ipython_tooltip .tooltiptext pre {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt;\n", " line-height: 170%;\n", " background: #eeeeee;\n", " background-color: #eeeeee;\n", " color: #303030;\n", " overflow-x: visible;\n", " overflow-y: visible;\n", " max-width: 900px;\n", "}\n", "div#tooltip.ipython_tooltip {\n", " overflow-x: wrap;\n", " overflow-y: visible;\n", " max-width: 800px;\n", "}\n", "div.tooltiptext.bigtooltip {\n", " overflow-x: visible;\n", " overflow-y: scroll;\n", " height: 400px;\n", " max-width: 800px;\n", "}\n", ".cm-s-ipython.CodeMirror {\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt;\n", " background: #efefef;\n", " color: #303030;\n", " border-radius: 2px;\n", " font-style: normal;\n", " font-weight: normal;\n", "}\n", ".cm-s-ipython div.CodeMirror-selected {\n", " background: #e0e1e3;\n", "}\n", ".cm-s-ipython .CodeMirror-gutters {\n", " background: #e0e1e3;\n", " border: none;\n", " border-radius: 0px;\n", "}\n", ".cm-s-ipython .CodeMirror-linenumber {\n", " color: #aaaaaa;\n", "}\n", ".cm-s-ipython .CodeMirror-cursor {\n", " border-left: 2px solid #ff711a;\n", "}\n", ".cm-s-ipython span.cm-comment {\n", " color: #8d8d8d;\n", " font-style: italic;\n", "}\n", ".cm-s-ipython span.cm-atom {\n", " color: #055be0;\n", "}\n", ".cm-s-ipython span.cm-number {\n", " color: #ff8132;\n", "}\n", ".cm-s-ipython span.cm-property {\n", " color: #e22978;\n", "}\n", ".cm-s-ipython span.cm-attribute {\n", " color: #de143d;\n", "}\n", ".cm-s-ipython span.cm-keyword {\n", " color: #713bc5;\n", " font-weight: normal;\n", "}\n", ".cm-s-ipython span.cm-string {\n", " color: #009e07;\n", "}\n", ".cm-s-ipython span.cm-meta {\n", " color: #aa22ff;\n", "}\n", ".cm-s-ipython span.cm-operator {\n", " color: #055be0;\n", "}\n", ".cm-s-ipython span.cm-builtin {\n", " color: #e22978;\n", "}\n", ".cm-s-ipython span.cm-variable {\n", " color: #303030;\n", "}\n", ".cm-s-ipython span.cm-variable-2 {\n", " color: #de143d;\n", "}\n", ".cm-s-ipython span.cm-variable-3 {\n", " color: #aa22ff;\n", "}\n", ".cm-s-ipython span.cm-def {\n", " color: #e22978;\n", " font-weight: normal;\n", "}\n", ".cm-s-ipython span.cm-error {\n", " background: rgba(191,97,106,.40);\n", "}\n", ".cm-s-ipython span.cm-tag {\n", " color: #e22978;\n", "}\n", ".cm-s-ipython span.cm-link {\n", " color: #ff7823;\n", "}\n", ".cm-s-ipython span.cm-storage {\n", " color: #055be0;\n", "}\n", ".cm-s-ipython span.cm-entity {\n", " color: #e22978;\n", "}\n", ".cm-s-ipython span.cm-quote {\n", " color: #009e07;\n", "}\n", "div.CodeMirror span.CodeMirror-matchingbracket {\n", " color: #1c1c1c;\n", " background-color: rgba(30,112,199,.30);\n", "}\n", "div.CodeMirror span.CodeMirror-nonmatchingbracket {\n", " color: #1c1c1c;\n", " background: rgba(191,97,106,.40) !important;\n", "}\n", "div.cell.text_cell .cm-s-default .cm-header {\n", " color: #126dce;\n", "}\n", "div.cell.text_cell .cm-s-default span.cm-variable-2 {\n", " color: #353535;\n", "}\n", "div.cell.text_cell .cm-s-default span.cm-variable-3 {\n", " color: #aa22ff;\n", "}\n", ".cm-s-default span.cm-comment {\n", " color: #8d8d8d;\n", "}\n", ".cm-s-default .cm-tag {\n", " color: #009fb7;\n", "}\n", ".cm-s-default .cm-builtin {\n", " color: #e22978;\n", "}\n", ".cm-s-default .cm-string {\n", " color: #009e07;\n", "}\n", ".cm-s-default .cm-keyword {\n", " color: #713bc5;\n", "}\n", ".cm-s-default .cm-number {\n", " color: #ff8132;\n", "}\n", ".cm-s-default .cm-error {\n", " color: #055be0;\n", "}\n", ".CodeMirror-cursor {\n", " border-left: 2px solid #ff711a;\n", " border-right: none;\n", " width: 0;\n", "}\n", ".cm-s-default div.CodeMirror-selected {\n", " background: #e0e1e3;\n", "}\n", ".cm-s-default .cm-selected {\n", " background: #e0e1e3;\n", "}\n", ".completions {\n", " position: absolute;\n", " z-index: 110;\n", " overflow: hidden;\n", " border: medium solid #ff7823;\n", " line-height: 1;\n", "}\n", ".completions select {\n", " background: #efefef;\n", " outline: none;\n", " border: none;\n", " padding: 0px;\n", " margin: 0px;\n", " overflow: auto;\n", " font-family: \"Droid Sans Mono\", monospace;\n", " font-size: 11pt;\n", " color: #303030;\n", " width: auto;\n", "}\n", "/**\n", "div#maintoolbar {\n", "# display: none !important;\n", "#}\n", "##header-container {\n", "# display: none !important;\n", "#}\n", "**/\n", "\n", "\n", "/**********************************\n", " MathJax Settings and Style Script\n", "**********************************/\n", ".MathJax_Display,\n", ".MathJax nobr>span.math>span {\n", " border: 0 !important;\n", " font-size: 110% !important;\n", " text-align: center !important;\n", " margin: 0em !important;\n", "}\n", "/* Prevents MathJax from jittering */\n", "/* cell position when cell is selected */\n", ".MathJax:focus, body :focus .MathJax {\n", " display: inline-block !important;\n", "}\n", "\n", "</style>\n", "\n", "\n", "<script>\n", " MathJax.Hub.Config({\n", " \"HTML-CSS\": {\n", " preferredFont: \"TeX\",\n", " availableFonts: [\"STIX\",\"TeX\"],\n", " styles: {\n", " scale: 110,\n", " \".MathJax_Display\": {\n", " \"font-size\": \"110%\",\n", " }\n", " }\n", " }\n", "});\n", "\n", "$([IPython.events]).on('notebook_loaded.Notebook',function(){\n", " $('#header').hide();\n", " IPython.keyboard_manager.command_shortcuts.add_shortcut('ctrl-`',function (event) {\n", " if (IPython.notebook.mode == 'command') {\n", " $('#header').toggle();\n", " return false;\n", " }\n", " return true;\n", " });\n", "});\n", "\n", "</script>\n", "\n" ], "text/plain": [ "<IPython.core.display.HTML object>" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#\n", "from IPython.core.display import HTML\n", "HTML(open('../custom.css').read())" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 1 }