使用Scikit随机森林样本



我一直在试图找出Scikit的随机森林样本使用,我无法解释我看到的一些结果。从根本上讲,我需要它来平衡分类问题与不平衡的类。

尤其是我期望,如果我使用了所有1的sample_weights数组,我将获得与w sample_weights=None相同的结果。此外,我正在预计任何相等权重的阵列(即所有1s,或所有10s或所有0.8s ...)都会提供相同的结果。在这种情况下,我对体重的直觉可能是错误的。

这是代码:

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

带有随机森林算法,顾名思义,有一些"随机"。

您获得了不同的F1分数,因为随机森林算法(RFA)使用数据子集来生成决策树,然后在所有树上平均。因此,我并不感到惊讶,您的每次运行都有相似的(但相同的)F1得分。

我以前尝试过平衡权重。您可能需要尝试按照人口中每个班级的大小来平衡权重。例如,如果您要有两个类:

Class A: 5 members
Class B: 2 members

您可能希望通过为Class A的每个成员分配2/7的权重,而Class B的成员中的每个成员为5/7。不过,这只是一个起点。您的体重如何取决于您的问题。

相关内容

  • 没有找到相关文章

最新更新