Skip to content

Instantly share code, notes, and snippets.

@spidezad
Created May 29, 2019 06:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save spidezad/bf3e90553ffe0ad7a10ffafa80e7c28b to your computer and use it in GitHub Desktop.
Save spidezad/bf3e90553ffe0ad7a10ffafa80e7c28b to your computer and use it in GitHub Desktop.
Part2_MobileDataset.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "import pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport os, sys, datetime, re\nfrom functools import partial\n\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.compose import ColumnTransformer\nfrom sklearn.preprocessing import OneHotEncoder, FunctionTransformer,LabelEncoder\nfrom sklearn.model_selection import train_test_split, GridSearchCV\nfrom sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\nfrom sklearn.metrics import accuracy_score, confusion_matrix\nfrom sklearn.metrics import classification_report\n\nfrom sklearn.linear_model import SGDClassifier\nfrom sklearn.pipeline import Pipeline, FeatureUnion\nfrom sklearn.feature_extraction.text import TfidfTransformer\n\nimport matplotlib.pyplot as plt",
"execution_count": 3,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# New Text Preprocessing/Cleaning Function"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Text pre-processing modules\nfrom bs4 import BeautifulSoup\nimport unidecode\nimport spacy, en_core_web_sm\nnlp = spacy.load('en_core_web_sm', disable=['parser', 'ner']) \nfrom nltk.corpus import stopwords \nfrom nltk.tokenize import word_tokenize\nfrom nltk.stem import PorterStemmer\nSTOPWORDS = set(stopwords.words('english')) \n\n# Compile regular expression\nSPEC_CHARS_REPLACE_BY_SPACE = re.compile('[/(){}\\[\\]\\|@,;]')\nSPEC_CHARS = re.compile(r'[^a-zA-z0-9\\s]')\nSPEC_CHARS_INCLUDE_DIGITS = re.compile(r'[^a-zA-z\\s]')\nEXTRA_NEWLINES = re.compile(r'[\\r|\\n|\\r\\n]+')\n\n\n## Functions for text preprocessing, cleaning\n\ndef strip_htmltags(text):\n soup = BeautifulSoup(text,\"lxml\")\n return soup.get_text()\n\ndef replace_accented_chars(text):\n return unidecode.unidecode(text)\n\ndef stem_text(text):\n ps = PorterStemmer()\n modified_txt = ' '.join([ps.stem(word) for word in text.split()])\n return modified_txt \n\ndef lemmatize(text):\n modified_text = nlp(text)\n return ' '.join([word.lemma_ if word.lemma_ != '-PRON-' else word.text for word in modified_text])\n\ndef normalize(text, method='stem'):\n \"\"\" Text normalization to generate the root form of the inflected words.\n This is done by either \"stem\" or \"lemmatize\" the text as defined by the 'method' arguments. \n Note that using \"lemmatize\" will take much longer to run compared to \"stem\".\n \"\"\"\n if method == 'stem':\n return stem_text(text)\n if method == 'lemmatize':\n return lemmatize(text)\n print('Please choose either \"stem\" or \"lemmatize\" method to normalize.')\n return text\n\ndef rm_special_chars(text, rm_digits=False):\n # remove & replace below special chars with space\n modified_txt = SPEC_CHARS_REPLACE_BY_SPACE.sub(' ', text)\n \n # remove rest of special chars, no replacing with space\n if rm_digits:\n return SPEC_CHARS_INCLUDE_DIGITS.sub('', modified_txt)\n else:\n return SPEC_CHARS.sub('', modified_txt)\n\ndef rm_extra_newlines_and_whitespace(text):\n # rm extra newlines\n modified_txt = EXTRA_NEWLINES.sub(' ', text)\n \n # rm extra whitespaces\n return re.sub(r'\\s+', ' ', modified_txt)\n\ndef rm_stopwords(text, simple=True):\n \"\"\" Remove stopwords using either the simple model with replacement.\n or using nltk.tokenize to split the words and replace each words. This will incur speed penalty.\n \"\"\"\n if simple:\n return ' '.join(word for word in text.split() if word not in STOPWORDS)\n else:\n tokens = word_tokenize(text)\n tokens = [token.strip() for token in tokens]\n return ' '.join(word for word in tokens if word not in STOPWORDS)\n\n\ndef clean_text(raw_text, strip_html = True, replace_accented = True,\n normalize_text = True, normalize_methd = 'stem',\n remove_special_chars = True, remove_digits = True,\n remove_stopwords = True, rm_stopwords_simple_mode = True):\n\n \"\"\" The combined function for all the various preprocessing method. \n Keyword args:\n strip_html : Remove html tags.\n replace_accented : Convert accented characters to closest English characters.\n normalize_text : Normalize text based on normalize_methd.\n normalize_methd : \"stem\" or \"lemmatize\". Default \"stem\".\n remove_special_chars : Remove special chars.\n remove_digits : Remove digits/numeric as special characters.\n remove_stopwords : Stopwords removal basedon NLTK corpus.\n rm_stopwords_simple_mode : skip tokenize before stopword removal. Speed up time.\n \"\"\"\n \n text = raw_text.lower()\n \n if strip_html:\n text = strip_htmltags(text)\n if replace_accented:\n text = replace_accented_chars(text)\n if remove_special_chars:\n text = rm_special_chars(text, remove_digits) \n if normalize_text:\n text = normalize(text, normalize_methd)\n if remove_stopwords:\n text = rm_stopwords(text, rm_stopwords_simple_mode)\n \n text = rm_extra_newlines_and_whitespace(text) \n \n return text",
"execution_count": 4,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Import Data and basic processing on dataset"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "fname = 'mobile_data_info_train_competition.csv'\ndf = pd.read_csv(fname)\n\n# replace nan with best value based on exploration\ndf['Warranty Period'] = df['Warranty Period'].fillna(df['Warranty Period'].mode()[0])\ndf['Operating System'] = df['Operating System'].fillna(df['Operating System'].mode()[0])\ndf['Network Connections'] = df['Network Connections'].fillna(df['Network Connections'].mode()[0])\n\n# Convert attributes to integer\nfor col in [ 'Operating System', 'Features','Network Connections', 'Memory RAM', 'Brand', 'Warranty Period',\\\n 'Storage Capacity', 'Color Family', 'Phone Model', 'Camera', 'Phone Screen Size']:\n df[col] = df[col].fillna(-1)\n df[col] = df[col].astype('int')\n df[col] = df[col].astype('str')\n df[col] = df[col].replace('-1', np.nan)\n\n# Apply the new clean text function\nclean_text_p = partial(clean_text, strip_html = False, remove_digits = False,\n normalize_text = False, normalize_methd = 'stem')\n\ndf['title1'] = df['title'].apply(clean_text_p)",
"execution_count": 5,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Pipelines, GridSearch and Attributes Classification"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# Prepare model -- Drop na and keep those with values\ndef get_X_Y_data(x_col, y_col):\n sub_df = df[[x_col, y_col]]\n sub_df.head()\n sub_df = sub_df.dropna()\n return sub_df[x_col], sub_df[y_col]\n\n\n# Model training & GridSearch\ndef generate_model(X, y, verbose = 1):\n \n text_vect_pipe = Pipeline([\n ('vect', CountVectorizer()),\n ('tfidf', TfidfTransformer())\n ])\n \n pred_model = Pipeline([\n ('process', text_vect_pipe),\n ('clf', SGDClassifier(loss='hinge', penalty='l2',alpha=1e-3, random_state=42, max_iter=5, tol=None))\n ])\n\n parameters = {}\n parameters['process__vect__ngram_range'] = [(0,1),(1,2),(1,3)]\n parameters['clf__loss'] = [\"hinge\"]\n parameters['clf__alpha'] = [5e-6,1e-5]\n \n X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state = 42)\n \n CV = GridSearchCV(pred_model, parameters)\n CV.fit(X_train, y_train)\n y_pred = CV.predict(X_test)\n \n print('accuracy %s' % accuracy_score(y_pred, y_test))\n print(\"==\"*18)\n print()\n print(\"Details of GridSearch\")\n \n \n if verbose:\n print('Best score and parameter combination = ')\n print(CV.best_score_) \n print(CV.best_params_) \n print()\n print(\"Grid scores on development set:\")\n means = CV.cv_results_['mean_test_score']\n stds = CV.cv_results_['std_test_score']\n for mean, std, params in zip(means, stds, CV.cv_results_['params']):\n print(\"%0.3f (+/-%0.03f) for %r\"\n % (mean, std * 2, params))\n print(\"==\"*18)\n print()\n \n return CV\n\n \nX, y = get_X_Y_data('title1', 'Brand')\nbrand_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Operating System')\nos_model = generate_model(X, y) \nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Network Connections')\nnetwork_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Warranty Period')\nwarranty_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Color Family')\ncolor_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Phone Model')\nphonemodel_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Storage Capacity')\nstorage_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Memory RAM')\nram_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Phone Screen Size')\nscreen_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Features')\nfeature_model = generate_model(X, y)\nprint('='*29)\n\nX, y = get_X_Y_data('title1', 'Camera')\ncamera_model = generate_model(X, y)\nprint('='*29)",
"execution_count": 6,
"outputs": [
{
"output_type": "stream",
"text": "accuracy 0.9886480908152735\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.987864659160017\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.987 (+/-0.000) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.988 (+/-0.000) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.988 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.987 (+/-0.000) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.988 (+/-0.001) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.988 (+/-0.001) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.968024283249132\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.966025429694113\n{'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.963 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.966 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.966 (+/-0.000) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.962 (+/-0.001) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.965 (+/-0.001) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.966 (+/-0.000) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.9748851327470426\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.9749712646238562\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.973 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.975 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.975 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.974 (+/-0.001) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.975 (+/-0.001) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.975 (+/-0.001) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.9515582444541466\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.9479377355632579\n{'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.944 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.947 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.948 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.943 (+/-0.000) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.947 (+/-0.000) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.948 (+/-0.001) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.8493123772102161\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.8413802394705377\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.819 (+/-0.007) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.835 (+/-0.005) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.837 (+/-0.005) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.825 (+/-0.005) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.839 (+/-0.005) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.841 (+/-0.003) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.9377194020431507\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.9354587869362364\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n\nGrid scores on development set:\n0.923 (+/-0.005) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.933 (+/-0.005) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.933 (+/-0.007) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.925 (+/-0.006) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.935 (+/-0.005) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.935 (+/-0.004) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.9486935866983373\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.9445311616332994\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.935 (+/-0.002) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.942 (+/-0.002) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.943 (+/-0.001) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.938 (+/-0.002) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.944 (+/-0.002) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.945 (+/-0.002) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.896505376344086\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.8902191609267376\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.864 (+/-0.007) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.887 (+/-0.003) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.887 (+/-0.004) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.870 (+/-0.003) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.890 (+/-0.002) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.890 (+/-0.004) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.7758181262106228\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.7447236180904523\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.695 (+/-0.013) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.733 (+/-0.014) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.737 (+/-0.009) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n",
"name": "stdout"
},
{
"output_type": "stream",
"text": "0.707 (+/-0.015) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.743 (+/-0.011) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.745 (+/-0.009) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.7784649271433413\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.7604299045060092\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.722 (+/-0.011) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.749 (+/-0.013) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.755 (+/-0.012) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.733 (+/-0.012) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.759 (+/-0.010) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.760 (+/-0.010) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\naccuracy 0.6807645384302562\n====================================\n\nDetails of GridSearch\nBest score and parameter combination = \n0.6684482658455818\n{'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n\nGrid scores on development set:\n0.621 (+/-0.007) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.655 (+/-0.004) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.654 (+/-0.013) for {'clf__alpha': 5e-06, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n0.630 (+/-0.014) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (0, 1)}\n0.663 (+/-0.006) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 2)}\n0.668 (+/-0.009) for {'clf__alpha': 1e-05, 'clf__loss': 'hinge', 'process__vect__ngram_range': (1, 3)}\n====================================\n\n=============================\n",
"name": "stdout"
}
]
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.4",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"gist": {
"id": "",
"data": {
"description": "Part2_MobileDataset.ipynb",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment