如何对XGBoost模型进行参数调优 如何对机器学习xgboost中数据集不平衡进行处理

xgboost \u591a\u5206\u7c7b \u6807\u7b7e\u600e\u4e48\u8bbe\u7f6e

XGBoost\u53c2\u6570\u8c03\u4f18\u5b8c\u5168\u6307\u5357\uff08\u9644Python\u4ee3\u7801\uff09 \u8bd1\u6ce8\uff1a\u6587\u5185\u63d0\u4f9b\u4ee3\u7801\u8fd0\u884c\u7ed3\u5b9a\u5dee\u5f02\u8f7d\u5b8c\u6574\u4ee3\u7801\u7167\u53c2\u8003\u53e6\u5916\u6211\u81ea\u8ddf\u7740\u6559\u7a0b\u505a\u5019\u53d1\u73b0\u6211\u5e93\u89e3\u6790\u5b57\u7b26\u4e32\u7c7b\u578b\u7279\u5f81\u6240\u7528\u5176\u90e8\u7279\u5f81\u505a\u5177\u4f53\u6570\u503c\u8ddf\u6587\u7ae0\u53cd\u5e2e\u52a9\u7406\u89e3\u6587\u7ae0\u6240\u5bb6\u5176\u5b9e\u4fee\u6539\u4ee3\u7801\u5b9a\u8981\u5b8c\u5168\u8ddf\u7740\u6559\u7a0b\u505a~ ^0^ \u9700\u8981\u63d0\u524d\u5b89\u88c5\u5e93\uff1a \u7b80\u4ecb \u9884\u6d4b\u6a21\u578b\u8868\u73b0\u4e9b\u5c3d\u610f\u7528XGBoost\u5427XGBoost\u7b97\u73b0\u5df2\u7ecf\u6570\u636e\u5de5\u7a0b\u5e08\u91cd\u8981\u6b66\u5668\u79cd\u5341\u7cbe\u81f4\u7b97\u5904\u7406\u5404\u79cd\u89c4\u5219\u6570\u636e \u6784\u9020\u4f7f\u7528XGBoost\u6a21\u578b\u5341\u7b80\u5355\u63d0\u9ad8\u6a21\u578b\u8868\u73b0\u4e9b\u56f0\u96be(\u81f3\u5c11\u6211\u89c9\u5341\u7ea0\u7ed3)\u7b97\u4f7f\u7528\u51e0\u53c2\u6570\u6240\u63d0\u9ad8\u6a21\u578b\u8868\u73b0\u53c2\u6570\u8c03\u6574\u5341\u5fc5\u8981\u89e3\u51b3\u5b9e\u9645\u95ee\u9898\u5019\u4e9b\u95ee\u9898\u96be\u7b54\u2014\u2014\u9700\u8981\u8c03\u6574\u54ea\u4e9b\u53c2\u6570\u4e9b\u53c2\u6570\u8981\u8c03\u503c\u624d\u80fd\u8fbe\u7406\u60f3\u8f93 \u7bc7\u6587\u7ae0\u9002\u5408\u521a\u521a\u63a5\u89e6XGBoost\u9605\u8bfb\u7bc7\u6587\u7ae0\u6211\u53c2\u6570\u8c03\u4f18\u6280\u5de7\u53caXGboost\u76f8\u5173\u4e9b\u7528\u77e5\u8bc6\u53ca\u6211\u7528Python\u6570\u636e\u96c6\u5b9e\u8df5\u7b97 \u9700\u8981\u77e5\u9053 XGBoost(eXtreme Gradient Boosting)Gradient Boosting\u7b97\u4f18\u5316\u7248\u672c \u7279\u522b\u9e23\u8c22\uff1a\u6211\u5341\u8c22Mr Sudalai Rajkumar (aka SRK)\u795e\u652f\u6301\u76ee\u524dAV Rank\u4f4d\u5217\u7b2c\u4e8c\u6ca1\u5e2e\u52a9\u6ca1\u7bc7\u6587\u7ae0\u5e2e\u52a9\u6211\u624d\u80fd\u7ed9\u6570\u6570\u636e\u79d1\u5bb6\u6307\u70b9\u8ff7\u6d25\u7ed9\u8d5e \u5185\u5bb9\u5217\u8868 \u4e00\u3001XGBoost\u4f18\u52bf \u4e8c\u3001\u7406\u89e3XGBoost\u53c2\u6570 \u4e09\u3001\u8c03\u6574\u53c2\u6570(\u542b\u793a\u4f8b) \u4e00\u3001XGBoost\u4f18\u52bf XGBoost\u7b97\u7ed9\u9884\u6d4b\u6a21\u578b\u5e26\u80fd\u529b\u63d0\u5347\u6211\u8868\u73b0\u66f4\u89e3\u5019\u6211\u9ad8\u51c6\u786e\u7387\u80cc\u539f\u7406\u66f4\u89e3\u5019\u6211\u53d1\u73b0\u5177\u4f18\u52bf\uff1a \u4e00\u3001\u5219\u5316 \u6807\u51c6GBM\u5b9e\u73b0\u6ca1\u50cfXGBoost\u5219\u5316\u6b65\u9aa4\u5219\u5316\u51cf\u5c11\u62df\u5408\u5e2e\u52a9 \u5b9e\u9645XGBoost\u5219\u5316\u63d0\u5347(regularized boosting)\u6280\u672f\u95fb\u540d \u4e8c\u3001\u5e76\u884c\u5904\u7406 XGBoost\u5b9e\u73b0\u5e76\u884c\u5904\u7406\u76f8\u6bd4GBM\u901f\u5ea6\u98de\u8dc3 \u4f17\u6240\u5468\u77e5Boosting\u7b97\u987a\u5e8f\u5904\u7406\u80fd\u5e76\u884c\u5462\u6bcf\u8bfe\u6811\u6784\u9020\u90fd\u4f9d\u8d56\u4e8e\u524d\u68f5\u6811\u5177\u4f53\u8ba9\u6211\u80fd\u7528\u6838\u5904\u7406\u5668\u6784\u9020\u6811\u5462\u6211\u5e0c\u671b\u7406\u89e3\u53e5\u610f\u601d XGBoost \u652f\u6301Hadoop\u5b9e\u73b0 \u4e09\u3001\u9ad8\u5ea6\u7075\u6027 XGBoost \u5141\u8bb8\u7528\u6237\u5b9a\u4e49\u81ea\u5b9a\u4e49\u4f18\u5316\u76ee\u6807\u8bc4\u4ef7\u6807\u51c6 \u6a21\u578b\u589e\u52a0\u5168\u65b0\u7ef4\u5ea6\u6240\u6211\u5904\u7406\u53d7\u4efb\u4f55\u9650\u5236 \u56db\u3001\u7f3a\u5931\u503c\u5904\u7406 XGBoost\u5185\u7f6e\u5904\u7406\u7f3a\u5931\u503c\u89c4\u5219 \u7528\u6237\u9700\u8981\u63d0\u4f9b\u5176\u672c\u540c\u503c\u4f5c\u53c2\u6570\u4f20\u8fdb\u4f5c\u7f3a\u5931\u503c\u53d6\u503cXGBoost\u540c\u8282\u70b9\u9047\u7f3a\u5931\u503c\u91c7\u7528\u540c\u5904\u7406\u5e76\u4e14\u4e60\u672a\u9047\u7f3a\u5931\u503c\u5904\u7406 5\u3001\u526a\u679d \u88c2\u9047\u8d1f\u635f\u5931GBM\u505c\u6b62\u88c2GBM\u5b9e\u9645\u8d2a\u7b97 XGBoost\u76f4\u88c2\u6307\u5b9a\u6df1\u5ea6(max_depth)\u526a\u679d\u67d0\u8282\u70b9\u518d\u503c\u9664\u88c2 \u79cd\u505a\u4f18\u70b9\u8d1f\u635f\u5931\uff08-\u4e8c\uff09\u9762\u635f\u5931\uff08+\u4e000\uff09\u5019\u663e\u73b0GBM-\u4e8c\u5904\u505c\u9047\u8d1f\u503cXGBoost\u7ee7\u7eed\u88c2\u53d1\u73b0\u4e24\u88c2\u7efc\u5408\u8d77+\u5427\u4fdd\u7559\u4e24\u88c2 \u9646\u3001\u5185\u7f6e\u4ea4\u53c9\u9a8c\u8bc1 XGBoost\u5141\u8bb8\u6bcf\u8f6eboosting\u8fed\u4ee3\u4f7f\u7528\u4ea4\u53c9\u9a8c\u8bc1\u4fbf\u83b7\u4f18boosting\u8fed\u4ee3\u6570 GBM\u4f7f\u7528\u4e2d\u56fd\u683c\u641c\u7d22\u80fd\u68c0\u6d4b\u9650\u503c \u6f06\u3001\u5df2\u6a21\u578b\u57fa\u7840\u7ee7\u7eed XGBoost\u8f6e\u7ed3\u7ee7\u7eed\u8bad\u7ec3\u7279\u6027\u67d0\u4e9b\u7279\u5b9a\u5e94\u7528\u5de8\u4f18\u52bf sklearnGBM\u5b9e\u73b0\u529f\u80fd\u4e24\u79cd\u7b97\u70b9\u81f4 \u76f8\u4fe1\u5df2\u7ecfXGBoost\u5f3a\u529f\u80fd\u70b9\u6982\u5ff5\u6ce8\u610f\u6211\u81ea\u603b\u7ed3\u51e0\u70b9\u66f4\u60f3\u5c3d\u7ba1\u9762\u8bc4\u8bba\u6307\u6211\u66f4\u65b0\u5217\u8868 \u4e8c\u3001XGBoost\u53c2\u6570 XGBoost\u4f5c\u8005\u6240\u53c2\u6570\u4e09\u7c7b\uff1a \u4e00\u3001\u901a\u7528\u53c2\u6570\uff1a\u5b8f\u89c2\u51fd\u6570\u63a7\u5236 \u4e8c\u3001Booster\u53c2\u6570\uff1a\u63a7\u5236\u6bcf\u6b65booster(tree/regression) \u4e09\u3001\u4e60\u76ee\u6807\u53c2\u6570\uff1a\u63a7\u5236\u8bad\u7ec3\u76ee\u6807\u8868\u73b0 \u6211\u7c7b\u6bd4GBM\u8bb2\u89e3\u6240\u4f5c\u79cd\u57fa\u7840\u77e5\u8bc6 \u901a\u7528\u53c2\u6570 \u4e9b\u53c2\u6570\u7528\u63a7\u5236XGBoost\u5b8f\u89c2\u529f\u80fd \u4e00\u3001booster[\u9ed8\u8ba4gbtree] \u9009\u62e9\u6bcf\u8fed\u4ee3\u6a21\u578b\u4e24\u79cd\u9009\u62e9\uff1a gbtree\uff1a\u57fa\u4e8e\u6811\u6a21\u578b gbliner\uff1a\u7ebf\u6027\u6a21\u578b \u4e8c\u3001silent[\u9ed8\u8ba40] \u53c2\u6570\u503c\u4e00\u9759\u9ed8\u6a21\u5f0f\u542f\u8f93\u4efb\u4f55\u4fe1\u606f \u822c\u53c2\u6570\u4fdd\u6301\u9ed8\u8ba40\u80fd\u5e2e\u6211\u66f4\u7406\u89e3\u6a21\u578b \u4e09\u3001nthread[\u9ed8\u8ba4\u503c\u80fd\u7ebf\u7a0b\u6570] \u53c2\u6570\u7528\u8fdb\u884c\u7ebf\u7a0b\u63a7\u5236\u5e94\u8f93\u5165\u7cfb\u7edf\u6838\u6570 \u5e0c\u671b\u4f7f\u7528CPU\u5168\u90e8\u6838\u8981\u8f93\u5165\u53c2\u6570\u7b97\u81ea\u68c0\u6d4b \u4e24\u53c2\u6570XGBoost\u81ea\u8bbe\u7f6e\u76ee\u524d\u7528\u7ba1\u63a5\u54b1\u8d77\u770bbooster\u53c2\u6570 booster\u53c2\u6570 \u5c3d\u7ba1\u4e24\u79cdbooster\u4f9b\u9009\u62e9\u6211\u4ecb\u7ecdtree booster\u8868\u73b0\u8fdc\u8fdc\u80dclinear booster\u6240linear booster\u5c11\u7528 \u4e00\u3001eta[\u9ed8\u8ba40.\u4e09] GBM learning rate \u53c2\u6570\u7c7b\u4f3c \u901a\u51cf\u5c11\u6bcf\u6b65\u6743\u91cd\u63d0\u9ad8\u6a21\u578b\u9c81\u68d2\u6027 \u5178\u578b\u503c0.0\u4e00-0.\u4e8c \u4e8c\u3001min_child_weight[\u9ed8\u8ba4\u4e00] \u51b3\u5b9a\u53f6\u8282\u70b9\u672c\u6743\u91cd GBM min_child_leaf \u53c2\u6570\u7c7b\u4f3c\u5b8c\u5168XGBoost\u53c2\u6570\u672c\u6743\u91cdGBM\u53c2\u6570\u672c\u603b\u6570 \u53c2\u6570\u7528\u4e8e\u907f\u514d\u62df\u5408\u503c\u8f83\u907f\u514d\u6a21\u578b\u4e60\u5c40\u90e8\u7279\u6b8a\u672c \u503c\u9ad8\u5bfc\u81f4\u6b20\u62df\u5408\u53c2\u6570\u9700\u8981\u4f7f\u7528CV\u8c03\u6574 \u4e09\u3001max_depth[\u9ed8\u8ba4\u9646] GBM\u53c2\u6570\u76f8\u540c\u503c\u6811\u6df1\u5ea6 \u503c\u7528\u907f\u514d\u62df\u5408max_depth\u8d8a\u6a21\u578b\u66f4\u5177\u4f53\u66f4\u5c40\u90e8\u672c \u9700\u8981\u4f7f\u7528CV\u51fd\u6570\u8fdb\u884c\u8c03\u4f18 \u5178\u578b\u503c\uff1a\u4e09-\u4e000 \u56db\u3001max_leaf_nodes \u6811\u8282\u70b9\u6216\u53f6\u6570\u91cf \u66ff\u4ee3max_depth\u4f5c\u7528\u4e8c\u53c9\u6811\u6df1\u5ea6n\u6811 n\u4e8c \u53f6 \u5b9a\u4e49\u53c2\u6570GBM\u5ffd\u7565max_depth\u53c2\u6570 5\u3001gamma[\u9ed8\u8ba40] \u8282\u70b9\u88c2\u88c2\u635f\u5931\u51fd\u6570\u503c\u964d\u624d\u88c2\u8282\u70b9Gamma\u6307\u5b9a\u8282\u70b9\u88c2\u6240\u9700\u635f\u5931\u51fd\u6570\u964d\u503c \u53c2\u6570\u503c\u8d8a\u7b97\u8d8a\u4fdd\u5b88\u53c2\u6570\u503c\u635f\u5931\u51fd\u6570\u606f\u606f\u76f8\u5173\u6240\u9700\u8981\u8c03\u6574 \u9646\u3001max_delta_step[\u9ed8\u8ba40] \u53c2\u6570\u9650\u5236\u6bcf\u68f5\u6811\u6743\u91cd\u6539\u53d8\u6b65\u53c2\u6570\u503c0\u610f\u5473\u7740\u6ca1\u7ea6\u675f\u8d4b\u4e88\u67d0\u503c\u8ba9\u7b97\u66f4\u52a0\u4fdd\u5b88 \u901a\u53c2\u6570\u9700\u8981\u8bbe\u7f6e\u5404\u7c7b\u522b\u672c\u5341\u5e73\u8861\u903b\u8f91\u5f52\u5e2e\u52a9 \u53c2\u6570\u822c\u7528\u6316\u6398\u66f4\u7528\u5904 \u6f06\u3001subsample[\u9ed8\u8ba4\u4e00] GBMsubsample\u53c2\u6570\u6a21\u53c2\u6570\u63a7\u5236\u4e8e\u6bcf\u68f5\u6811\u968f\u673a\u91c7\u6bd4\u4f8b \u51cf\u53c2\u6570\u503c\u7b97\u66f4\u52a0\u4fdd\u5b88\u907f\u514d\u62df\u5408\u503c\u8bbe\u7f6e\u80fd\u5bfc\u81f4\u6b20\u62df\u5408 \u5178\u578b\u503c\uff1a0.5-\u4e00 \u5427\u3001colsample_bytree[\u9ed8\u8ba4\u4e00] GBM\u9762max_features\u53c2\u6570\u7c7b\u4f3c\u7528\u63a7\u5236\u6bcf\u68f5\u968f\u673a\u91c7\u5217\u6570\u5360\u6bd4(\u6bcf\u5217\u7279\u5f81) \u5178\u578b\u503c\uff1a0.5-\u4e00 9\u3001colsample_bylevel[\u9ed8\u8ba4\u4e00] \u7528\u63a7\u5236\u6811\u6bcf\u7ea7\u6bcf\u88c2\u5217\u6570\u91c7\u5360\u6bd4 \u6211\u822c\u592a\u7528\u53c2\u6570subsample\u53c2\u6570colsample_bytree\u53c2\u6570\u8d77\u76f8\u540c\u4f5c\u7528\u5174\u8da3\u6316\u6398\u53c2\u6570\u66f4\u7528\u5904 \u4e000\u3001lambda[\u9ed8\u8ba4\u4e00] \u6743\u91cdL\u4e8c\u5219\u5316\u9879(Ridge regression\u7c7b\u4f3c) \u53c2\u6570\u7528\u63a7\u5236XGBoost\u5219\u5316\u90e8\u867d\u90e8\u6570\u636e\u79d1\u5bb6\u5c11\u7528\u53c2\u6570\u53c2\u6570\u51cf\u5c11\u62df\u5408\u6316\u6398\u66f4\u7528\u5904 \u4e00\u4e00\u3001alpha[\u9ed8\u8ba4\u4e00] \u6743\u91cdL\u4e00\u5219\u5316\u9879(Lasso regression\u7c7b\u4f3c) \u5e94\u7528\u9ad8\u7ef4\u5ea6\u60c5\u51b5\u4f7f\u7b97\u901f\u5ea6\u66f4\u5feb \u4e00\u4e8c\u3001scale_pos_weight[\u9ed8\u8ba4\u4e00] \u5404\u7c7b\u522b\u672c\u5341\u5e73\u8861\u53c2\u6570\u8bbe\u5b9a\u503c\u4f7f\u7b97\u66f4\u5feb\u6536\u655b \u4e60\u76ee\u6807\u53c2\u6570 \u53c2\u6570\u7528\u63a7\u5236\u7406\u60f3\u4f18\u5316\u76ee\u6807\u6bcf\u6b65\u7ed3\u5ea6\u91cf \u4e00\u3001objective[\u9ed8\u8ba4reg:linear] \u53c2\u6570\u5b9a\u4e49\u9700\u8981\u5316\u635f\u5931\u51fd\u6570\u7528\u503c\uff1a binary:logistic \u4e8c\u7c7b\u903b\u8f91\u5f52\u8fd4\u9884\u6d4b\u6982\u7387(\u7c7b\u522b) multi:softmax \u4f7f\u7528softmax\u7c7b\u5668\u8fd4\u9884\u6d4b\u7c7b\u522b(\u6982\u7387) \u79cd\u60c5\u51b5\u9700\u8981\u8bbe\u53c2\u6570\uff1anum_class(\u7c7b\u522b\u6570\u76ee) multi:softprob multi:softmax\u53c2\u6570\u8fd4\u6bcf\u6570\u636e\u5c5e\u4e8e\u5404\u7c7b\u522b\u6982\u7387 \u4e8c\u3001eval_metric[\u9ed8\u8ba4\u503c\u53d6\u51b3\u4e8eobjective\u53c2\u6570\u53d6\u503c] \u4e8e\u6548\u6570\u636e\u5ea6\u91cf \u4e8e\u5f52\u95ee\u9898\u9ed8\u8ba4\u503crmse\u4e8e\u7c7b\u95ee\u9898\u9ed8\u8ba4\u503cerror \u5178\u578b\u503c\uff1a rmse \u5747\u6839\u8bef\u5dee( \u2211Ni=\u4e00?\u4e8cN??????\u221a ) mae \u5e73\u5747\u7edd\u8bef\u5dee( \u2211Ni=\u4e00|?|N ) logloss \u8d1f\u6570\u4f3c\u51fd\u6570\u503c error \u4e8c\u7c7b\u9519\u8bef\u7387(\u9608\u503c0.5) merror \u7c7b\u9519\u8bef\u7387 mlogloss \u7c7blogloss\u635f\u5931\u51fd\u6570 auc \u66f2\u7ebf\u9762\u79ef \u4e09\u3001seed(\u9ed8\u8ba40) \u968f\u673a\u6570\u79cd \u8bbe\u7f6e\u590d\u73b0\u968f\u673a\u6570\u636e\u7ed3\u7528\u4e8e\u8c03\u6574\u53c2\u6570 \u524d\u7528Scikit-learn,\u80fd\u592a\u719f\u6089\u4e9b\u53c2\u6570\u6d88\u606fpythonXGBoost\u6a21\u5757sklearn\u5305XGBClassifier\u5305\u53c2\u6570\u6309sklearn\u98ce\u683c\u547d\u540d\u6539\u53d8\u51fd\u6570\u540d\uff1a \u4e00\u3001eta ->learning_rate \u4e8c\u3001lambda->reg_lambda \u4e09\u3001alpha->reg_alpha \u80af\u5b9a\u7591\u60d1\u5565\u54b1\u6ca1\u4ecb\u7ecdGBM\u2019n_estimators\u2019\u7c7b\u4f3c\u53c2\u6570XGBClassifier\u786e\u5b9e\u7c7b\u4f3c\u53c2\u6570\u6807\u51c6XGBoost\u5b9e\u73b0\u8c03\u7528\u62df\u5408\u51fd\u6570\u4f5c\u2019num_boosting_rounds\u2019\u53c2\u6570\u4f20\u5165 \u8c03\u6574\u53c2\u6570(\u542b\u793a\u4f8b) \u6211\u5df2\u7ecf\u4e9b\u6570\u636e\u8fdb\u884c\u4e9b\u5904\u7406\uff1a City\u53d8\u91cf\u7c7b\u522b\u592a\u6240\u5220\u6389\u4e9b\u7c7b\u522b DOB\u53d8\u91cf\u6362\u7b97\u9f84\u5e76\u5220\u9664\u4e9b\u6570\u636e \u589e\u52a0 EMI_Loan_Submitted_Missing \u53d8\u91cfEMI_Loan_Submitted\u53d8\u91cf\u6570\u636e\u7f3a\u5931\u5219\u53c2\u6570\u503c\u4e00\u5426\u52190\u5220\u9664\u539f\u5148EMI_Loan_Submitted\u53d8\u91cf EmployerName\u53d8\u91cf\u7c7b\u522b\u592a\u6240\u5220\u6389\u4e9b\u7c7b\u522b Existing_EMI\u53d8\u91cf\u4e00\u4e00\u4e00\u503c\u7f3a\u5931\u6240\u7f3a\u5931\u503c\u8865\u5145\u4f4d\u65700 \u589e\u52a0 Interest_Rate_Missing \u53d8\u91cfInterest_Rate\u53d8\u91cf\u6570\u636e\u7f3a\u5931\u5219\u53c2\u6570\u503c\u4e00\u5426\u52190\u5220\u9664\u539f\u5148Interest_Rate\u53d8\u91cf \u5220\u9664Lead_Creation_Date\u76f4\u89c9\u7279\u5f81\u7ec8\u7ed3\u6ca1\u5e2e\u52a9 Loan_Amount_Applied, Loan_Tenure_Applied \u4e24\u53d8\u91cf\u7f3a\u9879\u7528\u4f4d\u6570\u8865\u8db3 \u589e\u52a0 Loan_Amount_Submitted_Missing \u53d8\u91cfLoan_Amount_Submitted\u53d8\u91cf\u6570\u636e\u7f3a\u5931\u5219\u53c2\u6570\u503c\u4e00\u5426\u52190\u5220\u9664\u539f\u5148Loan_Amount_Submitted\u53d8\u91cf \u589e\u52a0 Loan_Tenure_Submitted_Missing \u53d8\u91cf Loan_Tenure_Submitted \u53d8\u91cf\u6570\u636e\u7f3a\u5931\u5219\u53c2\u6570\u503c\u4e00\u5426\u52190\u5220\u9664\u539f\u5148 Loan_Tenure_Submitted \u53d8\u91cf \u5220\u9664LoggedIn, Salary_Account \u4e24\u53d8\u91cf \u589e\u52a0 Processing_Fee_Missing \u53d8\u91cf Processing_Fee \u53d8\u91cf\u6570\u636e\u7f3a\u5931\u5219\u53c2\u6570\u503c\u4e00\u5426\u52190\u5220\u9664\u539f\u5148 Processing_Fee \u53d8\u91cf Source\u524d\u4e24\u4f4d\u53d8\u5176\u540c\u7c7b\u522b \u8fdb\u884c\u91cf\u5316\u72ec\u70ed\u7f16\u7801(\u4f4d\u6548\u7f16\u7801) \u539f\u59cb\u6570\u636e\u8d44\u6e90\u5e93\u9762\u8f7ddata_preparationIpython notebook \u6587\u4ef6\u81ea\u904d\u4e9b\u6b65\u9aa4 \u9996\u5148import\u5fc5\u8981\u5e93\u52a0\u8f7d\u6570\u636e #Import libraries: import pandas as pd import numpy as np import xgboost as xgb from xgboost.sklearn import XGBClassifier from sklearn import cross_validation, metrics   #Additional     scklearn functions from sklearn.grid_search import GridSearchCV   #Perforing grid search import matplotlib.pylab as plt %matplotlib inline from matplotlib.pylab import rcParams rcParams['figure.figsize'] = \u4e00\u4e8c, \u56db train = pd.read_csv('train_modified.csv') target = 'Disbursed' IDcol = 'ID' \u6ce8\u610f\u6211import\u4e24\u79cdXGBoost\uff1a xgb - \u76f4\u63a5\u5f15\u7528xgboost\u63a5\u7528\u5176cv\u51fd\u6570 XGBClassifier - xgboostsklearn\u5305\u5305\u5141\u8bb8\u6211\u50cfGBM\u4f7f\u7528Grid Search \u5e76\u884c\u5904\u7406 \u5411\u8fdb\u884c\u524d\u6211\u5148\u5b9a\u4e49\u51fd\u6570\u5e2e\u52a9\u6211\u5efa\u7acbXGBoost models \u5e76\u8fdb\u884c\u4ea4\u53c9\u9a8c\u8bc1\u6d88\u606f\u76f4\u63a5\u7528\u9762\u51fd\u6570\u518d\u81eamodels\u4f7f\u7528 def modelfit(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50): if useTrainCV:    xgb_param = alg.get_xgb_params()    xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)    cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,        metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)    alg.set_params(n_estimators=cvresult.shape[0]) #Fit the algorithm on the data alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc') #Predict training set: dtrain_predictions = alg.predict(dtrain[predictors]) dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,\u4e00] #Print model report: print "\nModel Report" print "Accuracy : %.\u56dbg" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions) print "AUC Score (Train): %f" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob) feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False) feat_imp.plot(kind='bar', title='Feature Importances') plt.ylabel('Feature Importance Score') \u51fd\u6570GBM\u4f7f\u7528\u4e9b\u8bb8\u540c\u672c\u6587\u7ae0\u91cd\u70b9\u8bb2\u89e3\u91cd\u8981\u6982\u5ff5\u5199\u4ee3\u7801\u54ea\u7406\u89e3\u8bf7\u9762\u8bc4\u8bba\u8981\u538b\u529b\u6ce8\u610fxgboostsklearn\u5305\u6ca1feature_importance\u91cf\u5ea6get_fscore()\u51fd\u6570\u76f8\u540c\u529f\u80fd \u53c2\u6570\u8c03\u4f18\u822c \u6211\u4f7f\u7528GBM\u76f8\u4f3c\u9700\u8981\u8fdb\u884c\u6b65\u9aa4\uff1a \u4e00. \u9009\u62e9\u8f83\u9ad8\u4e60\u901f\u7387(learning rate)\u822c\u60c5\u51b5\u4e60\u901f\u7387\u503c0.\u4e00\u4e8e\u540c\u95ee\u9898\u7406\u60f3\u4e60\u901f\u7387\u50190.050.\u4e09\u95f4\u6ce2\u9009\u62e9\u5e94\u4e8e\u4e60\u901f\u7387\u7406\u60f3\u51b3\u7b56\u6811\u6570\u91cfXGBoost\u7528\u51fd\u6570cv\u51fd\u6570\u6bcf\u8fed\u4ee3\u4f7f\u7528\u4ea4\u53c9\u9a8c\u8bc1\u5e76\u8fd4\u7406\u60f3\u51b3\u7b56\u6811\u6570\u91cf \u4e8c. \u4e8e\u7ed9\u5b9a\u4e60\u901f\u7387\u51b3\u7b56\u6811\u6570\u91cf\u8fdb\u884c\u51b3\u7b56\u6811\u7279\u5b9a\u53c2\u6570\u8c03\u4f18(max_depth, min_child_weight, gamma, subsample, colsample_bytree)\u786e\u5b9a\u68f5\u6811\u7a0b\u6211\u9009\u62e9\u540c\u53c2\u6570\u5f85\u6211\u4e3e\u4f8b\u8bf4\u660e \u4e09. xgboost\u5219\u5316\u53c2\u6570\u8c03\u4f18(lambda, alpha)\u4e9b\u53c2\u6570\u964d\u4f4e\u6a21\u578b\u590d\u6742\u5ea6\u63d0\u9ad8\u6a21\u578b\u8868\u73b0 \u56db. \u964d\u4f4e\u4e60\u901f\u7387\u786e\u5b9a\u7406\u60f3\u53c2\u6570 \u54b1\u8d77\u8be6\u7ec6\u6b65\u6b65\u8fdb\u884c\u4e9b\u64cd\u4f5c \u7b2c\u6b65\uff1a\u786e\u5b9a\u4e60\u901f\u7387tree_based \u53c2\u6570\u8c03\u4f18\u4f30\u8ba1\u5668\u6570\u76ee \u786e\u5b9aboosting \u53c2\u6570\u6211\u8981\u5148\u7ed9\u5176\u53c2\u6570\u521d\u59cb\u503c\u54b1\u5148\u6309\u53d6\u503c\uff1a \u4e00\u3001max_depth = 5 :\u53c2\u6570\u53d6\u503c\u4e09-\u4e000\u95f4\u6211\u9009\u8d77\u59cb\u503c5\u9009\u62e9\u5176\u503c\u8d77\u59cb\u503c\u56db-\u9646\u95f4\u90fd\u9519\u9009\u62e9 \u4e8c\u3001min_child_weight = \u4e00:\u9009\u6bd4\u8f83\u503c\u6781\u5e73\u8861\u7c7b\u95ee\u9898\u67d0\u4e9b\u53f6\u8282\u70b9\u503c\u6bd4\u8f83 \u4e09\u3001gamma = 0: \u8d77\u59cb\u503c\u9009\u5176\u6bd4\u8f83\u503c0.\u4e000.\u4e8c\u95f4\u53c2\u6570\u7ee7\u8981\u8c03\u6574 \u56db\u3001subsample,colsample_bytree = 0.\u5427: \u89c1\u521d\u59cb\u503c\u5178\u578b\u503c\u8303\u56f40.5-0.9\u95f4 5\u3001scale_pos_weight = \u4e00: \u503c\u7c7b\u522b\u5341\u5e73\u8861 \u6ce8\u610f\u54e6\u9762\u4e9b\u53c2\u6570\u503c\u521d\u59cb\u4f30\u8ba1\u503c\u7ee7\u9700\u8981\u8c03\u4f18\u4e60\u901f\u7387\u8bbe\u9ed8\u8ba40.\u4e00\u7528xgboostcv\u51fd\u6570\u786e\u5b9a\u4f73\u51b3\u7b56\u6811\u6570\u91cf\u524d\u6587\u51fd\u6570\u5b8c\u5de5\u4f5c #Choose all predictors except target & IDcols predictors = [x for x in train.columns if x not in [target,IDcol]] xgb\u4e00 = XGBClassifier( learning_rate =0.\u4e00, n_estimators=\u4e00000, max_depth=5, min_child_weight=\u4e00, gamma=0, subsample=0.\u5427, colsample_bytree=0.\u5427, objective= 'binary:logistic', nthread=\u56db, scale_pos_weight=\u4e00, seed=\u4e8c\u6f06) modelfit(xgb\u4e00, train, predictors) \u8f93\u7ed3\u770b\u4e60\u901f\u73870.\u4e00\u7406\u60f3\u51b3\u7b56\u6811\u6570\u76ee\u4e00\u56db0\u6570\u5b57\u8a00\u80fd\u6bd4\u8f83\u9ad8\u53d6\u51b3\u4e8e\u7cfb\u7edf\u6027\u80fd \u6ce8\u610f\uff1aAUC(test)\u770b\u6d4b\u8bd5\u96c6AUC\u503c\u81ea\u7cfb\u7edf\u8fd0\u884c\u4e9b\u547d\u4ee4\u5e76\u73b0\u503c\u6570\u636e\u5e76\u516c\u63d0\u4f9b\u503c\u4ec5\u4f9b\u53c2\u8003\u503c\u4ee3\u7801\u90e8\u5df2\u7ecf\u5220\u6389kf/ware/vc/" target="_blank" class="keylink">vcD\u56dbNCjwvYmxvY\u4e8ctxdW90ZT\u56dbNCjxoMSBpZD0="\u7b2c\u4e8c\u6b65-maxdepth--minweight-\u53c2\u6570\u8c03\u4f18">\u7b2c\u4e8c\u6b65\uff1a max_depth min_weight \u53c2\u6570\u8c03\u4f18 \u6211\u5148\u4e24\u53c2\u6570\u8c03\u4f18\u7ec8\u7ed3\u5f71\u54cd\u9996\u5148\u6211\u5148\u8303\u56f4\u7c97\u8c03\u53c2\u6570\u518d\u8303\u56f4\u5fae\u8c03 \u6ce8\u610f\uff1a\u8282\u6211\u8fdb\u884c\u9ad8\u8d1f\u8377\u6805\u683c\u641c\u7d22(grid search)\u7a0b\u7ea6\u9700\u8981\u4e005-\u4e090\u949f\u751a\u81f3\u66f4\u4e45\u5177\u4f53\u53d6\u51b3\u4e8e\u7cfb\u7edf\u6027\u80fd\u6839\u636e\u81ea\u7cfb\u7edf\u6027\u80fd\u9009\u62e9\u540c\u503c param_test\u4e00 = { 'max_depth':range(\u4e09,\u4e000,\u4e8c), 'min_child_weight':range(\u4e00,\u9646,\u4e8c) } gsearch\u4e00 = GridSearchCV(estimator = XGBClassifier(         learning_rate =0.\u4e00, n_estimators=\u4e00\u56db0, max_depth=5, min_child_weight=\u4e00, gamma=0, subsample=0.\u5427,             colsample_bytree=0.\u5427, objective= 'binary:logistic', nthread=\u56db,     scale_pos_weight=\u4e00, seed=\u4e8c\u6f06), param_grid = param_test\u4e00,     scoring='roc_auc',n_jobs=\u56db,iid=False, cv=5) gsearch\u4e00.fit(train[predictors],train[target]) gsearch\u4e00.grid_scores_, gsearch\u4e00.best_params_,     gsearch\u4e00.best_score

