{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# Import the required libraries \nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.multiclass import OneVsRestClassifier\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.svm import SVC\nimport pandas as pd\nimport json\n\n# Dataset Preparation\nprint (\"Read Dataset ... \")\ndef read_dataset(path):\n    return json.load(open(path)) \ntrain = read_dataset('../input/train.json')\ntest = read_dataset('../input/test.json')\n\n# Text Data Features\nprint (\"Prepare text data of Train and Test ... \")\ndef generate_text(data):\n    text_data = [\" \".join(doc['ingredients']).lower() for doc in data]\n    return text_data \n\ntrain_text = generate_text(train)\ntest_text = generate_text(test)\ntarget = [doc['cuisine'] for doc in train]\n\n# Feature Engineering \nprint (\"TF-IDF on text data ... \")\ntfidf = TfidfVectorizer(binary=True)\ndef tfidf_features(txt, flag):\n    if flag == \"train\":\n        x = tfidf.fit_transform(txt)\n    else:\n        x = tfidf.transform(txt)\n    x = x.astype('float16')\n    return x \nX = tfidf_features(train_text, flag=\"train\")\nX_test = tfidf_features(test_text, flag=\"test\")\n\n# Label Encoding - Target \nprint (\"Label Encode the Target Variable ... \")\nlb = LabelEncoder()\ny = lb.fit_transform(target)\n\n# Model Training \nprint (\"Train the model ... \")\nclassifier = SVC(C=100, # penalty parameter\n                 kernel='rbf', # kernel type, rbf working fine here\n                 degree=3, # default value\n                 gamma=1, # kernel coefficient\n                 coef0=1, # change to 1 from default value of 0.0\n                 shrinking=True, # using shrinking heuristics\n                 tol=0.001, # stopping criterion tolerance \n                 probability=False, # no need to enable probability estimates\n                 cache_size=200, # 200 MB cache size\n                 class_weight=None, # all classes are treated equally \n                 verbose=False, # print the logs \n                 max_iter=-1, # no limit, let it run\n                 decision_function_shape=None, # will use one vs rest explicitly \n                 random_state=None)\nmodel = OneVsRestClassifier(classifier, n_jobs=4)\n\n## Model Tuning \n# parameters = {\"estimator__gamma\":[0.01, 0.5, 0.1, 2, 5]}\n# grid_search = GridSearchCV(model, param_grid=parameters)\n# grid_search.fit(X, y)\n# print grid_search.best_score_\n# print grid_search.best_params_\n####\n\nmodel.fit(X, y)\n\n# Predictions \nprint (\"Predict on test data ... \")\ny_test = model.predict(X_test)\ny_pred = lb.inverse_transform(y_test)\n\n# Submission\nprint (\"Generate Submission File ... \")\ntest_id = [doc['id'] for doc in test]\nsub = pd.DataFrame({'id': test_id, 'cuisine': y_pred}, columns=['id', 'cuisine'])\nsub.to_csv('svm_output.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"markdown","source":"# Links\n* https://www.kaggle.com/shivamb/tf-idf-with-ovr-svm-what-s-cooking\n* https://www.kaggle.com/c/whats-cooking-kernels-only/discussion/60881"}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}