{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"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)\n\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 5GB 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","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#pd = df = pd.read_csv(\"/kaggle/input/cat-in-the-dat-ii/train.csv\")","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import  pandas as pd\nfrom sklearn import preprocessing\n\nclass CategoricalFeatures:\n    def __init__(self, df, categorical_features, encoding_type, handle_na=False):\n        \"\"\"\n        df: pandas dataframe\n        categorical_features: list of column names, e.g. [\"ord_1\", \"nom_0\"......]\n        encoding_type: label, binary, ohe\n        handle_na: True/False\n        \"\"\"\n        self.df = df\n        self.cat_feats = categorical_features\n        self.enc_type = encoding_type\n        self.handle_na = handle_na\n        self.label_encoders = dict()\n        self.binary_encoders = dict()\n        self.ohe = None\n\n        if self.handle_na:\n            for c in self.cat_feats:\n                self.df.loc[:, c] = self.df.loc[:, c].astype(str).fillna(\"-9999999\")\n        self.output_df = self.df.copy(deep=True)\n    \n    def _label_encoding(self):\n        for c in self.cat_feats:\n            lbl = preprocessing.LabelEncoder()\n            lbl.fit(self.df[c].values)\n            self.output_df.loc[:, c] = lbl.transform(self.df[c].values)\n            self.label_encoders[c] = lbl\n        return self.output_df\n    \n    def _label_binarization(self):\n        for c in self.cat_feats:\n            lbl = preprocessing.LabelBinarizer()\n            lbl.fit(self.df[c].values)\n            val = lbl.transform(self.df[c].values)\n            self.output_df = self.output_df.drop(c, axis=1)\n            for j in range(val.shape[1]):\n                new_col_name = c + f\"__bin_{j}\"\n                self.output_df[new_col_name] = val[:, j]\n            self.binary_encoders[c] = lbl\n        return self.output_df\n\n    def _one_hot(self):\n        ohe = preprocessing.OneHotEncoder()\n        ohe.fit(self.df[self.cat_feats].values)\n        return ohe.transform(self.df[self.cat_feats].values)\n\n    def fit_transform(self):\n        if self.enc_type == \"label\":\n            return self._label_encoding()\n        elif self.enc_type == \"binary\":\n            return self._label_binarization()\n        elif self.enc_type == \"ohe\":\n            return self._one_hot()\n        else:\n            raise Exception(\"Encoding type not understood\")\n    \n    def transform(self, dataframe):\n        if self.handle_na:\n            for c in self.cat_feats:\n                dataframe.loc[:, c] = dataframe.loc[:, c].astype(str).fillna(\"-9999999\")\n\n        if self.enc_type == \"label\":\n            for c, lbl in self.label_encoders.items():\n                dataframe.loc[:, c] = lbl.transform(dataframe[c].values)\n            return dataframe\n\n        elif self.enc_type == \"binary\":\n            for c, lbl in self.binary_encoders.items():\n                val = lbl.transform(dataframe[c].values)\n                dataframe = dataframe.drop(c, axis=1)\n                \n                for j in range(val.shape[1]):\n                    new_col_name = c + f\"__bin_{j}\"\n                    dataframe[new_col_name] = val[:, j]\n            return dataframe\n\n        elif self.enc_type == \"ohe\":\n            return self.ohe(dataframe[self.cat_feats].values)\n        \n        else:\n            raise Exception(\"Encoding type not understood\")\n                \n\nif __name__ == \"__main__\":\n    import pandas as pd\n    from sklearn import linear_model\n    df = pd.read_csv(\"/kaggle/input/cat-in-the-dat-ii/train.csv\")\n    \n    df_test = pd.read_csv(\"/kaggle/input/cat-in-the-dat-ii/test.csv\")\n    sample = pd.read_csv(\"/kaggle/input/cat-in-the-dat-ii/sample_submission.csv\")\n\n    train_len = len(df)\n\n    df_test[\"target\"] = -1\n    full_data = pd.concat([df, df_test])\n\n    cols = [c for c in df.columns if c not in [\"id\", \"target\"]]\n    cat_feats = CategoricalFeatures(full_data, \n                                    categorical_features=cols, \n                                    encoding_type=\"ohe\",\n                                    handle_na=True)\n    full_data_transformed = cat_feats.fit_transform()\n    \n    X = full_data_transformed[:train_len, :]\n    X_test = full_data_transformed[train_len:, :]\n\n    clf = linear_model.LogisticRegression()\n    clf.fit(X, df.target.values)\n    preds = clf.predict_proba(X_test)[:, 1]\n    \n    submission = pd.DataFrame({'id': df_test.id, 'target': preds})\n    submission.to_csv('submission.csv', index=False)\n    \n    #sample.loc[:, \"target\"] = preds\n   # sample.to_csv(\"submission.csv\", index=False)","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}