\u3000
\u3000\u3000\u4f20\u7edfGBDTCART\u4f5c\u57fa\u7c7b\u5668xgboost\u652f\u6301\u7ebf\u6027\u7c7b\u5668\u5019xgboost\u76f8\u4e8e\u5e26L1L2\u5219\u5316\u9879\u903b\u8f91\u65af\u8482\u5f52\uff08\u7c7b\u95ee\u9898\uff09\u6216\u8005\u7ebf\u6027\u5f52\uff08\u5f52\u95ee\u9898\uff09
\u3000\u3000\u4f20\u7edfGBDT\u4f18\u5316\u7528\u9636\u5bfc\u6570\u4fe1\u606fxgboost\u5219\u4ee3\u4ef7\u51fd\u6570\u8fdb\u884c\u4e8c\u9636\u6cf0\u52d2\u5c55\u540c\u7528\u9636\u4e8c\u9636\u5bfc\u6570\u987a\u4fbf\u63d0xgboost\u5de5\u5177\u652f\u6301\u81ea\u5b9a\u4e49\u4ee3\u4ef7\u51fd\u6570\u8981\u51fd\u6570\u9636\u4e8c\u9636\u6c42\u5bfc
\u3000\u3000xgboost\u4ee3\u4ef7\u51fd\u6570\u52a0\u5165\u5219\u9879\u7528\u4e8e\u63a7\u5236\u6a21\u578b\u590d\u6742\u5ea6\u5219\u9879\u5305\u542b\u6811\u53f6\u8282\u70b9\u6570\u3001\u6bcf\u53f6\u8282\u70b9\u8f93scoreL2\u6a21\u5e73Bias-variance tradeoff\u89d2\u5ea6\u8bb2\u5219\u9879\u964d\u4f4e\u6a21\u578bvariance\u4f7f\u4e60\u6a21\u578b\u66f4\u52a0\u7b80\u5355\u9632\u6b62\u62df\u5408xgboost\u4f18\u4e8e\u4f20\u7edfGBDT\u7279\u6027
\u3000\u3000Shrinkage\uff08\u7f29\u51cf\uff09\u76f8\u4e8e\u4e60\u901f\u7387\uff08xgboosteta\uff09xgboost\u8fdb\u884c\u5b8c\u8fed\u4ee3\u53f6\u8282\u70b9\u6743\u91cd\u4e58\u8be5\u7cfb\u6570\u4e3b\u8981\u524a\u5f31\u6bcf\u68f5\u6811\u5f71\u54cd\u8ba9\u9762\u66f4\u4e60\u7a7a\u95f4\u5b9e\u9645\u5e94\u7528\u822ceta\u8bbe\u7f6e\u70b9\u8fed\u4ee3\u6570\u8bbe\u7f6e\u70b9\uff08\u8865\u5145\uff1a\u4f20\u7edfGBDT\u5b9e\u73b0\u4e60\u901f\u7387\uff09
\u3000\u3000\u5217\u62bd\uff08column subsampling\uff09xgboost\u501f\u9274\u968f\u673a\u68ee\u6797\u505a\u652f\u6301\u5217\u62bd\u4ec5\u80fd\u964d\u4f4e\u62df\u5408\u80fd\u51cf\u5c11\u8ba1\u7b97xgboost\u5f02\u4e8e\u4f20\u7edfgbdt\u7279\u6027

