{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":66052,"databundleVersionId":7284431,"sourceType":"competition"}],"dockerImageVersionId":30646,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"## Here's a rapid solution utilizing the **IsolationForest** from the **scikit-learn (sklearn) library**, trained on the provided training data.\n\n## Hope this might provide you with some valuable insights for the competition : )","metadata":{}},{"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\nimport seaborn as sns; sns.set()\nimport matplotlib.pyplot as plt\n\nimport os\nfrom tqdm import tqdm\n\nimport lightgbm as lgb\nfrom sklearn.ensemble import IsolationForest","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-01-30T02:45:44.905112Z","iopub.execute_input":"2024-01-30T02:45:44.905793Z","iopub.status.idle":"2024-01-30T02:45:44.918184Z","shell.execute_reply.started":"2024-01-30T02:45:44.905736Z","shell.execute_reply":"2024-01-30T02:45:44.915374Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"path_data = '/kaggle/input/ai-serving-grid-stability/'\nos.listdir(path_data)","metadata":{"execution":{"iopub.status.busy":"2024-01-30T02:45:44.922000Z","iopub.execute_input":"2024-01-30T02:45:44.923272Z","iopub.status.idle":"2024-01-30T02:45:44.938566Z","shell.execute_reply.started":"2024-01-30T02:45:44.923215Z","shell.execute_reply":"2024-01-30T02:45:44.936830Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Load and preprocess the dataset","metadata":{}},{"cell_type":"code","source":"sample_submission = pd.read_csv(os.path.join(path_data, 'sample_submission.csv'))\ntest = pd.read_csv(os.path.join(path_data, 'test.csv'))\ntrain = pd.read_csv(os.path.join(path_data, 'train.csv'))","metadata":{"execution":{"iopub.status.busy":"2024-01-30T02:45:44.941475Z","iopub.execute_input":"2024-01-30T02:45:44.942635Z","iopub.status.idle":"2024-01-30T02:46:09.064990Z","shell.execute_reply.started":"2024-01-30T02:45:44.942583Z","shell.execute_reply":"2024-01-30T02:46:09.063571Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_area1 = test[test['controlArea']==1]\ntest_area2 = test[test['controlArea']==2]\n\ntrain_area1 = train[train['controlArea']==1].sort_values('Datum_Uhrzeit_CET')\ntrain_area2 = train[train['controlArea']==2].sort_values('Datum_Uhrzeit_CET')","metadata":{"execution":{"iopub.status.busy":"2024-01-30T02:46:09.068174Z","iopub.execute_input":"2024-01-30T02:46:09.068591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Only four fundamental features are selected here.","metadata":{}},{"cell_type":"code","source":"feats = ['correction','correctionEcho','FRCE','LFCInput']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Train the IsolationForest model","metadata":{}},{"cell_type":"code","source":"clf_area1 = IsolationForest(n_estimators=200, random_state=42, n_jobs=-1, contamination='auto')\nclf_area2 = IsolationForest(n_estimators=200, random_state=42, n_jobs=-1, contamination='auto')\n\nclf_area1.fit(train_area1[feats])\nclf_area2.fit(train_area2[feats])\n\ntest_area1['anomaly_isoforest'] = (1-clf_area1.predict(test_area1[feats]))/2\ntest_area2['anomaly_isoforest'] = (1-clf_area2.predict(test_area2[feats]))/2\n\ntest_merged = pd.concat([test_area1, test_area2],axis=0).sort_values('id')\ntest_merged","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Prepare the submission","metadata":{}},{"cell_type":"code","source":"sample_submission['anomaly'] = test_merged['anomaly_isoforest']","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### Replace submission values by manual labels\nRef: https://www.kaggle.com/code/patrick0302/mannul-labeling-on-submission","metadata":{}},{"cell_type":"code","source":"sample_submission.loc[5400:7199,'anomaly'] = 0\nsample_submission.loc[5721:5933,'anomaly'] = 1\n\nsample_submission.loc[23400:25199,'anomaly'] = 0\nsample_submission.loc[25170:25182,'anomaly'] = 1\nsample_submission.loc[27000:28799,'anomaly'] = 0\nsample_submission.loc[28459:28500,'anomaly'] = 1\n\nsample_submission.loc[18000:19799,'anomaly'] = 0\nsample_submission.loc[18374:18393,'anomaly'] = 1\nsample_submission.loc[18612:18674,'anomaly'] = 1\nsample_submission.loc[18819:18944,'anomaly'] = 1\n\nsample_submission.to_csv('isoforest_pred.csv', index=False)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}