sklearn class_weight в случайном лесу делает противоположное тому, что я ожидаю - PullRequest
0 голосов
/ 28 января 2019

Я использую 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 назначает метки классов по умолчанию, но это кажется странным.Почему бы не использовать метки классов, которые я ему дал?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...