\u3000\u3000\u7f3a\u5931\u503c\u5904\u7406\u4e8e\u7279\u5f81\u503c\u7f3a\u5931\u672cxgboost\u81ea\u4e60\u88c2\u5411
\u3000\u3000xgboost\u5de5\u5177\u652f\u6301\u5e76\u884cboosting\u79cd\u4e32\u884c\u7ed3\u6784?\u5e76\u884c\u6ce8\u610fxgboost\u5e76\u884ctree\u7c92\u5ea6\u5e76\u884cxgboost\u8fed\u4ee3\u5b8c\u624d\u80fd\u8fdb\u884c\u8fed\u4ee3\uff08\u7b2ct\u8fed\u4ee3\u4ee3\u4ef7\u51fd\u6570\u5305\u542b\u524d\u9762t-1\u8fed\u4ee3\u9884\u6d4b\u503c\uff09xgboost\u5e76\u884c\u7279\u5f81\u7c92\u5ea6\u6211\u77e5\u9053\u51b3\u7b56\u6811\u4e60\u8017\u6b65\u9aa4\u7279\u5f81\u503c\u8fdb\u884c\u6392\u5e8f\uff08\u8981\u786e\u5b9a\u4f73\u5272\u70b9\uff09xgboost\u8bad\u7ec3\u524d\u9884\u5148\u6570\u636e\u8fdb\u884c\u6392\u5e8f\u4fdd\u5b58block\u7ed3\u6784\u9762\u8fed\u4ee3\u91cd\u590d\u4f7f\u7528\u7ed3\u6784\u51cf\u8ba1\u7b97\u91cfblock\u7ed3\u6784\u4f7f\u5e76\u884c\u80fd\u8fdb\u884c\u8282\u70b9\u88c2\u9700\u8981\u8ba1\u7b97\u6bcf\u7279\u5f81\u589e\u76ca\u7ec8\u9009\u589e\u76ca\u7279\u5f81\u505a\u88c2\u5404\u7279\u5f81\u589e\u76ca\u8ba1\u7b97\u7ebf\u7a0b\u8fdb\u884c

