{"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":10445,"databundleVersionId":200747,"sourceType":"competition"}],"dockerImageVersionId":21695,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"**FEEL FREE TO UPVOTE**  （＾ｖ＾）","metadata":{"_uuid":"6df55b542f152882e00385a0f73198f4e3bc4316"}},{"cell_type":"code","source":"print('hello elo')","metadata":{"_uuid":"50ea3cd3619fa34c768561a4fd8aec31c71f6a29","execution":{"iopub.status.busy":"2024-05-15T14:40:17.666411Z","iopub.execute_input":"2024-05-15T14:40:17.666838Z","iopub.status.idle":"2024-05-15T14:40:17.691161Z","shell.execute_reply.started":"2024-05-15T14:40:17.666780Z","shell.execute_reply":"2024-05-15T14:40:17.690051Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport datetime\nimport gc\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport lightgbm as lgb\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import mean_squared_error\nimport xgboost as xgb\n\nimport warnings\nwarnings.filterwarnings('ignore')\nnp.random.seed(4590)","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_kg_hide-output":false,"execution":{"iopub.status.busy":"2024-05-15T14:40:17.693048Z","iopub.execute_input":"2024-05-15T14:40:17.693478Z","iopub.status.idle":"2024-05-15T14:40:19.250380Z","shell.execute_reply.started":"2024-05-15T14:40:17.693399Z","shell.execute_reply":"2024-05-15T14:40:19.249233Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train = pd.read_csv('../input/train.csv')\ndf_test = pd.read_csv('../input/test.csv')\ndf_hist_trans = pd.read_csv('../input/historical_transactions.csv')\ndf_new_merchant_trans = pd.read_csv('../input/new_merchant_transactions.csv')","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","execution":{"iopub.status.busy":"2024-05-15T14:40:19.252199Z","iopub.execute_input":"2024-05-15T14:40:19.252569Z","iopub.status.idle":"2024-05-15T14:42:19.140358Z","shell.execute_reply.started":"2024-05-15T14:40:19.252511Z","shell.execute_reply":"2024-05-15T14:42:19.139359Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#handle missing value\nfor df in [df_hist_trans,df_new_merchant_trans]:\n    df['category_2'].fillna(1.0,inplace=True)\n    df['category_3'].fillna('A',inplace=True)\n    df['merchant_id'].fillna('M_ID_00a6ca8a8a',inplace=True)","metadata":{"_uuid":"71f89a3b8a93b2f2feb2cd0a45f860cde33687be","execution":{"iopub.status.busy":"2024-05-15T14:42:19.142436Z","iopub.execute_input":"2024-05-15T14:42:19.142839Z","iopub.status.idle":"2024-05-15T14:42:25.871513Z","shell.execute_reply.started":"2024-05-15T14:42:19.142767Z","shell.execute_reply":"2024-05-15T14:42:25.868096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def get_new_columns(name,aggs):\n    return [name + '_' + k + '_' + agg for k in aggs.keys() for agg in aggs[k]]","metadata":{"_uuid":"dda90662d05e22310dd713df106ea07f4b8bccfc","execution":{"iopub.status.busy":"2024-05-15T14:42:25.874651Z","iopub.execute_input":"2024-05-15T14:42:25.875106Z","iopub.status.idle":"2024-05-15T14:42:25.882776Z","shell.execute_reply.started":"2024-05-15T14:42:25.875042Z","shell.execute_reply":"2024-05-15T14:42:25.881766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for df in [df_hist_trans,df_new_merchant_trans]:\n    df['purchase_date'] = pd.to_datetime(df['purchase_date'])\n    df['year'] = df['purchase_date'].dt.year\n    df['weekofyear'] = df['purchase_date'].dt.weekofyear\n    df['month'] = df['purchase_date'].dt.month\n    df['dayofweek'] = df['purchase_date'].dt.dayofweek\n    df['weekend'] = (df.purchase_date.dt.weekday >=5).astype(int)\n    df['hour'] = df['purchase_date'].dt.hour\n    df['authorized_flag'] = df['authorized_flag'].map({'Y':1, 'N':0})\n    df['category_1'] = df['category_1'].map({'Y':1, 'N':0}) \n    #https://www.kaggle.com/c/elo-merchant-category-recommendation/discussion/73244\n    df['month_diff'] = ((datetime.datetime.today() - df['purchase_date']).dt.days)//30\n    df['month_diff'] += df['month_lag']","metadata":{"_uuid":"690ba01a38f524e9345b419200f588f937bc067a","execution":{"iopub.status.busy":"2024-05-15T14:42:25.884583Z","iopub.execute_input":"2024-05-15T14:42:25.885004Z","iopub.status.idle":"2024-05-15T14:43:19.767646Z","shell.execute_reply.started":"2024-05-15T14:42:25.884936Z","shell.execute_reply":"2024-05-15T14:43:19.766656Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"aggs = {}\nfor col in ['month','hour','weekofyear','dayofweek','year','subsector_id','merchant_id','merchant_category_id']:\n    aggs[col] = ['nunique']\n\naggs['purchase_amount'] = ['sum','max','min','mean','var']\naggs['installments'] = ['sum','max','min','mean','var']\naggs['purchase_date'] = ['max','min']\naggs['month_lag'] = ['max','min','mean','var']\naggs['month_diff'] = ['mean']\naggs['authorized_flag'] = ['sum', 'mean']\naggs['weekend'] = ['sum', 'mean']\naggs['category_1'] = ['sum', 'mean']\naggs['card_id'] = ['size']\n\nfor col in ['category_2','category_3']:\n    df_hist_trans[col+'_mean'] = df_hist_trans.groupby([col])['purchase_amount'].transform('mean')\n    aggs[col+'_mean'] = ['mean']    \n\nnew_columns = get_new_columns('hist',aggs)\ndf_hist_trans_group = df_hist_trans.groupby('card_id').agg(aggs)\ndf_hist_trans_group.columns = new_columns\ndf_hist_trans_group.reset_index(drop=False,inplace=True)\ndf_hist_trans_group['hist_purchase_date_diff'] = (df_hist_trans_group['hist_purchase_date_max'] - df_hist_trans_group['hist_purchase_date_min']).dt.days\ndf_hist_trans_group['hist_purchase_date_average'] = df_hist_trans_group['hist_purchase_date_diff']/df_hist_trans_group['hist_card_id_size']\ndf_hist_trans_group['hist_purchase_date_uptonow'] = (datetime.datetime.today() - df_hist_trans_group['hist_purchase_date_max']).dt.days\ndf_train = df_train.merge(df_hist_trans_group,on='card_id',how='left')\ndf_test = df_test.merge(df_hist_trans_group,on='card_id',how='left')\ndel df_hist_trans_group;gc.collect()","metadata":{"_uuid":"ddf1d5bb0ade2b22b0f072c208c1506ea64503ea","execution":{"iopub.status.busy":"2024-05-15T14:43:19.769058Z","iopub.execute_input":"2024-05-15T14:43:19.769318Z","iopub.status.idle":"2024-05-15T14:48:43.424650Z","shell.execute_reply.started":"2024-05-15T14:43:19.769273Z","shell.execute_reply":"2024-05-15T14:48:43.423558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"aggs = {}\nfor col in ['month','hour','weekofyear','dayofweek','year','subsector_id','merchant_id','merchant_category_id']:\n    aggs[col] = ['nunique']\naggs['purchase_amount'] = ['sum','max','min','mean','var']\naggs['installments'] = ['sum','max','min','mean','var']\naggs['purchase_date'] = ['max','min']\naggs['month_lag'] = ['max','min','mean','var']\naggs['month_diff'] = ['mean']\naggs['weekend'] = ['sum', 'mean']\naggs['category_1'] = ['sum', 'mean']\naggs['card_id'] = ['size']\n\nfor col in ['category_2','category_3']:\n    df_new_merchant_trans[col+'_mean'] = df_new_merchant_trans.groupby([col])['purchase_amount'].transform('mean')\n    aggs[col+'_mean'] = ['mean']\n    \nnew_columns = get_new_columns('new_hist',aggs)\ndf_hist_trans_group = df_new_merchant_trans.groupby('card_id').agg(aggs)\ndf_hist_trans_group.columns = new_columns\ndf_hist_trans_group.reset_index(drop=False,inplace=True)\ndf_hist_trans_group['new_hist_purchase_date_diff'] = (df_hist_trans_group['new_hist_purchase_date_max'] - df_hist_trans_group['new_hist_purchase_date_min']).dt.days\ndf_hist_trans_group['new_hist_purchase_date_average'] = df_hist_trans_group['new_hist_purchase_date_diff']/df_hist_trans_group['new_hist_card_id_size']\ndf_hist_trans_group['new_hist_purchase_date_uptonow'] = (datetime.datetime.today() - df_hist_trans_group['new_hist_purchase_date_max']).dt.days\ndf_train = df_train.merge(df_hist_trans_group,on='card_id',how='left')\ndf_test = df_test.merge(df_hist_trans_group,on='card_id',how='left')\ndel df_hist_trans_group;gc.collect()","metadata":{"_uuid":"f7f5625db40db4395374991124fb796c9decd60b","execution":{"iopub.status.busy":"2024-05-15T14:48:43.426238Z","iopub.execute_input":"2024-05-15T14:48:43.426505Z","iopub.status.idle":"2024-05-15T14:49:07.275882Z","shell.execute_reply.started":"2024-05-15T14:48:43.426461Z","shell.execute_reply":"2024-05-15T14:49:07.274857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del df_hist_trans;gc.collect()\ndel df_new_merchant_trans;gc.collect()\ndf_train.head(5)","metadata":{"_uuid":"a075cc90ab1322829e4fad3ff39fce307c5db93c","execution":{"iopub.status.busy":"2024-05-15T14:49:07.277510Z","iopub.execute_input":"2024-05-15T14:49:07.277887Z","iopub.status.idle":"2024-05-15T14:49:08.557023Z","shell.execute_reply.started":"2024-05-15T14:49:07.277829Z","shell.execute_reply":"2024-05-15T14:49:08.555932Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train['outliers'] = 0\ndf_train.loc[df_train['target'] < -30, 'outliers'] = 1\ndf_train['outliers'].value_counts()","metadata":{"_uuid":"6f3182aeac0c3bf7a061a1b9e25e859f25fee9b5","execution":{"iopub.status.busy":"2024-05-15T14:49:08.558486Z","iopub.execute_input":"2024-05-15T14:49:08.558805Z","iopub.status.idle":"2024-05-15T14:49:08.642100Z","shell.execute_reply.started":"2024-05-15T14:49:08.558745Z","shell.execute_reply":"2024-05-15T14:49:08.641248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for df in [df_train,df_test]:\n    df['first_active_month'] = pd.to_datetime(df['first_active_month'])\n    df['dayofweek'] = df['first_active_month'].dt.dayofweek\n    df['weekofyear'] = df['first_active_month'].dt.weekofyear\n    df['month'] = df['first_active_month'].dt.month\n    df['elapsed_time'] = (datetime.datetime.today() - df['first_active_month']).dt.days\n    df['hist_first_buy'] = (df['hist_purchase_date_min'] - df['first_active_month']).dt.days\n    df['new_hist_first_buy'] = (df['new_hist_purchase_date_min'] - df['first_active_month']).dt.days\n    for f in ['hist_purchase_date_max','hist_purchase_date_min','new_hist_purchase_date_max',\\\n                     'new_hist_purchase_date_min']:\n        df[f] = df[f].astype(np.int64) * 1e-9\n    df['card_id_total'] = df['new_hist_card_id_size']+df['hist_card_id_size']\n    df['purchase_amount_total'] = df['new_hist_purchase_amount_sum']+df['hist_purchase_amount_sum']\n\nfor f in ['feature_1','feature_2','feature_3']:\n    order_label = df_train.groupby([f])['outliers'].mean()\n    df_train[f] = df_train[f].map(order_label)\n    df_test[f] = df_test[f].map(order_label)\n","metadata":{"_uuid":"ce2082fc1fb0e3f8f7d27fc166aa7a8351b65504","execution":{"iopub.status.busy":"2024-05-15T14:49:08.644085Z","iopub.execute_input":"2024-05-15T14:49:08.644489Z","iopub.status.idle":"2024-05-15T14:49:09.275423Z","shell.execute_reply.started":"2024-05-15T14:49:08.644406Z","shell.execute_reply":"2024-05-15T14:49:09.274406Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train_columns = [c for c in df_train.columns if c not in ['card_id', 'first_active_month','target','outliers']]\ntarget = df_train['target']\ndel df_train['target']","metadata":{"_uuid":"c4f20f27679889542acfd60d1f1ac381b201ac43","execution":{"iopub.status.busy":"2024-05-15T14:49:09.277068Z","iopub.execute_input":"2024-05-15T14:49:09.277346Z","iopub.status.idle":"2024-05-15T14:49:09.304181Z","shell.execute_reply.started":"2024-05-15T14:49:09.277299Z","shell.execute_reply":"2024-05-15T14:49:09.303061Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nlen(df_train_columns)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:49:09.305780Z","iopub.execute_input":"2024-05-15T14:49:09.306083Z","iopub.status.idle":"2024-05-15T14:49:09.311601Z","shell.execute_reply.started":"2024-05-15T14:49:09.306026Z","shell.execute_reply":"2024-05-15T14:49:09.310600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 训练 和交叉验证","metadata":{}},{"cell_type":"markdown","source":"# LightGAM","metadata":{}},{"cell_type":"code","source":"# param = {'num_leaves': 31,\n#          'min_data_in_leaf': 30, \n#          'objective':'regression',\n#          'max_depth': -1,\n#          'learning_rate': 0.01,\n#          \"min_child_samples\": 20,\n#          \"boosting\": \"gbdt\",\n#          \"feature_fraction\": 0.9,\n#          \"bagging_freq\": 1,\n#          \"bagging_fraction\": 0.9 ,\n#          \"bagging_seed\": 11,\n#          \"metric\": 'rmse',\n#          \"lambda_l1\": 0.1,\n#          \"verbosity\": -1,\n#          \"nthread\": 4,\n#          \"random_state\": 4590}\n# folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=4590)\n# oof = np.zeros(len(df_train))\n# predictions = np.zeros(len(df_test))\n# feature_importance_df = pd.DataFrame()\n\n# for fold_, (trn_idx, val_idx) in enumerate(folds.split(df_train,df_train['outliers'].values)):\n#     print(\"fold {}\".format(fold_))\n#     trn_data = lgb.Dataset(df_train.iloc[trn_idx][df_train_columns], label=target.iloc[trn_idx])#, categorical_feature=categorical_feats)\n#     val_data = lgb.Dataset(df_train.iloc[val_idx][df_train_columns], label=target.iloc[val_idx])#, categorical_feature=categorical_feats)\n\n#     num_round = 10000\n#     clf = lgb.train(param, trn_data, num_round, valid_sets = [trn_data, val_data], verbose_eval=100, early_stopping_rounds = 100)\n#     oof[val_idx] = clf.predict(df_train.iloc[val_idx][df_train_columns], num_iteration=clf.best_iteration)\n    \n#     fold_importance_df = pd.DataFrame()\n#     fold_importance_df[\"Feature\"] = df_train_columns\n#     fold_importance_df[\"importance\"] = clf.feature_importance()\n#     fold_importance_df[\"fold\"] = fold_ + 1\n#     feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n    \n#     predictions += clf.predict(df_test[df_train_columns], num_iteration=clf.best_iteration) / folds.n_splits\n\n# np.sqrt(mean_squared_error(oof, target))","metadata":{"_uuid":"c9bbc95244978b519d94131907b547c2b6c94191","execution":{"iopub.status.busy":"2024-05-15T14:49:09.313435Z","iopub.execute_input":"2024-05-15T14:49:09.313760Z","iopub.status.idle":"2024-05-15T14:49:09.323770Z","shell.execute_reply.started":"2024-05-15T14:49:09.313695Z","shell.execute_reply":"2024-05-15T14:49:09.322856Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# cols = (feature_importance_df[[\"Feature\", \"importance\"]]\n#         .groupby(\"Feature\")\n#         .mean()\n#         .sort_values(by=\"importance\", ascending=False)[:1000].index)\n\n# best_features = feature_importance_df.loc[feature_importance_df.Feature.isin(cols)]\n\n# plt.figure(figsize=(14,25))\n# sns.barplot(x=\"importance\",\n#             y=\"Feature\",\n#             data=best_features.sort_values(by=\"importance\",\n#                                            ascending=False))\n# plt.title('LightGBM Features (avg over folds)')\n# plt.tight_layout()\n# plt.savefig('lgbm_importances.png')","metadata":{"_uuid":"40b64481054fa71e692829c7039eccceb31b77fe","execution":{"iopub.status.busy":"2024-05-15T14:49:09.325539Z","iopub.execute_input":"2024-05-15T14:49:09.325935Z","iopub.status.idle":"2024-05-15T14:49:09.340495Z","shell.execute_reply.started":"2024-05-15T14:49:09.325864Z","shell.execute_reply":"2024-05-15T14:49:09.339393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# XGBoost","metadata":{}},{"cell_type":"code","source":"\n\n# # 假设 df_train 是你的训练数据集，df_test 是你的测试数据集\n# # 假设 target 是你的目标变量，df_train_columns 是你的特征列表\n\n# params = {\n#     'objective': 'reg:linear',  # 或者 'reg:squarederror' 如果你的版本支持\n#     'learning_rate': 0.01,\n#     'max_depth': 6,\n#     'min_child_weight': 1,\n#     'subsample': 0.8,\n#     'colsample_bytree': 0.8,\n#     'n_estimators': 10000,\n#     'seed': 4590,\n#     'verbosity': 1\n# }\n\n# folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=4590)\n# oof = np.zeros(len(df_train))\n# predictions = np.zeros(len(df_test))\n# feature_importance_df = pd.DataFrame()\n\n# for fold_, (trn_idx, val_idx) in enumerate(folds.split(df_train, df_train['outliers'].values)):\n#     print(\"fold {}\".format(fold_))\n    \n#     trn_data = xgb.DMatrix(df_train.iloc[trn_idx][df_train_columns], label=target.iloc[trn_idx])\n#     val_data = xgb.DMatrix(df_train.iloc[val_idx][df_train_columns], label=target.iloc[val_idx])\n    \n#     watchlist = [(trn_data, 'train'), (val_data, 'valid')]\n    \n#     clf = xgb.train(params, \n#                     trn_data, \n#                     num_boost_round=10000, \n#                     evals=watchlist, \n#                     early_stopping_rounds=100, \n#                     verbose_eval=100)\n    \n#     oof[val_idx] = clf.predict(xgb.DMatrix(df_train.iloc[val_idx][df_train_columns]), ntree_limit=clf.best_ntree_limit)\n    \n#     fold_importance_df = pd.DataFrame()\n#     fold_importance_df[\"Feature\"] = df_train_columns\n#     fold_importance_df[\"importance\"] = list(clf.get_score(importance_type='weight').values())\n#     fold_importance_df[\"fold\"] = fold_ + 1\n#     feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n    \n#     predictions += clf.predict(xgb.DMatrix(df_test[df_train_columns]), ntree_limit=clf.best_ntree_limit) / folds.n_splits\n\n# print(\"CV score: {:<8.5f}\".format(np.sqrt(mean_squared_error(oof, target))))","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:49:09.342245Z","iopub.execute_input":"2024-05-15T14:49:09.342745Z","iopub.status.idle":"2024-05-15T14:49:09.356271Z","shell.execute_reply.started":"2024-05-15T14:49:09.342649Z","shell.execute_reply":"2024-05-15T14:49:09.355248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"# 梯度提升","metadata":{}},{"cell_type":"code","source":"# 使用均值填充缺失值\ndf_train.fillna(df_train.mean(), inplace=True)\ndf_test.fillna(df_test.mean(), inplace=True)","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:49:09.358144Z","iopub.execute_input":"2024-05-15T14:49:09.358534Z","iopub.status.idle":"2024-05-15T14:50:24.179303Z","shell.execute_reply.started":"2024-05-15T14:49:09.358457Z","shell.execute_reply":"2024-05-15T14:50:24.178058Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold\nfrom sklearn.ensemble import GradientBoostingRegressor\nfrom sklearn.metrics import mean_squared_error\n\n\n# 假设 df_train 是你的训练数据集，df_test 是你的测试数据集\n# 假设 target 是你的目标变量，df_train_columns 是你的特征列表\n\n# 定义梯度提升回归器的参数\nparams = {\n    'n_estimators': 1000,\n    'learning_rate': 0.01,\n    'max_depth': 6,\n    'min_samples_split': 2,\n    'min_samples_leaf': 1,\n    'subsample': 0.8,\n    'random_state': 4590,\n    'verbose': 1\n}\n\n# 定义交叉验证\nfolds = StratifiedKFold(n_splits=5, shuffle=True, random_state=4590)\n\n# 初始化变量\noof = np.zeros(len(df_train))\npredictions = np.zeros(len(df_test))\nfeature_importance_df = pd.DataFrame()\n\n# 开始交叉验证\nfor fold_, (trn_idx, val_idx) in enumerate(folds.split(df_train, df_train['outliers'].values)):\n    print(\"fold {}\".format(fold_))\n    \n    trn_data = df_train.iloc[trn_idx][df_train_columns]\n    val_data = df_train.iloc[val_idx][df_train_columns]\n    \n    trn_target = target.iloc[trn_idx]\n    val_target = target.iloc[val_idx]\n    \n    # 训练模型\n    clf = GradientBoostingRegressor(**params)\n    clf.fit(trn_data, trn_target)\n    \n    # 预测并计算误差\n    oof[val_idx] = clf.predict(val_data)\n    fold_rmse = np.sqrt(mean_squared_error(val_target, oof[val_idx]))\n    print(f\"Fold {fold_} RMSE: {fold_rmse}\")\n    \n    # 特征重要性\n    fold_importance_df = pd.DataFrame()\n    fold_importance_df[\"Feature\"] = df_train_columns\n    fold_importance_df[\"importance\"] = clf.feature_importances_\n    fold_importance_df[\"fold\"] = fold_ + 1\n    feature_importance_df = pd.concat([feature_importance_df, fold_importance_df], axis=0)\n    \n    # 预测测试集并累加\n    predictions += clf.predict(df_test[df_train_columns]) / folds.n_splits\n\n# 输出交叉验证结果\ncv_rmse = np.sqrt(mean_squared_error(target, oof))\nprint(f\"CV RMSE: {cv_rmse}\")\n\n# 输出特征重要性\nprint(\"Feature importance:\")\nprint(feature_importance_df.groupby('Feature').mean().sort_values(by='importance', ascending=False))","metadata":{"execution":{"iopub.status.busy":"2024-05-15T14:50:24.181081Z","iopub.execute_input":"2024-05-15T14:50:24.181488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sub_df = pd.DataFrame({\"card_id\":df_test[\"card_id\"].values})\nsub_df[\"target\"] = predictions\nsub_df.to_csv(\"submission.csv\", index=False)","metadata":{"_uuid":"355e9c24949b8e5d677fe5a2f117228c3310dab6","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**To be continued ...**","metadata":{"_uuid":"58c9a5445698e42dfbd9548695290487a2ce171a"}}]}