{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport numpy as np\nimport cv2\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Extracting data from zip files**","metadata":{}},{"cell_type":"code","source":"import zipfile\nimport glob\n\nfiles_zip_ext = glob.glob('/kaggle/input/dogs-vs-cats/*.zip')\nprint(files_zip_ext)\ndef extract_data_from_zip(file_path):\n    with zipfile.ZipFile(file_path, \"r\") as zip_ref:\n        zip_ref.extractall(\"/kaggle/temp/data\")\n\n# Extract train and test\nfor file_path in files_zip_ext:\n    extract_data_from_zip(file_path)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(f\"Train size: {len(os.listdir('/kaggle/temp/data/train'))}\")\nprint(f\"Test size: {len(os.listdir('/kaggle/temp/data/test1'))}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Generate labels and adding file names to path**","metadata":{}},{"cell_type":"code","source":"os.chdir('/kaggle/temp/data')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_y = (lambda dir_: [1 if file.split('.')[0] == 'dog' else 0 for file in os.listdir(dir_)])('train')\n\ngen_path = lambda dir_: [path for path in os.listdir(dir_)]\ntrain_x = gen_path('train')\ntest_x = gen_path('test1')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.DataFrame({'filename': train_x,\n                    'category': train_y})\n\nprint(df.tail())\n\nsns.displot(df, x='category')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Visualization of first image**","metadata":{}},{"cell_type":"code","source":"def visualize(img_path):\n    img = mpimg.imread(img_path) \n\n    # Displaying the image \n    plt.figure(figsize=(8,8))\n\n    plt.imshow(img)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"visualize(f\"train/{df['filename'].iloc[0]}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Preprocessing image**","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"# Convert to gray\ndef preprocess(img_path):\n    gray = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)\n    \n    # resize the images\n    size = 28\n    gray = cv2.resize(gray, (size, size))\n    \n    # normalize\n    normalized = gray.flatten() / 255.0\n    \n    # global centering\n    mean = normalized.mean()\n    centered = normalized - mean\n    \n    return centered.reshape(1, size*size)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nfrom sklearn import linear_model\nfrom sklearn.metrics import confusion_matrix\nfrom sklearn.metrics import classification_report","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train, X_test, y_train, y_test = train_test_split(train_x, train_y, test_size=0.2, random_state=42)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" sgd_clf = linear_model.SGDClassifier()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Generate batches with preprocessing\n# X -> list of file paths and y -> (0 - dog, 1 - cat)\n\ndef gen_batches(X, y=None, batch_size=200, image_size=784):\n    batch = []\n    for i, x in enumerate(X, start=1):\n        img = preprocess(x)\n        batch.append(img)\n        if i % batch_size == 0:\n            data = np.asarray(batch).reshape(batch_size, image_size)\n            if y:\n                targets = y[i-batch_size:i]\n                yield data, targets\n            else:\n                yield data\n            batch = []","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Training\nos.chdir('/kaggle/temp/data/train/')\n\ncategories = np.unique(y_train)\nfor b in gen_batches(X_train, y_train):\n    sgd_clf.partial_fit(b[0], b[1], classes=categories)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Predict 205 image in training set\nimg_path = df['filename'].iloc[205]\nvisualize(img_path)\n\npred = sgd_clf.predict(preprocess(img_path))\nprint(f\"It thinks it's a {'dog' if pred[0] == 0 else 'cat'}\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def display_metrics(y_test, y_predicted):\n    # Predict on validation set\n    target_names = ['Dog', 'Cat']\n    outcome = pd.DataFrame(confusion_matrix(y_test, y_predicted),index=target_names,\n                           columns=target_names)\n    \n    print(\"CONFUSION MATRIX\")\n    print(outcome)\n    \n    report = classification_report(y_test, y_predicted, target_names=target_names)\n    print(\"CLASSIFICATION REPORT\")\n    print(report)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Metrics for SGDClassifier\ny_predicted = np.asarray([sgd_clf.predict(b) for b in gen_batches(X_test)]).flatten()\ndisplay_metrics(y_test, y_predicted)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **Try LGBM model**","metadata":{}},{"cell_type":"code","source":"from lightgbm import LGBMClassifier","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgb = LGBMClassifier(objective='binary', boosting='gbdt')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train_full = np.asarray([preprocess(img) for img in X_train]).reshape(len(X_train), 784)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test_full = np.asarray([preprocess(img) for img in X_test]).reshape(len(X_test), 784)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgb.fit(X_train_full, y_train)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_predicted = lgb.predict(X_test_full)\ndisplay_metrics(y_test, y_predicted)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"# Make submission","metadata":{}},{"cell_type":"code","source":"os.chdir('/kaggle/temp/data/test1')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.getcwd()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test = np.asarray([preprocess(img) for img in test_x]).reshape(len(test_x), 784)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"categories = lgb.predict(test)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# change directory to top level\nos.chdir('/kaggle/working/')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({'id': ind+1, 'label': cat} for ind, cat in enumerate(categories))\nsubmission.to_csv('submission.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Dump model","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"import lightgbm\nlightgbm.__version__","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from joblib import dump, load","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dump(lgb, 'lgb_model.mdl')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lgbm_load = load('lgb_model.mdl')","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}