楼主:
pipidog (如果狗狗飞上天)
2018-03-07 04:33:23※ 引述《OnePiecePR (OPPR)》之铭言:
: 这里有人玩 Kaggle 吗?
: 其实我还没认真坐坐下来学Python,也没其他程式经验。
: 只是朋友说Kaggle 很好玩,可以当作学 Python 的目标,建议每两周作一题,我就挑战
: 看看。
: 我做的是很久的题目,1460 笔房价资料,每笔资料79个特性。
: 训练后,要估另外1459笔资料回传让网站系统估算成绩。
: 我先花了四五天,整理资料(我以前 Excel 还可以),然后朋友丢一个 Lasso Regressi
: on给我,我马上套用,算一个结果就上传... 以为这样就算完成一题。
: 结果被打抢,Error message 我没看清楚。
: 那一版真的很差,预估值误差 rmse 将近35000。
: 再花了一周时间,重新再整一次资料,边研究别人的方法,大致加了两招:XGB 跟 K fol
: d 误差降低到15000 左右。我想大概是我的极限了。
: 过程中一直用的 bumpy,pandas,一下子 array, 一下子 dataframe, 花了不少时间处理
: ,应该乖乖坐下来搞懂才是。
一点想法:
1. 1460笔资料,却有79的feature,似乎太多了.你听过维度诅咒吗? 建议先作特征
选取,挑出最重要的20个feature(或者更少? 这你得试试看才知道)来作训练:
*你说你选择用Lasso Regression,不知是有目的的这样作还是随便挑的,因为Lasso
其实就是在loss里面加入了L1惩罚,L1会导致线性拟合的时候很多参数被强迫变
成0.这意味着你也认为这79个feature里面,其实只有几个是真正重要的.如果是
这样,何不一开始就先试著作特征选取? (事实上有时候Lasso就是拿来做特征选
取之用)
http://scikit-learn.org/stable/modules/feature_selection.html
2. 如果资料只有1千多笔,而网站又提供的另外的测试集了,建议训练时就不要再分
测试跟训练了. 你直接对全部的资料用corss-validation来判断模型表现,找出
好的超参数后,就拿全部资料训练模型就好.才一千多笔还分测试跟训练,贵了一点.
http://scikit-learn.org/stable/modules/cross_validation.html
3. 你的数据可能非线性程度高,用Lasso自然不好,试试看SVM(支援向量机)?
一般如果是回归问题,kernal多选用Radial basis function
http://scikit-learn.org/stable/modules/svm.html#regression
4. 没有一个模型不能解决的事情,如果有,就给它一堆模型! 所以你可以考虑ensemble
learning,例如random forest, adaboost,..,etc.多数情况下会比用单一模型好.
http://scikit-learn.org/stable/modules/ensemble.html
5. 最后找个网站,把pandas练熟,这东西没弄熟,洗资料会搞得你很痛苦.
https://ithelp.ithome.com.tw/users/20103511/ironman/1077?page=2
看一下14,15天.
* 最后,处理数据占90%的时间,训练模型只占10%,这是很正常的...越脏的事情越花时间
,不要觉得奇怪.
作者: vfgce (小兵) 2018-03-07 07:30:00
kaggle的测试集,通常不附target..没办法用cross-validationemsemble learning通常也没有比单一模型好很多..pandas真的要好好学,但sklearn最大问题在于对类别属性的处理不佳.pandas已经有category,但sklearn还无法使用目前只有Y能够以分类处理,X的部分都转成int,然后被转成
作者: vfgce (小兵) 2018-03-07 07:44:00
flaot去处理了.这是颇不合理的处理方式....用过R的大概知道我说的是什么..这部分希望sklearn能否直接支援pandas就方便多了.
作者: vfgce (小兵) 2018-03-07 17:07:00
所以你有一堆数值和类别混合的data,用python做真的会想XXXR内建有factor类别,套件也多能配合,用起来方便多了.明明sklearn是一个丰富的PACKAGE,当初怎没将这个考虑进去.用上决策树的感受特别明显.ONE HOT 也不是万灵丹,当属性含有很多类别时,会制造出更多属性,整个属性维度又更大.R内建的FACOTR,套件大多考虑到这一层,用起来方便多了.或许SKLEARN 只考虑到配合NUMPY使用,但这问题应该还多人都遇到了. 希望后面的版正能修正这个问题...