幸福感预测 Task14:集成学习案例一( 四 )


至此 , 我们构建完成了三种特征工程(训练数据集) , ①是上面提取的最重要的49中特征 , 其中包括健康程度、社会阶级、在同龄人中的收入情况等等特征 。②是扩充后的263维特征(这里可以认为是初始特征) 。③是使用哦one-hot编码后的特征 , 这里使用one-hot进行编码的原因在于 , 有部分特征为分离值 , 例如性别中男女 , 男为1 , 女为2 , 我们想使用one-hot将其变为男为0 , 女为1 , 来增强机器学习算法的鲁棒性能;再如民族这个特征 , 原本是1-56这56个数值 , 如果直接分类会让分类器的鲁棒性变差 , 所以使用one-hot编码将其变为6个特征进行非零即一的处理 。
6. 特征建模
三组特征可以分别进行建模 , 每组特征又可以用多种建模方法进行组合 , 选择效果最好的方法 。
首先 , 对于扩充后的263维特征 , 分别使用 ,  , r , essor , 进行建模 , 得到五种模型 。
6.1 263维数据建模
##### lgb_263 ##lightGBM决策树lgb_263_param = {'num_leaves': 7, 'min_data_in_leaf': 20, #叶子可能具有的最小记录数'objective':'regression','max_depth': -1,'learning_rate': 0.003,"boosting": "gbdt", #用gbdt算法"feature_fraction": 0.18, #例如 0.18时 , 意味着在每次迭代中随机选择18%的参数来建树"bagging_freq": 1,"bagging_fraction": 0.55, #每次迭代时用的数据比例"bagging_seed": 14,"metric": 'mse',"lambda_l1": 0.1005,"lambda_l2": 0.1996, "verbosity": -1}folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=4)#交叉切分:5oof_lgb_263 = np.zeros(len(X_train_263))predictions_lgb_263 = np.zeros(len(X_test_263))for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train_263, y_train)):print("fold n°{}".format(fold_+1))trn_data = http://www.kingceram.com/post/lgb.Dataset(X_train_263[trn_idx], y_train[trn_idx])val_data = lgb.Dataset(X_train_263[val_idx], y_train[val_idx])#train:val=4:1num_round = 10000lgb_263 = lgb.train(lgb_263_param, trn_data, num_round, valid_sets = [trn_data, val_data], verbose_eval=500, early_stopping_rounds = 800)oof_lgb_263[val_idx] = lgb_263.predict(X_train_263[val_idx], num_iteration=lgb_263.best_iteration)predictions_lgb_263 += lgb_263.predict(X_test_263, num_iteration=lgb_263.best_iteration) / folds.n_splitsprint("CV score: {:<8.8f}".format(mean_squared_error(oof_lgb_263, target)))
##### xgb_263#xgboostxgb_263_params = {'eta': 0.02,#lr'max_depth': 6,'min_child_weight':3,#最小叶子节点样本权重和'gamma':0, #指定节点分裂所需的最小损失函数下降值 。'subsample': 0.7,#控制对于每棵树 , 随机采样的比例'colsample_bytree': 0.3,#用来控制每棵随机采样的列数的占比 (每一列是一个特征) 。'lambda':2,'objective': 'reg:linear', 'eval_metric': 'rmse', 'silent': True, 'nthread': -1}folds = KFold(n_splits=5, shuffle=True, random_state=2019)oof_xgb_263 = np.zeros(len(X_train_263))predictions_xgb_263 = np.zeros(len(X_test_263))for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train_263, y_train)):print("fold n°{}".format(fold_+1))trn_data = http://www.kingceram.com/post/xgb.DMatrix(X_train_263[trn_idx], y_train[trn_idx])val_data = xgb.DMatrix(X_train_263[val_idx], y_train[val_idx])watchlist = [(trn_data, 'train'), (val_data, 'valid_data')]xgb_263 = xgb.train(dtrain=trn_data, num_boost_round=3000, evals=watchlist, early_stopping_rounds=600, verbose_eval=500, params=xgb_263_params)oof_xgb_263[val_idx] = xgb_263.predict(xgb.DMatrix(X_train_263[val_idx]), ntree_limit=xgb_263.best_ntree_limit)predictions_xgb_263 += xgb_263.predict(xgb.DMatrix(X_test_263), ntree_limit=xgb_263.best_ntree_limit) / folds.n_splitsprint("CV score: {: