{"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":"# Read data\n\nimport pandas as pd\nfrom pathlib import Path\n\ninput_path = Path('../input/tabular-playground-series-aug-2022/')\n\ntrain_data = pd.read_csv(input_path / 'train.csv', index_col='id')\ntest_data = pd.read_csv(input_path / 'test.csv', index_col='id')\n\nsample_submission = pd.read_csv(\n    input_path / 'sample_submission.csv',\n    index_col='id'\n)\n\nprint(train_data.shape)\ntrain_data.info()\ntrain_data.head()\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:53.859186Z","iopub.execute_input":"2022-08-06T08:57:53.860220Z","iopub.status.idle":"2022-08-06T08:57:54.210286Z","shell.execute_reply.started":"2022-08-06T08:57:53.860129Z","shell.execute_reply":"2022-08-06T08:57:54.209147Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# check object columns\n\nobject_columns = train_data.select_dtypes(include=['object']).columns\nprint('object columns', object_columns)\nfor colum in object_columns:\n    print(colum, train_data[colum].unique())\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:54.211766Z","iopub.execute_input":"2022-08-06T08:57:54.212585Z","iopub.status.idle":"2022-08-06T08:57:54.228038Z","shell.execute_reply.started":"2022-08-06T08:57:54.212542Z","shell.execute_reply":"2022-08-06T08:57:54.226502Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# check missing values\n\ntrain_data_columns_has_missing = [\n    column for column in train_data.columns\n    if train_data[column].isnull().any()\n]\nprint('check train data columns has missing', train_data_columns_has_missing)\n\ntest_data_columns_has_missing = [\n    column for column in test_data.columns\n    if test_data[column].isnull().any()\n]\nprint('check test data columns has missing', test_data_columns_has_missing)\n\ncolumns_has_missing = train_data_columns_has_missing\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:54.229268Z","iopub.execute_input":"2022-08-06T08:57:54.229692Z","iopub.status.idle":"2022-08-06T08:57:54.252163Z","shell.execute_reply.started":"2022-08-06T08:57:54.229661Z","shell.execute_reply":"2022-08-06T08:57:54.251360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# define function to create lgb model.\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import mean_absolute_error\nimport lightgbm as lgb\n\n\ndef create_lgb_model(train: pd.DataFrame) -> lgb.Booster:\n    x_train, x_test, y_train, y_test = train_test_split(\n        train.drop(columns=['failure']),\n        train.loc[:, 'failure'],\n        test_size=0.25,\n        random_state=1\n    )\n\n    lgb_train = lgb.Dataset(x_train, y_train)\n    lgb_eval = lgb.Dataset(x_test, y_test, reference=lgb_train)\n\n    params = {\n        'objective': 'regression_l2',\n    }\n\n    return lgb.train(\n        params,\n        lgb_train,\n        valid_sets=[lgb_train, lgb_eval],\n        num_boost_round=100,\n        callbacks=[lgb.log_evaluation(10), lgb.early_stopping(10)]\n    )\n\n\ndef evaluate_train_data_by_mae(train: pd.DataFrame) -> float:\n    x_train, x_test, y_train, y_test = train_test_split(\n        train.drop(columns=['failure']),\n        train.loc[:, 'failure'],\n        test_size=0.25,\n        random_state=1\n    )\n    lgb_model = create_lgb_model(pd.concat([x_train, y_train], axis=1))\n    return mean_absolute_error(y_test, lgb_model.predict(x_test))\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:54.254640Z","iopub.execute_input":"2022-08-06T08:57:54.255240Z","iopub.status.idle":"2022-08-06T08:57:56.483365Z","shell.execute_reply.started":"2022-08-06T08:57:54.255208Z","shell.execute_reply":"2022-08-06T08:57:56.482446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# predict without object and missing\n\ndef create_data_without_object_and_missing(\n    train: pd.DataFrame\n) -> pd.DataFrame:\n    without_object = train.drop(columns=object_columns)\n    return without_object.drop(columns=columns_has_missing)\n\n\nprint(\n    '\\n[MAE] without object and missing',\n    evaluate_train_data_by_mae(\n        create_data_without_object_and_missing(train_data),\n    )\n)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:56.484681Z","iopub.execute_input":"2022-08-06T08:57:56.485707Z","iopub.status.idle":"2022-08-06T08:57:56.600133Z","shell.execute_reply.started":"2022-08-06T08:57:56.485672Z","shell.execute_reply":"2022-08-06T08:57:56.597992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# predict labeled and without missing\n\nfrom sklearn.preprocessing import OrdinalEncoder\n\n\ndef create_labeled_data(train: pd.DataFrame) -> pd.DataFrame:\n    labeled = train.copy()\n    ordinal_encoder = OrdinalEncoder()\n    labeled[object_columns] = ordinal_encoder.fit_transform(\n        labeled[object_columns]\n    )\n    return labeled\n\n\ndef create_labeled_data_without_missing(\n    train: pd.DataFrame\n) -> pd.DataFrame:\n    return create_labeled_data(train).drop(columns=columns_has_missing)\n\n\nprint(\n    '\\n[MAE] labeled and without missing',\n    evaluate_train_data_by_mae(\n        create_labeled_data_without_missing(train_data),\n    )\n)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:56.603846Z","iopub.execute_input":"2022-08-06T08:57:56.605826Z","iopub.status.idle":"2022-08-06T08:57:56.724319Z","shell.execute_reply.started":"2022-08-06T08:57:56.605228Z","shell.execute_reply":"2022-08-06T08:57:56.723316Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# predict labeled and imputed\n\nfrom sklearn.impute import SimpleImputer\n\n\ndef create_labeled_and_imputed_data(\n    train: pd.DataFrame\n) -> pd.DataFrame:\n    labeled = create_labeled_data(train)\n    imputer = SimpleImputer()\n    labeled_and_imputed = pd.DataFrame(imputer.fit_transform(labeled))\n    labeled_and_imputed.columns = labeled.columns\n    labeled_and_imputed.index = labeled.index\n    return labeled_and_imputed\n\n\nprint(\n    '\\n[MAE] labeled object and imputed',\n    evaluate_train_data_by_mae(\n        create_labeled_and_imputed_data(train_data),\n    )\n)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:56.725651Z","iopub.execute_input":"2022-08-06T08:57:56.726162Z","iopub.status.idle":"2022-08-06T08:57:57.342420Z","shell.execute_reply.started":"2022-08-06T08:57:56.726117Z","shell.execute_reply":"2022-08-06T08:57:57.339710Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# predict labeled object and imputed_with_flag\n\ndef create_labeled_and_imputed_data_with_flag(\n    train: pd.DataFrame\n) -> pd.DataFrame:\n    with_flag = create_labeled_and_imputed_data(train)\n    for column in columns_has_missing:\n        with_flag[column + '_was_missing'] = with_flag[column].isnull()\n    return with_flag\n\n\nprint(\n    '\\n[MAE] labeled object and imputed',\n    evaluate_train_data_by_mae(\n        create_labeled_and_imputed_data_with_flag(train_data),\n    )\n)\n","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:57.344029Z","iopub.execute_input":"2022-08-06T08:57:57.344896Z","iopub.status.idle":"2022-08-06T08:57:58.013746Z","shell.execute_reply.started":"2022-08-06T08:57:57.344856Z","shell.execute_reply":"2022-08-06T08:57:58.012810Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# create submission\n\nimport numpy as np\n\n\ndef create_submission_predict() -> np.array:\n    submission_train = create_labeled_data_without_missing(train_data)\n    submission_test = create_labeled_data_without_missing(test_data)\n    model = create_lgb_model(submission_train)\n    return model.predict(submission_test)\n\n\ndef create_submission() -> pd.DataFrame:\n    predict = create_submission_predict()\n    submission = pd.DataFrame(\n        create_submission_predict(),\n        index=test_data.index,\n        columns=['failure']\n    )\n    return submission\n\ncreate_submission().to_csv('submission.csv', index=True)","metadata":{"execution":{"iopub.status.busy":"2022-08-06T08:57:58.017566Z","iopub.execute_input":"2022-08-06T08:57:58.019624Z","iopub.status.idle":"2022-08-06T08:57:58.327450Z","shell.execute_reply.started":"2022-08-06T08:57:58.019578Z","shell.execute_reply":"2022-08-06T08:57:58.326312Z"},"trusted":true},"execution_count":null,"outputs":[]}]}