\u3000\u3000\u5e76\u884c\u8fd1\u4f3c\u76f4\u56fe\u7b97\u6811\u8282\u70b9\u8fdb\u884c\u88c2\u6211\u9700\u8981\u8ba1\u7b97\u6bcf\u7279\u5f81\u6bcf\u5272\u70b9\u5e94\u589e\u76ca\u5373\u7528\u8d2a\u679a\u4e3e\u6240\u80fd\u5272\u70b9\u6570\u636e\u8f7d\u5165\u5185\u5b58\u6216\u8005\u5e03\u5f0f\u60c5\u51b5\u8d2a\u7b97\u6548\u7387\u53d8\u4f4e\u6240xgboost\u63d0\u79cd\u5e76\u884c\u8fd1\u4f3c\u76f4\u56fe\u7b97\u7528\u4e8e\u9ad8\u6548\u5019\u9009\u5272\u70b9

XGBoost参数调优完全指南(附Python代码)
译注:文内提供的代码和运行结果有一定差异,可以从这里完整代码对照参考。另外,我自己跟着教程做的时候,发现我的库无法解析字符串类型的特征,所以只用其中一部分特征做的,具体数值跟文章中不一样,反而可以帮助理解文章。所以大家其实也可以小小修改一下代码,不一定要完全跟着教程做~ ^0^
需要提前安装好的库:简介如果你的预测模型表现得有些不尽如人意,那就用XGBoost吧。XGBoost算法现在已经成为很多数据工程师的重要武器。它是一种十分精致的算法,可以处理各种不规则的数据。
构造一个使用XGBoost的模型十分简单。但是,提高这个模型的表现就有些困难(至少我觉得十分纠结)。这个算法使用了好几个参数。所以为了提高模型的表现,参数的调整十分必要。在解决实际问题的时候,有些问题是很难回答的——你需要调整哪些参数?这些参数要调到什么值,才能达到理想的输出?
这篇文章最适合刚刚接触XGBoost的人阅读。在这篇文章中,我们会学到参数调优的技巧,以及XGboost相关的一些有用的知识。以及,我们会用Python在一个数据集上实践一下这个算法。你需要知道的XGBoost(eXtreme Gradient Boosting)是Gradient Boosting算法的一个优化的版本。特别鸣谢:我个人十分感谢Mr Sudalai Rajkumar (aka SRK)大神的支持,目前他在AV Rank中位列第二。如果没有他的帮助,就没有这篇文章。在他的帮助下,我们才能给无数的数据科学家指点迷津。给他一个大大的赞!内容列表1、XGBoost的优势
2、理解XGBoost的参数
3、调整参数(含示例)1、XGBoost的优势XGBoost算法可以给预测模型带来能力的提升。当我对它的表现有更多了解的时候,当我对它的高准确率背后的原理有更多了解的时候,我发现它具有很多优势:1、正则化标准GBM的实现没有像XGBoost这样的正则化步骤。正则化对减少过拟合也是有帮助的。 实际上,XGBoost以“正则化提升(regularized boosting)”技术而闻名。2、并行处理XGBoost可以实现并行处理,相比GBM有了速度的飞跃。 不过,众所周知,Boosting算法是顺序处理的,它怎么可能并行呢?每一课树的构造都依赖于前一棵树,那具体是什么让我们能用多核处理器去构造一个树呢?我希望你理解了这句话的意思。 XGBoost 也支持Hadoop实现。3、高度的灵活性XGBoost 允许用户定义自定义优化目标和评价标准 它对模型增加了一个全新的维度,所以我们的处理不会受到任何限制。4、缺失值处理XGBoost内置处理缺失值的规则。 用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。5、剪枝当分裂时遇到一个负损失时,GBM会停止分裂。因此GBM实际上是一个贪心算法。 XGBoost会一直分裂到指定的最大深度(max_depth),然后回过头来剪枝。如果某个节点之后不再有正值,它会去除这个分裂。 这种做法的优点,当一个负损失(如-2)后面有个正损失(如+10)的时候,就显现出来了。GBM会在-2处停下来,因为它遇到了一个负值。但是XGBoost会继续分裂,然后发现这两个分裂综合起来会得到+8,因此会保留这两个分裂。6、内置交叉验证XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。 而GBM使用网格搜索,只能检测有限个值。7、在已有的模型基础上继续XGBoost可以在上一轮的结果上继续训练。这个特性在某些特定的应用上是一个巨大的优势。 sklearn中的GBM的实现也有这个功能,两种算法在这一点上是一致的。相信你已经对XGBoost强大的功能有了点概念。注意这是我自己总结出来的几点,你如果有更多的想法,尽管在下面评论指出,我会更新这个列表的!2、XGBoost的参数XGBoost的作者把所有的参数分成了三类:
1、通用参数:宏观函数控制。
2、Booster参数:控制每一步的booster(tree/regression)。
3、学习目标参数:控制训练目标的表现。
在这里我会类比GBM来讲解,所以作为一种基础知识。通用参数这些参数用来控制XGBoost的宏观功能。1、booster[默认gbtree]选择每次迭代的模型,有两种选择:
gbtree:基于树的模型
gbliner:线性模型2、silent[默认0]当这个参数值为1时,静默模式开启,不会输出任何信息。 一般这个参数就保持默认的0,因为这样能帮我们更好地理解模型。3、nthread[默认值为最大可能的线程数]这个参数用来进行多线程控制,应当输入系统的核数。 如果你希望使用CPU全部的核,那就不要输入这个参数,算法会自动检测它。
还有两个参数,XGBoost会自动设置,目前你不用管它。接下来咱们一起看booster参数。booster参数尽管有两种booster可供选择,我这里只介绍tree booster,因为它的表现远远胜过linear booster,所以linear booster很少用到。1、eta[默认0.3]和GBM中的 learning rate 参数类似。 通过减少每一步的权重,可以提高模型的鲁棒性。 典型值为0.01-0.2。2、min_child_weight[默认1]决定最小叶子节点样本权重和。 和GBM的 min_child_leaf 参数类似,但不完全一样。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数。 这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。3、max_depth[默认6]和GBM中的参数相同,这个值为树的最大深度。 这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。 需要使用CV函数来进行调优。 典型值:3-104、max_leaf_nodes树上最大的节点或叶子的数量。 可以替代max_depth的作用。因为如果生成的是二叉树,一个深度为n的树最多生成n2个叶子。 如果定义了这个参数,GBM会忽略max_depth参数。5、gamma[默认0]在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。6、max_delta_step[默认0]这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的。 这个参数一般用不到,但是你可以挖掘出来它更多的用处。7、subsample[默认1]和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-18、colsample_bytree[默认1]和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。 典型值:0.5-19、colsample_bylevel[默认1]用来控制树的每一级的每一次分裂,对列数的采样的占比。 我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。10、lambda[默认1]权重的L2正则化项。(和Ridge regression类似)。 这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。11、alpha[默认1]权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。12、scale_pos_weight[默认1]在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。学习目标参数这个参数用来控制理想的优化目标和每一步结果的度量方法。1、objective[默认reg:linear]这个参数定义需要被最小化的损失函数。最常用的值有:
binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。 multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。
在这种情况下,你还需要多设一个参数:num_class(类别数目)。 multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。2、eval_metric[默认值取决于objective参数的取值]对于有效数据的度量方法。 对于回归问题,默认值是rmse,对于分类问题,默认值是error。 典型值有:
rmse 均方根误差(∑Ni=1?2N??????√) mae 平均绝对误差(∑Ni=1|?|N) logloss 负对数似然函数值 error 二分类错误率(阈值为0.5) merror 多分类错误率 mlogloss 多分类logloss损失函数 auc 曲线下面积3、seed(默认0)随机数的种子 设置它可以复现随机数据的结果,也可以用于调整参数如果你之前用的是Scikit-learn,你可能不太熟悉这些参数。但是有个好消息,python的XGBoost模块有一个sklearn包,XGBClassifier。这个包中的参数是按sklearn风格命名的。会改变的函数名是:
1、eta ->learning_rate
2、lambda->reg_lambda
3、alpha->reg_alpha
你肯定在疑惑为啥咱们没有介绍和GBM中的’n_estimators’类似的参数。XGBClassifier中确实有一个类似的参数,但是,是在标准XGBoost实现中调用拟合函数时,把它作为’num_boosting_rounds’参数传入。调整参数(含示例)我已经对这些数据进行了一些处理:City变量,因为类别太多,所以删掉了一些类别。 DOB变量换算成年龄,并删除了一些数据。 增加了 EMI_Loan_Submitted_Missing 变量。如果EMI_Loan_Submitted变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的EMI_Loan_Submitted变量。 EmployerName变量,因为类别太多,所以删掉了一些类别。 因为Existing_EMI变量只有111个值缺失,所以缺失值补充为中位数0。 增加了 Interest_Rate_Missing 变量。如果Interest_Rate变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的Interest_Rate变量。 删除了Lead_Creation_Date,从直觉上这个特征就对最终结果没什么帮助。 Loan_Amount_Applied, Loan_Tenure_Applied 两个变量的缺项用中位数补足。 增加了 Loan_Amount_Submitted_Missing 变量。如果Loan_Amount_Submitted变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的Loan_Amount_Submitted变量。 增加了 Loan_Tenure_Submitted_Missing 变量。如果 Loan_Tenure_Submitted 变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的 Loan_Tenure_Submitted 变量。 删除了LoggedIn, Salary_Account 两个变量 增加了 Processing_Fee_Missing 变量。如果 Processing_Fee 变量的数据缺失,则这个参数的值为1。否则为0。删除了原先的 Processing_Fee 变量。 Source前两位不变,其它分成不同的类别。 进行了量化和独热编码(一位有效编码)。如果你有原始数据,可以从资源库里面data_preparation的Ipython notebook 文件,然后自己过一遍这些步骤。首先,import必要的库,然后加载数据。#Import libraries:
import pandas as pd
import numpy as np
import xgboost as xgb
from xgboost.sklearn import XGBClassifier
from sklearn import cross_validation, metrics #Additional scklearn functions
from sklearn.grid_search import GridSearchCV #Perforing grid search

