2017.11.14 JDD pandas xgboost
小结一下,保持头脑清醒,思路要清晰正确。
昨天按照预定的计划完成了首次submission,获知了几个重要信息。
昨天按照预定的计划完成了首次submission,获知了几个重要信息。
- 后台计算分数,对于没贷款的客户是按照0来计算,我用全部0的数据集去探了benchmark
对于这种分数计算方式,我有两种思路可以进行尝试:
- 先建一个分类模型去判断是否会贷款,然后对于未贷款的人预测为0,会贷款的人按照贷款客户训练出来的模型去预测会贷款的金额,但是这就涉及到要划定一个cutoff来判断贷款和未贷款,还有种具体操作手法就是,分类模型得到一个probability,然后用这个probability求一个期望贷款金额,p * 回归模型预测金额 + (1-p) * 0
- 直接设定未贷款客户的贷款金额为0,参与模型训练,我觉得这个是最简洁的方式,因为如果采用上面第一个思路的第二种期望贷款金额的计算,也会涉及最后的预测是一个金额,感觉上不如我第二种思路直接有效。
小结一下昨天的一些新技术和方法:
MySQL数据量大,group by效率低的问题始终没能解决,但是用纯pandas的方法去join表又有一些繁琐和零碎,还有一个具体问题是,我目前还不知道如何根据dataframe中datetime计算距离now()的天数,我最后采用了pandas和SQL共同处理的方式,其实pandas的方式虽然零碎,但是我把order表和click表处理后就基本上就剩下不多的join工作了,哦,对了,pandas的join也可以写在一个句子中啊,df.mergr().merger().merge()....写成这种链式结构。
df.fillna(value, inplace=True),series同样有fillna方法,s.fillna(s.mean(), inplace=True)。
DataFrame按字段去重,df.drop_duplicates(subset = ['uid','cate_id']),这个函数可以选取保留the first record还是the last record
若干Series组成DataFrame,pd.concat([serA,serB,serC,...], axis=1),如果是pd.DataFrame([serA,serB,serC,...]),这样的话,他是把这些series认成了行,其实也对,行本身也是一个series对象,不确定pd.DataFrame有没有简便地实现series的组合
df删除列, df.drop(['col1','col2'], axis=1, inplace=True)
其实关于inplace或者copy这个参数一般存在一个共性,就是一个方法一旦返回了一个dataframe,那他肯定创造了一个copy,相应地,这个方法一般有一个inplace或者copy的参数可供调整
xgb的使用,dtrain = xgb.DMatrix(x_train, y_train),生成dtrain结构,要转换成xgb适合的结构,这里x_train就是一个dataframe,y_train是一个array,应该series也是compatible的吧?
cv_result = xgb.cv(...)进行迭代,用CV的预设指标来评价,超过多少轮迭代如果没有进步,就得到最大迭代数,也就是树的棵树,然后xgb.train(dict(xgb_params, silent=1), dtrain, num_boost_round=num_boost_rounds)得到模型,model.predict进行预测,测试集也需要用xgb.DMatrix转换成DMatrix。
read_csv读取的时候用index_col=0来指定row index。对于没有headers的数据集读取,需要设置header = None,然后指定names = ['colA','colB']。to_csv忽略header使用的是header=False,忽略行index我记得是index=False
留言
張貼留言