kaggle竞赛实战5

接下来将两套方案得结果做数据拼接

读数据

   train_dict = pd.read_csv(\ preprocess/train_dict.csv\ ) 
     test_dict = pd.read_csv(\ preprocess/test_dict.csv\ ) 
     train_groupby = pd.read_csv(\ preprocess/train_groupby.csv\ ) 
     test_groupby = pd.read_csv(\ preprocess/test_groupby.csv\ ) 

删除重复项

     for co in train_dict.columns: 
         if co in train_groupby.columns and co!='card_id': 
             del train_groupby[co] 
     for co in test_dict.columns: 
         if co in test_groupby.columns and co!='card_id': 
             del test_groupby[co] 

拼接特征

     train = pd.merge(train_dict, train_groupby, how='left', on='card_id').fillna(0) 
     test = pd.merge(test_dict, test_groupby, how='left', on='card_id').fillna(0) 

数据保存与内存管理

     train.to_csv(\ preprocess/train.csv\ , index=False) 
     test.to_csv(\ preprocess/test.csv\ , index=False) 
      
     del train_dict, test_dict, train_groupby, test_groupby 
     gc.collect() 

开始建模部分!!!!!!!!!!!

先用随机森林

    train = pd.read_csv("preprocess/train.csv") 
     test = pd.read_csv("preprocess/test.csv") 

#提取特征名称

    features = train.columns.tolist() 
     features.remove(\ card_id\ ) 
     features.remove(\ target\ ) 
     featureSelect = features[:] 

#用person系数筛选,默认把这些都看成连续变量(只要不做独热编码就可以这么看)

     for fea in featureSelect: 
         corr.append(abs(train[[fea, 'target']].fillna(0).corr().values[0][1])) #从内向外依次取出这两列,填充0,计算相关矩阵,然后只要取右上角那个值就可以

     # 取top300的特征进行建模,具体数量可选 
     se = pd.Series(corr, index=featureSelect).sort_values(ascending=False) #以featureSelect为索引,按照值排序
     feature_select = ['card_id'] + se[:300].index.tolist() 

     # 输出结果 
     train = train[feature_select + ['target']] 
     test = test[feature_select] 

#用网格搜索进行参数调优

#导入包

  from sklearn.metrics import mean_squared_error 
     from sklearn.ensemble import RandomForestRegressor #随机森林分类器
     from sklearn.model_selection import GridSearchCV #网格搜索评估器

随机森林的参数有

     |criterion|规则评估指标或损失函数,默认基尼系数,可选信息熵|  
     |splitter|树模型生长方式,默认以损失函数取值减少最快方式生长,可选随机根据某条件进行划分| 
     |max_depth|树的最大生长深度,类似max_iter,即总共迭代几次|  
     |min_samples_split|内部节点再划分所需最小样本数|  
     |min_samples_leaf|叶节点包含最少样本数|  
     |min_weight_fraction_leaf|叶节点所需最小权重和|  
     |max_features|在进行切分时候最多带入多少个特征进行划分规则挑选| 
     |random_state|随机数种子|  
     |max_leaf_nodes|叶节点最大个数|  
     |min_impurity_decrease|数据集再划分至少需要降低的损失值|  
     |min_impurity_split|数据集再划分所需最低不纯度,将在0.25版本中移除|  
     |class_weight|各类样本权重|  

我们挑选n_estimators\ 几棵树、\ min_samples_leaf\ 、\ min_samples_split\ 、\ max_depth\ 和\ max_features\ 每次进行特征选择时所纳入考虑的最大特征数 这几个进行参数搜索

调参思路:用halving方法,其思路为凉凉比对,然后逐层筛选参数组合

   features = train.columns.tolist() 
     features.remove("card_id") 
     features.remove("target")

     parameter_space = { 
         " n_estimators" : [79, 80, 81],  
        ” min_samples_leaf”: [29, 30, 31], 
         "min_samples_split“: [2, 3], 
         "max_depth” : [9, 10], 
        "max_features“: [\ auto\ , 80] 
     } 

#构建参数评估其,然后输入其它参数取值

 clf = RandomForestRegressor( 
         criterion="mse" , 
         n_jobs=15, 
         random_state=22) 

#进行网格搜索

grid = GridSearchCV(clf, parameter_space, cv=2, scoring="neg_mean_squared_error") 
     grid.fit(train[features].values, train['target'].values) 

#拿最佳参数

grid.best_params_ 

#查看最优参数评估器

grid.best_estimator_

#查看在训练集上的最终评分

np.sqrt(-grid.best_score_)

目前评分3.69样子

#然后预测测试集结果并写入csv

test['target']=grid.best_estimator_.predict(test[features])

test[['card_id,'target']].to_csv("submission_randomforest.csv" , index=False)

结果大约3.4样子,至此完成了这个竞赛,后续更新优化方案

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值