import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 12, 4

train = pd.read_csv('train_modified.csv')
target = 'Disbursed'
IDcol = 'ID'

注意我import了两种XGBoost:xgb - 直接引用xgboost。接下来会用到其中的“cv”函数。 XGBClassifier - 是xgboost的sklearn包。这个包允许我们像GBM一样使用Grid Search 和并行处理。在向下进行之前,我们先定义一个函数,它可以帮助我们建立XGBoost models 并进行交叉验证。好消息是你可以直接用下面的函数,以后再自己的models中也可以使用它。def modelfit(alg, dtrain, predictors,useTrainCV=True, cv_folds=5, early_stopping_rounds=50):
if useTrainCV:
xgb_param = alg.get_xgb_params()
xgtrain = xgb.DMatrix(dtrain[predictors].values, label=dtrain[target].values)
cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], nfold=cv_folds,
metrics='auc', early_stopping_rounds=early_stopping_rounds, show_progress=False)
alg.set_params(n_estimators=cvresult.shape[0])

#Fit the algorithm on the data
alg.fit(dtrain[predictors], dtrain['Disbursed'],eval_metric='auc')

#Predict training set:
dtrain_predictions = alg.predict(dtrain[predictors])
dtrain_predprob = alg.predict_proba(dtrain[predictors])[:,1]

#Print model report:
print "\nModel Report"
print "Accuracy : %.4g" % metrics.accuracy_score(dtrain['Disbursed'].values, dtrain_predictions)
print "AUC Score (Train): %f" % metrics.roc_auc_score(dtrain['Disbursed'], dtrain_predprob)

feat_imp = pd.Series(alg.booster().get_fscore()).sort_values(ascending=False)
feat_imp.plot(kind='bar', title='Feature Importances')
plt.ylabel('Feature Importance Score')

这个函数和GBM中使用的有些许不同。不过本文章的重点是讲解重要的概念,而不是写代码。如果哪里有不理解的地方,请在下面评论,不要有压力。注意xgboost的sklearn包没有“feature_importance”这个量度,但是get_fscore()函数有相同的功能。参数调优的一般方法。我们会使用和GBM中相似的方法。需要进行如下步骤:
选择较高的学习速率(learning rate)。一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。选择对应于此学习速率的理想决策树数量。XGBoost有一个很有用的函数“cv”,这个函数可以在每一次迭代中使用交叉验证,并返回理想的决策树数量。
2. 对于给定的学习速率和决策树数量,进行决策树特定参数调优(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在确定一棵树的过程中,我们可以选择不同的参数,待会儿我会举例说明。
3. xgboost的正则化参数的调优。(lambda, alpha)。这些参数可以降低模型的复杂度,从而提高模型的表现。
4. 降低学习速率,确定理想参数。咱们一起详细地一步步进行这些操作。第一步:确定学习速率和tree_based 参数调优的估计器数目。为了确定boosting 参数,我们要先给其它参数一个初始值。咱们先按如下方法取值:
1、max_depth = 5 :这个参数的取值最好在3-10之间。我选的起始值为5,但是你也可以选择其它的值。起始值在4-6之间都是不错的选择。
2、min_child_weight = 1:在这里选了一个比较小的值,因为这是一个极不平衡的分类问题。因此,某些叶子节点下的值会比较小。
3、gamma = 0: 起始值也可以选其它比较小的值,在0.1到0.2之间就可以。这个参数后继也是要调整的。
4、subsample,colsample_bytree = 0.8: 这个是最常见的初始值了。典型值的范围在0.5-0.9之间。
5、scale_pos_weight = 1: 这个值是因为类别十分不平衡。
注意哦,上面这些参数的值只是一个初始的估计值,后继需要调优。这里把学习速率就设成默认的0.1。然后用xgboost中的cv函数来确定最佳的决策树数量。前文中的函数可以完成这个工作。#Choose all predictors except target IDcols
predictors = [x for x in train.columns if x not in [target,IDcol]]
xgb1 = XGBClassifier(
learning_rate =0.1,
n_estimators=1000,
max_depth=5,
min_child_weight=1,
gamma=0,
subsample=0.8,
colsample_bytree=0.8,
objective= 'binary:logistic',
nthread=4,
scale_pos_weight=1,
seed=27)
modelfit(xgb1, train, predictors)
从输出结果可以看出,在学习速率为0.1时,理想的决策树数目是140。这个数字对你而言可能比较高,当然这也取决于你的系统的性能。注意:在AUC(test)这里你可以看到测试集的AUC值。但是如果你在自己的系统上运行这些命令,并不会出现这个值。因为数据并不公开。这里提供的值仅供参考。生成这个值的代码部分已经被删掉了。<喎?"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCjxoMSBpZD0="第二步-maxdepth-和-minweight-参数调优">第二步: max_depth 和 min_weight 参数调优我们先对这两个参数调优,是因为它们对最终结果有很大的影响。首先,我们先大范围地粗调参数,然后再小范围地微调。
注意:在这一节我会进行高负荷的栅格搜索(grid search),这个过程大约需要15-30分钟甚至更久,具体取决于你系统的性能。你也可以根据自己系统的性能选择不同的值。param_test1 = {
'max_depth':range(3,10,2),
'min_child_weight':range(1,6,2)
}
gsearch1 = GridSearchCV(estimator = XGBClassifier( learning_rate =0.1, n_estimators=140, max_depth=5,
min_child_weight=1, gamma=0, subsample=0.8, colsample_bytree=0.8,
objective= 'binary:logistic', nthread=4, scale_pos_weight=1, seed=27),
param_grid = param_test1, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch1.fit(train[predictors],train[target])
gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_

  • xgboost 濡備綍瀵绘壘鏈浼樼壒寰?
    绛旓細1. **鐗瑰緛閲嶈鎬**: XGBoost鍦ㄨ缁冭繃绋嬩腑浼氳绠楁瘡涓壒寰佺殑閲嶈鎬с傝繖涓噸瑕佹у彲浠ラ氳繃鏌ョ湅鏍戠粨鏋勬垨鑰呯洿鎺ユ煡鐪嬭缁冭繃绋嬩腑鐨勮緭鍑哄緱鍒般傞噸瑕佹ц秺楂橈紝璇ョ壒寰瀵规ā鍨鐨勮础鐚秺澶с備綘鍙互鏍规嵁杩欎釜閲嶈鎬у垎鏁伴夋嫨鍑洪噸瑕佺殑鐗瑰緛銆2. **鐗瑰緛閫夋嫨**: 鍦ㄥ疄闄呭簲鐢ㄤ腑锛屽彲鑳藉瓨鍦ㄥぇ閲忕殑鐗瑰緛锛岃繖鏃跺欏氨闇瑕杩涜鐗瑰緛閫夋嫨銆
  • XGBoost涓嶨BDT(涓)-鍑犵鏈浼樺寲鏂规硶瀵规瘮
    绛旓細鍙戠幇浜嗕綔鑰呯殑涓涓猵pt GBDT绠楁硶鍘熺悊涓庣郴缁熻璁$畝浠 ,浠庡ご澶嶄範浜嗕竴娉㈢浉鍏崇殑鍐呭,鍐欎袱绡囪褰曚笅鏉.浠庢牴鏈笂鏉ヨ, GBDT 涓XGBoost鏈澶х殑鍖哄埆鍦ㄤ簬浜岃呯敤鐨勪紭鍖栨柟娉曚笉涓鏍,鎵浠ヤ粠鍏堜粠鏈浼樺寲鏂规硶寮濮嬪涔.鏈浼樺寲闂閫氬父鍒嗕负涓や釜澶х被:鍦ㄦ満鍣ㄥ涔犱腑,鍏稿瀷鐨勫仛娉曞氨鏄夋嫨涓涓悎閫傜殑妯″瀷 ,瀵硅妯″瀷鐨勬崯澶卞嚱鏁 ...
  • xgboost閫氫織鐞嗚В
    绛旓細涓轰簡鏇村ソ鐨勮В閲xgboost绠楁硶锛屾垜浠繀椤诲畾涔変竴浜涘叕寮忎簡銆傞鍏堟槸妯″瀷鐨勯娴嬶細妯″瀷鐨勭洰鏍囧嚱鏁帮細缁间笂锛屾垜浠彲浠ュ皢鎹熷け鍑芥暟鐢ㄤ互涓嬪嚱鏁拌〃绀猴細浣嗘槸锛屾崯澶卞嚱鏁颁竴瀹氭槸浜屾鍑芥暟鍚楋紵濡傛灉涓嶆槸锛屽氨娉板嫆灞曞紑鎴愪簩娆★紝绠鍗曠矖鏆淬傚畠鑳屽悗鐨勬濊矾灏辨槸鍦ㄦ崯澶卞嚱鏁颁笂鎵ц姊害涓嬮檷锛岀劧鍚庣敤鍩哄涔犲櫒瀵瑰叾杩涜鎷熷悎銆傚綋姊害涓鸿礋鏃讹紝鎴戜滑绉...
  • GBDT鍜Xgboost鐨勫尯鍒槸浠涔?
    绛旓細涓昏鍖哄埆鍦ㄤ簬锛氫紭鍖栫洰鏍囦笉鍚岋細GBDT姣忔杩唬浼樺寲鐨勭洰鏍囨槸鎹熷け鍑芥暟鐨勬搴︼紝鑰Xgboost浼樺寲鐨勬槸鐩爣鍑芥暟鐨勭洰鏍囧笺傚涔犵巼涓嶅悓锛欸BDT娌℃湁瀛︿範鐜囪繖涓弬鏁帮紝鑰孹gboost鏈夈傝缁冭繃绋嬩笉鍚岋細GBDT鏄椽蹇冨湴杩涜杩唬璁粌锛屾瘡娆¤缁冮兘鏄湪涓婁竴娆妯″瀷鍩虹涓婅繘琛岀殑锛沊gboost鏈変袱绉嶈缁冭繃绋嬶紝涓绉嶆槸璐績鍦拌繘琛岃凯浠h缁冿紝鍙︿竴绉嶆槸...
  • XGBoost寤烘ā鏃堕棿
    绛旓細XGBoost寤烘ā鏃堕棿鏄2012骞淬俋GBoost锛圗xtreme GradientBoost锛夋ā鍨嬶紝鏄竴绉嶇壒娈婄殑姊害鎻愬崌鍐崇瓥鏍戯紙GBDT锛孏radient Boosting Decision Tree锛夛紝xgboost鏄崕鐩涢】澶у鍗氬+闄堝ぉ濂囧垱閫犵殑涓涓搴︽彁鍗囷紙Gradient Boosting锛夌殑寮婧愭鏋躲傚彧涓嶈繃鏄姏姹傚皢閫熷害鍜屾晥鐜囧彂鎸ュ埌浜嗘瀬鑷达紝鏁呭彨X锛圗xtreme锛塯radientboost銆俋gboost鍏舵湰璐ㄤ笂...
  • xgboost 濡備綍瀵绘壘鏈浼樼壒寰?
    绛旓細XGBoost鏄竴绉嶅熀浜庢搴︽彁鍗囩殑鏈哄櫒瀛︿範绠楁硶锛屽畠鍙互閫氳繃瀵绘壘鏈浼樼壒寰佹潵鎻愰珮妯″瀷鐨勬ц兘銆備互涓嬫槸涓浜涘父鐢ㄧ殑鏂规硶锛1. 鐗瑰緛閲嶈鎬ц瘎浼帮細XGBoost鎻愪緵浜嗕竴绉嶅熀浜庢爲缁撴瀯鐨勭壒寰侀噸瑕佹ц瘎浼版柟娉曪紝鍙互鐢ㄤ簬纭畾鍝簺鐗瑰緛瀵规ā鍨棰勬祴鐨勮础鐚渶澶с傝鏂规硶鍩轰簬姣忎釜鐗瑰緛鍦ㄦ爲涓浣跨敤鐨勬鏁板拰姣忔浣跨敤璇ョ壒寰佹椂鎵甯︽潵鐨勫鐩婃潵璁$畻...
  • 绠杩版爲妯″瀷涔嬪喅绛栨爲銆侀殢鏈烘.鏋椼xgboost
    绛旓細鍥犳妯″瀷浼樺寲涔熸槸杩欐牱涓涓鎵炬渶浣冲钩琛$偣鐨勮繃绋嬨傚喅绛栨爲鏄竴绉嶆爲鐘剁粨鏋勶紝瀹冪殑姣忎釜鍙惰妭鐐瑰搴斾竴涓垎绫伙紝闈炲彾鑺傜偣瀵瑰簲鍦ㄦ煇涓睘鎬т笂鐨勫垝鍒嗭紝鏍规嵁鏍锋湰鍦ㄨ灞炴т笂鐨勪笉鍚屽彇鍊煎垝鍒嗘垚鑻ュ共瀛愰泦銆傛瀯閫犲喅绛栨爲鐨勬牳蹇冮棶棰樻槸姣忎竴姝ュ鏍锋湰灞炴濡備綍鍋氭媶鍒嗐瀵逛簬涓涓垎绫婚棶棰橈紝浠庡凡鐭ユ暟鎹仛璁粌锛岀敓浜у喅绛栨爲鏄竴涓嚜涓婅屼笅...
  • xgboost 涓 model.predict 涓 model.get_booster()棰勬祴缁撴灉涓轰粈涔堜笉涓...
    绛旓細1. 浜叉祴0.71鐗堟湰璁粌鍑烘潵鐨妯″瀷锛岀敤0.90鐗堟湰鐨剎gb棰勬祴锛岀粨鏋滀笉涓鑷 2. 鍚屼竴鐗堟湰涓媘odel.get_booster().predict涓巑odel.predict棰勬祴缁撴灉涓轰粈涔堜笉涓鑷村憿?鐪嬩笂鍘讳篃娌℃湁闂锛寈gb涓嶆槸宸茬粡璁剧疆缂哄け鍊间簡鍚楋紝涓轰粈涔堥娴嬬粨鏋滀笉涓鏍峰憿锛熶範鎯х殑鏈夐棶棰樼洿鎺ョ湅婧愮爜锛岃蛋杩涙簮鐮佹垜浠竴璧锋帰璁ㄧ湡鐩搞傝В鏋愭簮鐮佸厛鐪嬬湅model...
  • xgboost绌洪棿娑堣楀皬
    绛旓細杩欐槸鍥犱负鍐崇瓥鏍戞槸涓绉嶉潪鍙傛暟妯″瀷锛岄氳繃鍒嗘敮鍜岃妭鐐规潵琛ㄧず鏁版嵁鐨勭壒寰侊紝鑰屼笉鏄敤鐭╅樀琛ㄧず鏉冮噸銆2銆佸帇缂╂妧鏈細XGBoost瀹炵幇浜嗕竴浜涘帇缂╂妧鏈潵鍑忓皬妯″瀷鐨勫唴瀛樺崰鐢ㄣ備緥濡傦紝浣跨敤浜嗙█鐤忕煩闃佃〃绀烘爲妯″瀷鐨勫垎瑁傜偣锛屼互鍙婁娇鐢ㄤ簡鎸夊垪瀛樺偍鐨勬暟鎹粨鏋勬潵鍑忓皯鍐呭瓨鍗犵敤銆3銆佸唴瀛樼鐞嗭細XGBoost鍦ㄥ唴瀛樼鐞嗘柟闈杩涜浜嗕紭鍖栥備娇鐢ㄤ簡鍒嗗潡...
  • 濡備綍鍦≒ython涓婂畨瑁xgboost
    绛旓細瀹夎 棣栧厛瀹夎XGBoost鐨凜++鐗堟湰锛岀劧鍚庤繘鍏ユ簮鏂囦欢鐨勬牴鐩綍涓嬬殑 wrappers鏂囦欢澶规墽琛屽涓嬭剼鏈畨瑁匬ython妯″潡 python setup.py install 瀹夎瀹屾垚鍚庢寜鐓у涓嬫柟寮忓鍏GBoost鐨凱ython妯″潡 import xgboost as xgb = 鏁版嵁鎺ュ彛 XGBoost鍙互鍔犺浇libsvm鏍煎紡鐨勬枃鏈暟鎹紝鍔犺浇鐨勬暟鎹牸寮忓彲浠ヤ负Numpy鐨勪簩缁存暟缁勫拰XGBoost鐨勪簩杩涘埗鐨...
  • 扩展阅读:python xgboost ... xgboost模型改进 ... xgboost svm ... xgboost交叉验证 ... messagebox show ... xgboost回归模型java ... xgbix ... xgboost训练过程 ... xgboost流程图 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网