7 python scikit-learn catboost
我使用此代码来测试 CatBoostClassifier。
import numpy as np
from catboost import CatBoostClassifier, Pool
# initialize data
train_data = np.random.randint(0, 100, size=(100, 10))
train_labels = np.random.randint(0, 2, size=(100))
test_data = Pool(train_data, train_labels) #What is Pool?When to use Pool?
# test_data = np.random.randint(0,100, size=(20, 10)) #Usually we will use numpy array,will not use Pool
model = CatBoostClassifier(iterations=2,
depth=2,
learning_rate=1,
loss_function='Logloss',
verbose=True)
# train the model
model.fit(train_data, train_labels)
# make the prediction using the resulting model
preds_class = model.predict(test_data)
preds_proba = model.predict_proba(test_data)
print("class = ", preds_class)
print("proba = ", preds_proba)
Run Code Online (Sandbox Code Playgroud)
关于Pool的描述是这样的:
CatBoost 中使用池作为训练模型的数据结构。
我想通常我们会使用numpy数组,不会使用Pool。
例如我们使用:
test_data = np.random.randint(0,100, size=(20, 10))
Run Code Online (Sandbox Code Playgroud)
我没有找到Pool的更多用法,所以我想知道什么时候我们会使用Pool而不是numpy数组?
小智 5
Catboost 仅适用于池,这是内部数据格式。如果你将 numpy 数组传递给它,它会先隐式地将其转换为 Pool,而不告诉你。如果您需要将多个公式应用于一个数据集,则使用 Pool 可以显着提高性能(例如 10 倍),因为您每次都会省略转换步骤。
小智 3
我对池的理解是,它只是一个方便的包装器,结合了特征、标签和进一步的元数据,如分类特征或基线。
虽然如果您首先构建池然后使用该池拟合模型并没有太大区别,但在保存训练数据方面却会产生很大影响。如果您单独保存所有信息,它可能会不同步,或者您可能会忘记某些内容,并且在加载时需要几行来加载所有内容。游泳池在这里非常方便。
请注意,拟合时您还可以将评估数据集指定为池。如果您想尝试多个评估数据集,将它们包装在单个对象中会非常方便 - 这就是池的用途。