lightgbm 是继xgboost后又一boost大杀器,此处是github链接.
xgboost 实质上只能接受数值型训练数据,因为其工作原理是对于每一个feature,首先对其所有取值预排序,然后遍历一遍找到最佳分割点。lightgbm采用分桶的思想加速了这一过程。
而lightgbm也可以处理标称型(类别)数据。通过指定'categorical_feature' 这一参数告诉它哪些feature是标称型的。它不需要将数据展开成独热码(one-hot),其原理是对特征的所有取值,做一个one-vs-others,从而找出最佳分割的那一个特征取值。
训练过程中出现了一个小error:
if self.categorical_feature == categorical_feature:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
查看lightgbm 参数说明
可以看到:
categorical_feature : list of str or int, or 'auto'
Categorical features,
type int represents index,
type str represents feature names (need to specify feature_name as well)
If 'auto' and data is pandas DataFrame, use pandas categorical columns
就是说,对于参数categorical_feature,当传入数据类型是pandas DataFrame时,可以指定auto;否则只能传入list,str,int 三者之一。
而我传入的数据类型是 numpy array,因此报错。
解决办法就是转成list, 即 arr.tolist()