{"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":"markdown","source":"# 1.Install Package","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!pip install openpyxl\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport gc\nimport sklearn\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\n# for 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 20GB 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\n\n# cd path/to/train-preprocess\n# %cd ../input/train-preprocess","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-03-21T16:54:40.196665Z","iopub.execute_input":"2022-03-21T16:54:40.197182Z","iopub.status.idle":"2022-03-21T16:54:54.865602Z","shell.execute_reply.started":"2022-03-21T16:54:40.197075Z","shell.execute_reply":"2022-03-21T16:54:54.864897Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# cd path/to/elo-merchant-category-recommendation\n# %cd ../input/elo-linear-regression/preprocess\n%cd ../input/train-preprocess","metadata":{"execution":{"iopub.status.busy":"2022-03-21T11:12:51.803712Z","iopub.execute_input":"2022-03-21T11:12:51.804025Z","iopub.status.idle":"2022-03-21T11:12:51.812242Z","shell.execute_reply.started":"2022-03-21T11:12:51.803995Z","shell.execute_reply":"2022-03-21T11:12:51.811176Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 1.Features Compression\n\n共计1623个特征，使用Pearson相关系数，选取部分特征进行建模","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('train.csv')\ntrain.info()","metadata":{"execution":{"iopub.status.busy":"2022-03-21T11:12:58.622332Z","iopub.execute_input":"2022-03-21T11:12:58.622613Z","iopub.status.idle":"2022-03-21T11:13:02.261598Z","shell.execute_reply.started":"2022-03-21T11:12:58.622583Z","shell.execute_reply":"2022-03-21T11:13:02.260641Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 提取特征名称\nfeatures = train.columns.tolist()\nfeatures.remove(\"card_id\")\nfeatures.remove(\"target\")\nfeatureSelect = features[:]\n\n# 计算相关系数\ncorr = []\nfor fea in featureSelect:\n    corr.append(abs(train[[fea, 'target']].fillna(0).corr().values[0][1]))\n\n# 取top300的特征进行建模，具体数量可选\nse = pd.Series(corr, index=featureSelect).sort_values(ascending=False)\nfeature_select = ['card_id'] + se[:300].index.tolist()\n\n# 输出结果\ntrain = train[feature_select + ['target']]\ntrain.info()","metadata":{"execution":{"iopub.status.busy":"2022-03-20T12:33:59.024322Z","iopub.execute_input":"2022-03-20T12:33:59.024608Z","iopub.status.idle":"2022-03-20T12:34:00.714577Z","shell.execute_reply.started":"2022-03-20T12:33:59.024576Z","shell.execute_reply":"2022-03-20T12:34:00.713723Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# 特征名称写入文件中\nfeatures = train.columns.tolist()\nfeatures.remove(\"card_id\")\nfeatures.remove(\"target\")\nfeatureSelect = features[:]\n\n# 计算相关系数\ncorr = []\nfor fea in featureSelect:\n    corr.append(abs(train[[fea, 'target']].fillna(0).corr().values[0][1]))\n\n# 取top300的特征进行建模，具体数量可选\nse = pd.Series(corr, index=featureSelect).sort_values(ascending=False)\nfeature_select = ['card_id'] + se[:11].index.tolist()\n\n# 写入文件\nfdf = pd.DataFrame(['column'])\nfor i in range(300):\n    fdf = fdf.append({'column': feature_select[i]}, ignore_index=True)\nfdf.to_csv('../../working/features.csv', index=False)\n","metadata":{"execution":{"iopub.status.busy":"2022-03-21T01:57:50.199775Z","iopub.execute_input":"2022-03-21T01:57:50.200015Z","iopub.status.idle":"2022-03-21T01:57:51.936423Z","shell.execute_reply.started":"2022-03-21T01:57:50.199991Z","shell.execute_reply":"2022-03-21T01:57:51.935738Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2.Linear Regression","metadata":{}},{"cell_type":"code","source":"# 获取特征名\nfeature = feature_select.copy()\ndel feature[0]\n\n# 拆分自变量和因变量\nx = train[feature]\ny = train['target']\n\nseed = 810\nfrom sklearn.model_selection import train_test_split\nx_train, x_test, y_train, y_test = train_test_split(x, y, random_state=seed)","metadata":{"execution":{"iopub.status.busy":"2022-03-20T12:55:03.547359Z","iopub.execute_input":"2022-03-20T12:55:03.547638Z","iopub.status.idle":"2022-03-20T12:55:03.642844Z","shell.execute_reply.started":"2022-03-20T12:55:03.547607Z","shell.execute_reply":"2022-03-20T12:55:03.642274Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(x_train.shape)\nprint(y_train.shape)\nprint(x_test.shape)\nprint(y_test.shape)","metadata":{"execution":{"iopub.status.busy":"2022-03-20T12:55:59.003674Z","iopub.execute_input":"2022-03-20T12:55:59.004273Z","iopub.status.idle":"2022-03-20T12:55:59.010722Z","shell.execute_reply.started":"2022-03-20T12:55:59.004222Z","shell.execute_reply":"2022-03-20T12:55:59.009903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.linear_model import LinearRegression\nlr = LinearRegression()\nlr.fit(x_train, y_train)\n\nprint(lr.intercept_)\nprint(lr.coef_)","metadata":{"execution":{"iopub.status.busy":"2022-03-20T12:57:13.863845Z","iopub.execute_input":"2022-03-20T12:57:13.864317Z","iopub.status.idle":"2022-03-20T12:57:14.052072Z","shell.execute_reply.started":"2022-03-20T12:57:13.86427Z","shell.execute_reply":"2022-03-20T12:57:14.051039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = lr.predict(x_test)\n\nfrom sklearn import metrics\n\nmse = metrics.mean_squared_error(y_test, y_pred)\nrmse = np.sqrt(mse)\nprint('MSE : ' + str(mse))\nprint('RMSE : ' + str(rmse))","metadata":{"execution":{"iopub.status.busy":"2022-03-20T12:59:04.763676Z","iopub.execute_input":"2022-03-20T12:59:04.763934Z","iopub.status.idle":"2022-03-20T12:59:04.784063Z","shell.execute_reply.started":"2022-03-20T12:59:04.763907Z","shell.execute_reply":"2022-03-20T12:59:04.782958Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#standard pipeline\nn = 50\n\ndef pipeline(n=300, seed=810):    \n    from sklearn.model_selection import train_test_split\n    from sklearn.linear_model import LinearRegression\n    from sklearn import metrics\n    \n    train = pd.read_csv('train.csv')\n    \n    features = train.columns.tolist()\n    features.remove(\"card_id\")\n    features.remove(\"target\")\n    featureSelect = features[:]\n\n    # 计算相关系数\n    corr = []\n    for fea in featureSelect:\n        corr.append(abs(train[[fea, 'target']].fillna(0).corr().values[0][1]))\n\n    # 取top300的特征进行建模，具体数量可选\n    se = pd.Series(corr, index=featureSelect).sort_values(ascending=False)\n    feature_select = ['card_id'] + se[:n].index.tolist()\n\n    # 输出结果\n    train = train[feature_select + ['target']]\n    \n    # 获取特征名\n    feature = feature_select.copy()\n    del feature[0]\n\n    # 拆分自变量和因变量\n    x = train[feature]\n    y = train['target']\n\n    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=seed)\n\n    lr = LinearRegression()\n    lr.fit(x_train, y_train)\n    \n    y_pred = lr.predict(x_test)\n\n    mse = metrics.mean_squared_error(y_test, y_pred)\n    rmse = np.sqrt(mse)\n    print('MSE : ' + str(mse))\n    print('RMSE : ' + str(rmse))\n\npipeline(n)","metadata":{"execution":{"iopub.status.busy":"2022-03-20T13:19:38.440798Z","iopub.execute_input":"2022-03-20T13:19:38.441089Z","iopub.status.idle":"2022-03-20T13:19:41.924861Z","shell.execute_reply.started":"2022-03-20T13:19:38.441059Z","shell.execute_reply":"2022-03-20T13:19:41.923929Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#optimization of n pipeline\n\ndef optimization_pipeline(seed=810):    \n    from sklearn.model_selection import train_test_split\n    from sklearn.linear_model import LinearRegression\n    from sklearn import metrics\n    \n    train_raw = pd.read_csv('train.csv')\n    \n    features = train_raw.columns.tolist()\n    features.remove(\"card_id\")\n    features.remove(\"target\")\n    featureSelect = features[:]\n\n    # 计算相关系数\n    corr = []\n    for fea in featureSelect:\n        corr.append(abs(train_raw[[fea, 'target']].fillna(0).corr().values[0][1]))\n\n    # 取top300的特征进行建模，具体数量可选\n    se = pd.Series(corr, index=featureSelect).sort_values(ascending=False)\n    \n    y = train_raw['target']\n    \n    names = ['n', 'MSE', 'RMSE']\n    df = pd.DataFrame(columns=names)\n    \n    for i in range(1, 300):\n        feature_select = se[:i].index.tolist()\n        x = train_raw[feature_select]\n\n        x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=seed)\n\n        lr = LinearRegression()\n        lr.fit(x_train, y_train)\n\n        y_pred = lr.predict(x_test)\n\n        mse = metrics.mean_squared_error(y_test, y_pred)\n        rmse = np.sqrt(mse)\n        df = df.append({'n': i, 'MSE': mse, 'RMSE': rmse}, ignore_index=True)\n    \n    df.to_csv('../input/elo-linear-regression/opt.csv', index=False)\n\noptimization_pipeline()","metadata":{"execution":{"iopub.status.busy":"2022-03-21T11:28:51.879702Z","iopub.execute_input":"2022-03-21T11:28:51.880071Z","iopub.status.idle":"2022-03-21T11:29:13.358535Z","shell.execute_reply.started":"2022-03-21T11:28:51.880033Z","shell.execute_reply":"2022-03-21T11:29:13.357365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"result = pd.read_csv('../elo-linear-regression/opt.csv')\nresult = result.sort_values(by=['RMSE'])\nresult.head(5)","metadata":{"execution":{"iopub.status.busy":"2022-03-21T11:30:14.690425Z","iopub.execute_input":"2022-03-21T11:30:14.690864Z","iopub.status.idle":"2022-03-21T11:30:14.704423Z","shell.execute_reply.started":"2022-03-21T11:30:14.690826Z","shell.execute_reply":"2022-03-21T11:30:14.70385Z"},"trusted":true},"execution_count":null,"outputs":[]}]}