Я использую RandomForestClassifier sklearn для данных с сильно несбалансированными классами - много 0
и немногие из 1
.Меня интересует количество 1
с в прогнозе.Пример ( credit ):
# Load libraries
from sklearn.ensemble import RandomForestClassifier
import numpy as np
from sklearn import datasets
# Load data
iris = datasets.load_iris()
X = iris.data
y = iris.target
# Make class highly imbalanced by removing first 40 observations
X = X[46:,:]
y = y[46:]
# Create target vector indicating if class 0, otherwise 1
y = np.where((y == 0), 1, 0)
#split into training and testing
trainx = X[::2]
trainy = y[::2]
testx = X[1::2]
testy = y[1::2]
# Create decision tree classifer object
clf = RandomForestClassifier()
# Train model
clf.fit(trainx, trainy)
print(clf.predict(testx).sum())
Это возвращает 2. Это нормально, за исключением моих реальных данных, результат немного ниже, чем истинный ответ.Я хочу иметь дело с этим с помощью параметра class_weight
.Однако, когда я делаю:
clf = RandomForestClassifier(class_weight="balanced")
# Train model
clf.fit(trainx, trainy)
print(clf.predict(testx).sum())
, я получаю результат 0. То же самое, если я использую class_weight={1:10}
.Если я использую class_weight={1:.1}
, я снова получаю 2.
Я получаю похожее поведение на своих реальных данных: чем больше вес, который я придаю классу 1
, тем меньше 1
с я получаю в прогнозе.
Это противоположно ожидаемому поведению (и противоположно тому, что делает параметр class_weight
в svm ).Что тут происходит? Этот вопрос предполагает, что sklearn назначает метки классов по умолчанию, но это кажется странным.Почему бы не использовать метки классов, которые я ему дал?