如何使用 sklearn 训练算法对数据点进行加权

Posted

技术标签:

【中文标题】如何使用 sklearn 训练算法对数据点进行加权【英文标题】:How to weigh data points with sklearn training algorithms 【发布时间】:2019-09-25 12:40:51 【问题描述】:

我希望使用 sklearn 训练随机森林或梯度提升算法。我拥有的数据的结构方式是,它对每个数据点具有可变权重,该权重对应于数据点在数据集中出现的次数。有没有办法在训练过程中为 sklearn 赋予这个权重,或者我是否需要将我的数据集扩展为具有重复数据点的非加权版本,每个数据点都单独表示?

【问题讨论】:

您可以将该权重或出现频率作为一列包含在数据集中。 从逻辑上讲,我认为这行不通。预测时,该列将仅是该数据点的一个变量,而不是具有整个重复数据点,而该行中的每个变量都是等效的。 【参考方案1】:

scikit-learn 中训练这些分类器时,您绝对可以指定权重。具体来说,这发生在fit 步骤中。这是一个使用RandomForestClassifier 的示例,但GradientBoostingClassifier 也是如此:

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import numpy as np

data = load_breast_cancer()
X = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X,y, random_state = 42)

为了举例,我在这里定义了一些任意的权重:

weights = np.random.choice([1,2],len(y_train))

然后你可以用这些模型来拟合你的模型:

rfc = RandomForestClassifier(n_estimators = 20, random_state = 42)
rfc.fit(X_train,y_train, sample_weight = weights)

然后您可以根据您的测试数据评估您的模型。

现在,到最后一点,在此示例中,您可以根据权重通过重复对您的训练集进行重新采样。但在大多数现实世界的例子中,这最终可能会非常乏味,因为

您需要确保所有权重都是整数才能执行复制 您将不得不无用地增加数据的大小,这会消耗内存并且很可能会减慢训练过程

【讨论】:

以上是关于如何使用 sklearn 训练算法对数据点进行加权的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 为 NER 训练 NLP 对数线性模型

不同版本的 sklearn 给出完全不同的训练结果

有没有办法使用 SKlearn 获得滑动嵌套交叉验证?

如何用 Python 和 sklearn 编写多元对数回归?

[ML]简单的Normal Equation对数据点进行线性回归

python实战应用讲解-numpy专题篇常见问题解惑(十五)(附python示例代码)