CatBoost可以对分类变量进行编码,这非常棒。但是,当类别特征包含np.nan形式的缺失值时,就无法对其进行处理。CatBoost文档中对此进行了说明:cb缺少值
然而,我在这个GitHub线程中读到,CatBoost实际上可以处理缺少值的分类变量。github线程
我尝试了一个小例子来测试它:
from catboost import CatBoostClassifier
# Initialize data
cat_features = [0, 1]
train_data = [["a", np.nan, 1, 4, 5, 6],
["a", "b", 4, 5, 6, 7],
["c", "d", 30, 40, 50, 60]]
train_labels = [1, 1, -1]
eval_data = [["a", "b", 2, 4, 6, 8],
["a", "d", 1, 4, 50, 60]]
# Initialize CatBoostClassifier
model = CatBoostClassifier(iterations=2,
learning_rate=1,
depth=2)
# Fit model
model.fit(train_data, train_labels, cat_features)
这里我们得到了错误,因为列0
为空:
CatBoostError: Invalid type for cat_feature[non-default value idx=0,feature_idx=1]=nan : cat_features must be integer or string, real number values and NaN values should be converted to string.
如何在不手动填充null值的情况下使此代码正常工作?
如果使用Catboost推荐的映射数据的Pool方法,实际上一切都很好。
train_data = Pool(data=[[1, np.nan, 5, 6],
[4, 5, 6, 7],
[30, 40, 50, 60]],
label=[1, 1, -1],
weight=[0.1, 0.2, 0.3])
model = CatBoostClassifier(iterations=10)
model.fit(train_data)
Learning rate set to 0.058839
0: learn: 0.6879920 total: 2.32ms remaining: 20.8ms
1: learn: 0.6815428 total: 2.63ms remaining: 10.5ms
2: learn: 0.6765119 total: 2.86ms remaining: 6.67ms
3: learn: 0.6715373 total: 3.86ms remaining: 5.8ms
4: learn: 0.6653022 total: 4.24ms remaining: 4.24ms
5: learn: 0.6591482 total: 5.83ms remaining: 3.88ms
6: learn: 0.6543562 total: 6.11ms remaining: 2.62ms
7: learn: 0.6496176 total: 6.34ms remaining: 1.59ms
8: learn: 0.6436669 total: 6.53ms remaining: 725us
9: learn: 0.6377932 total: 6.75ms remaining: 0us
<catboost.core.CatBoostClassifier at 0x14d60bdd8>
结论:catboost不提供函数性来处理分类变量中缺失的值。
原文:特征f是分类的,并且对于某个对象Obj.取值None
矩阵用于培训。包含对象Obj的特征f的值的列包含值None。
在训练期间,每个分类特征值被转换为字符串,以计算相应的哈希值。None值将转换为字符串None。
在训练之后,对文件执行预测。具有功能_f_的列包含值N/A,如果读取给panda,则该值将被解析为None。训练前的DataFrame。
在预测期间计算字符串N/A的散列值。此值不等于字符串None的哈希值。
因此,该模型没有将该值与训练数据集中的值进行核对,因此预测是不正确的。
由于在Python或任何其他语言中从文件中读取数据或将值转换为字符串时,无法保证浮点值和None值的字符串表示形式相同,因此需要使用字符串而不是浮点值和None值。
请参阅常见问题url:catboost常见问题