2014-01-28 9 views
7

Я пытался выяснить пример использования случайного леса scikit в случайном лесу, и я не могу объяснить некоторые результаты, которые я вижу. В основном мне это нужно, чтобы сбалансировать проблему классификации с неуравновешенными классами. В частности, я ожидал, что если бы я использовал массив sample_weights всех 1, я бы получил тот же результат, что и w sample_weights = None. Кроме того, я высказал предположение, что любой массив равных весов (т. Е. Все 1с или все 10 или все 0,8 с ...) обеспечит тот же результат. Возможно, моя интуиция весов ошибочна в этом случае. Вот код:Использование scikit Random Forest sample_weights

import numpy as np 
from sklearn import ensemble,metrics, cross_validation, datasets 

#create a synthetic dataset with unbalanced classes 
X,y = datasets.make_classification(
n_samples=10000, 
n_features=20, 
n_informative=4, 
n_redundant=2, 
n_repeated=0, 
n_classes=2, 
n_clusters_per_class=2, 
weights=[0.9], 
flip_y=0.01, 
class_sep=1.0, 
hypercube=True, 
shift=0.0, 
scale=1.0, 
shuffle=True, 
random_state=0) 

model = ensemble.RandomForestClassifier() 

w0=1 #weight associated to 0's 
w1=1 #weight associated to 1's 

#I should split train and validation but for the sake of understanding sample_weights I'll skip this step 
model.fit(X, y,sample_weight=np.array([w0 if r==0 else w1 for r in y]))  
preds = model.predict(X) 
probas = model.predict_proba(X) 
ACC = metrics.accuracy_score(y,preds) 
precision, recall, thresholds = metrics.precision_recall_curve(y, probas[:, 1]) 
fpr, tpr, thresholds = metrics.roc_curve(y, probas[:, 1]) 
ROC = metrics.auc(fpr, tpr) 
cm = metrics.confusion_matrix(y,preds) 
print "ACCURACY:", ACC 
print "ROC:", ROC 
print "F1 Score:", metrics.f1_score(y,preds) 
print "TP:", cm[1,1], cm[1,1]/(cm.sum()+0.0) 
print "FP:", cm[0,1], cm[0,1]/(cm.sum()+0.0) 
print "Precision:", cm[1,1]/(cm[1,1]+cm[0,1]*1.1) 
print "Recall:", cm[1,1]/(cm[1,1]+cm[1,0]*1.1) 

С w0 = w1 = 1 Я получаю, например, F1 = 0.9456. С w0 = w1 = 10 получается, например, F1 = 0.9569. С sample_weights = None Я получаю F1 = 0.9474.

Спасибо,

G

ответ

7

С Лесным алгоритма Random, там, как следует из названия, некоторые "Random" Несс к нему.

Вы получаете различную оценку F1, потому что алгоритм Random Forest Algorithm (RFA) использует подмножество ваших данных для генерации деревьев решений и затем усреднение по всем вашим деревьям. Поэтому я не удивлен, что у вас есть похожие (но не идентичные) оценки F1 для каждого из ваших прогонов.

Я пробовал балансировать весы раньше. Вы можете попробовать балансировать веса по размеру каждого класса в населении. Например, если вы должны были иметь два класса, как, например:

Class A: 5 members 
Class B: 2 members 

Вы хотите, чтобы сбалансировать веса, назначая 2/7 для каждого из Class A «членов s и 5/7 для каждого из Class B» s членов , Тем не менее, это просто идея. Как вы оцениваете свои классы, будет зависеть от вашей проблемы.

+3

Как только я установил семя для случайного леса, все стало иметь смысл. – ADJ

+2

Если вы хотите установить вес класса, вы должны просто использовать необязательный параметр 'class_weight' в инициализации' RandomForestClassifier'. http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html – Hunle