{"cells":[{"metadata":{"trusted":false,"_uuid":"2da094c64655a3647e13e0551b031e7e91515dbf"},"cell_type":"code","source":"import pandas as pd\nimport re\nimport nltk\nfrom nltk.stem import PorterStemmer\nfrom nltk.stem import SnowballStemmer\nfrom nltk.stem import WordNetLemmatizer\nfrom sklearn.multiclass import OneVsRestClassifier\nnltk.download('wordnet')","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"8d20cf58e35dc868cc5b178b1fd283896551325a"},"cell_type":"code","source":"def char_preprocess_ingredients(ingredient):\n    ingredient = ingredient.lower() #Kleinschreibung anwenden\n    ingredient = re.sub(\"[^a-zA-Z] \",\"\",ingredient) #Sonderzeichen und Zahlen entfernen\n    ingredient = re.sub((r'\\b(oz|ounc|ounce|pound|lb|inch|inches|kg|to)\\b'), ' ', ingredient) #Gewichtseinheiten entfernen\n    ingredient = re.sub(r'\\s+', ' ', ingredient) #Doppelte Lerrzeichen entfernen\n    ingredient = \" \".join(ingredient.split())\n    return ingredient","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"683ddbf86c31807d0b3a50ebe8fd952ca1d9e9cd"},"cell_type":"code","source":"def porter_stem_ingredients(ingredient):\n    porter_stemmer = PorterStemmer()\n    tokens = ingredient.split()\n    stemmed_tokens = [porter_stemmer.stem(token) for token in tokens]\n    ingredient = ' '.join(stemmed_tokens)\n    return ingredient","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"168ab6684341da09b6649b6c02ea9619ef55ee27"},"cell_type":"code","source":"def snowball_stem_ingredients(ingredient):\n    snowball_stemmer = SnowballStemmer('english')\n    tokens = ingredient.split()\n    stemmed_tokens = [snowball_stemmer.stem(token) for token in tokens]\n    ingredient = ' '.join(stemmed_tokens)\n    return ingredient","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"bdcb7e87c4acd46f46f9601dd95e94635e46f541"},"cell_type":"code","source":"def wordnet_lemmatizer_ingredients(ingredient):\n    lemmatizer = WordNetLemmatizer()\n    tokens = ingredient.split()\n    lemmatized_tokens = [lemmatizer.lemmatize(token) for token in tokens]\n    ingredient = ' '.join(lemmatized_tokens)\n    return ingredient","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"6025d2538b22085a3e6aaea9e80c7bce9aedfacd"},"cell_type":"code","source":"def main_preprocessing(ingredient):\n    ingredient = char_preprocess_ingredients(ingredient)\n    ingredient = wordnet_lemmatizer_ingredients(ingredient)\n    ingredient = snowball_stem_ingredients(ingredient)\n    ingredient = porter_stem_ingredients(ingredient)\n    return ingredient","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"1bf7b47ee0c6d7ff9c208b9198a654516ad53f1a"},"cell_type":"code","source":"import warnings\nwarnings.filterwarnings('ignore')\n\ndf_train = pd.read_json('../input/train.json')\n\ndf_train['ingredients'] = df_train['ingredients'].apply(lambda x : [main_preprocessing(y) for y in x])\ndf_train['all_ingredients'] = df_train['ingredients'].map(\";\".join)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"f167c45bf9a19c0b9b90b460c343086da6376be3"},"cell_type":"code","source":"from sklearn.feature_extraction.text import CountVectorizer\nvectorizer = CountVectorizer(analyzer = \"word\", \n    ngram_range = (1,1),\n    binary = True,\n    tokenizer = None,    \n    preprocessor = None, \n    stop_words = None,  \n    max_df = 0.99)\nX = vectorizer.fit_transform(df_train['all_ingredients'].values)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"d1d1a9861abb7c075299c519268eec576aa2662d"},"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nenc = LabelEncoder()\ny = enc.fit_transform(df_train.cuisine)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"0029d2b993f04e19f681eb213ce4b743f2b9e8c1"},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6f67f12ce89573367db000b297701465f9bfe53d"},"cell_type":"markdown","source":"###### LogisticRegression"},{"metadata":{"scrolled":true,"trusted":false,"_uuid":"99d3623e17c0b78a72d2c8d514c816ce70e422ae"},"cell_type":"code","source":"from sklearn.linear_model import LogisticRegression\nlogistic = LogisticRegression(C=1, class_weight=None, dual=False, fit_intercept=True,\n          intercept_scaling=1, max_iter=100, multi_class='warn',\n          n_jobs=None, penalty='l2', random_state=1, solver='warn',\n          tol=0.1, verbose=0, warm_start=False)\nlogistic.fit(X_train, y_train)\nprint('Accuracy: %.5f' % logistic.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"63264c53e84062ac673e8fc516ae720f00b4699f"},"cell_type":"code","source":"ovrLR = OneVsRestClassifier(estimator=logistic, n_jobs=1)\novrLR.fit(X_train, y_train)\nprint('Accuracy: %.5f' % ovrLR.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"f6de3a9d7a8f4ce5d304186cd74da0064aaeb239"},"cell_type":"markdown","source":"##### LinearSVC"},{"metadata":{"trusted":false,"_uuid":"92ca27b2713228ee1c01c93ea804a6bf22a135bc"},"cell_type":"code","source":"from sklearn.svm import LinearSVC\nlsvc = LinearSVC(C=0.2, class_weight=None, dual=True, fit_intercept=True,\n     intercept_scaling=1, loss='squared_hinge', max_iter=100,\n     multi_class='ovr', penalty='l2', random_state=1, tol=0.0001,\n     verbose=0)\nlsvc.fit(X_train, y_train)\nprint('Accuracy: %.5f' % lsvc.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"493bc681ee20578def621e016b8c7db587a11da1"},"cell_type":"code","source":"ovrLSVC = OneVsRestClassifier(estimator=lsvc, n_jobs=1)\novrLSVC.fit(X_train, y_train)\nprint('Accuracy: %.5f' % ovrLSVC.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"522f4d53f13e0d34cd1c0b10cd140635d4cb7062"},"cell_type":"markdown","source":"##### ExtraTreesClassifier"},{"metadata":{"trusted":false,"_uuid":"d78b0c6e7b31f6aa9aec4550813bc9839a84588d"},"cell_type":"code","source":"from sklearn.ensemble import ExtraTreesClassifier\netc = ExtraTreesClassifier(bootstrap=False, class_weight=None, criterion='gini',\n           max_depth=None, max_features=0.25, max_leaf_nodes=None,\n           min_impurity_decrease=0.0, min_impurity_split=None,\n           min_samples_leaf=1, min_samples_split=2,\n           min_weight_fraction_leaf=0.0, n_estimators=400, n_jobs=None,\n           oob_score=False, random_state=1, verbose=0, warm_start=False)\netc.fit(X_train, y_train)\nprint('Accuracy: %.5f' % etc.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"d891a15493cab96a38ffe97439cb2b208e8759c1"},"cell_type":"code","source":"ovrETC = OneVsRestClassifier(estimator=etc, n_jobs=1)\novrETC.fit(X_train, y_train)\nprint('Accuracy: %.5f' % ovrETC.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"acc6676812d2c32d221ab1497f31b24e3f2ff1ea"},"cell_type":"markdown","source":"##### MLPClassifier"},{"metadata":{"trusted":false,"_uuid":"64037ec83c5147a305178998a42545562e028ecb"},"cell_type":"code","source":"from sklearn.neural_network import MLPClassifier\nmlp = MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,\n       beta_2=0.999, early_stopping=False, epsilon=1e-08,\n       hidden_layer_sizes=(100, 100), learning_rate='constant',\n       learning_rate_init=0.001, max_iter=200, momentum=0.9,\n       n_iter_no_change=10, nesterovs_momentum=True, power_t=0.5,\n       random_state=1, shuffle=True, solver='adam', tol=0.0001,\n       validation_fraction=0.1, verbose=False, warm_start=False)\nmlp.fit(X_train, y_train)\nprint('Accuracy: %.5f' % mlp.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"b90cf8690cf91bd1deb3d71bde1013747468f492"},"cell_type":"code","source":"ovrMLP = OneVsRestClassifier(estimator=mlp, n_jobs=1)\novrMLP.fit(X_train, y_train)\nprint('Accuracy: %.5f' % ovrMLP.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"a8bff5a6d092ba5c789570797b930d08a2b401c5"},"cell_type":"markdown","source":"#### VotingClassifier"},{"metadata":{"trusted":false,"_uuid":"bc8ac58383246259a9e840b867a3d8317a44e5c8"},"cell_type":"code","source":"from sklearn.ensemble import VotingClassifier\nvc = VotingClassifier(n_jobs=1, estimators=[\n    ('clf1', ovrMLP),\n    ('clf2', ovrETC),\n    ('clf3', ovrLSVC),\n    ('clf4', ovrLR)\n])\nvc.fit(X_train, y_train)\nprint('Accuracy: %.5f' % vc.score(X_test, y_test))","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"e7edcde293ee768cde943b763a58a210ef163d6c"},"cell_type":"code","source":"df_test = pd.read_json('../input/test.json')\ndf_test['ingredients'] = df_test['ingredients'].apply(lambda x : [main_preprocessing(y) for y in x])\ndf_test['all_ingredients'] = df_test['ingredients'].map(\";\".join)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"f32501dfd615c9c51773dbaa74430b2be2a33971"},"cell_type":"code","source":"#vectorizer = CountVectorizer(vocabulary = features)\nX = vectorizer.transform(df_test['all_ingredients'].values)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"dceedd51fdda54b77339f8212d493fd882a5d801"},"cell_type":"code","source":"y_pred = vc.predict(X)","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"_uuid":"061ba7ccc2a8fabaa01792221637880df3ebcad9"},"cell_type":"code","source":"y_pred = enc.inverse_transform(y_pred)\ny_pred = pd.DataFrame({'cuisine' : y_pred , 'id' : df_test.id }, columns=['id', 'cuisine'])\ny_pred.to_csv('submission.csv', index = False)","execution_count":null,"outputs":[]}],"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.5.2"}},"nbformat":4,"nbformat_minor":1}