Как взвешивать точки данных с помощью алгоритмов обучения sklearn - PullRequest
3 голосов
/ 07 мая 2019

Я хочу обучить алгоритм случайного леса или повышения градиента, используя sklearn. Данные, которые я имею, структурированы таким образом, что они имеют переменный вес для каждой точки данных, который соответствует количеству случаев, когда эта точка данных встречается в наборе данных. Есть ли способ придать склеарну этот вес во время тренировочного процесса, или мне нужно расширить свой набор данных до не взвешенной версии, которая имеет дублирующиеся точки данных, каждая из которых представлена ​​в отдельности?

1 Ответ

3 голосов
/ 08 мая 2019

Вы можете точно указать веса во время обучения этих классификаторов в 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)

Затем вы можете оценить свою модель по данным испытаний.

Теперь, к вашему последнему пункту, вы можете в этом примере пересчитать ваш тренировочный набор в соответствии с весами путем дублирования. Но в большинстве реальных примеров это может оказаться очень утомительным, потому что

  • вам нужно убедиться, что все ваши веса являются целыми числами для выполнения дублирования
  • вам придется бесполезно умножать размер ваших данных, который занимает много памяти и, скорее всего, замедлит процедуру обучения
...