Python sklearn class_weight传递平衡权重

时间:2017-08-14 09:08:42

标签: python scikit-learn random-forest

我从sklearn建立一个随机森林模型,我通常使用class_weight =" balance"在我的参数中(让我们称之为model_1)。

params={'class_weight': 'balanced',
 'max_depth': 10,
 'max_features': 'auto',
 'min_samples_leaf': 0.25,
 'min_samples_split': 0.25,
 'n_estimators': 50,
 'n_jobs': 6,
 'oob_score': True,
 'random_state': 21,
 'verbose': 1}

model_1 confusion matrix:
            -1    0    1  trueTotal
-1          86   67   59        212
0           31   43   32        106
1           74   80   61        215
predTotal  191  190  152        533

我注意到当我传入一个从sklearn.utils.class_weight.compute_class_weight计算的字典时使用" balanced"我的混淆矩阵与model_1&#39>匹配

 from sklearn.utils import class_weight
 keys = np.unique(tdf[targetName])
 values = class_weight.compute_class_weight("balanced", keys,     tdf[targetName].values)
 cw = dict(zip(keys, values))
 cw
 {-1: 0.86371284352215372, 0: 1.5802975885069266, 1: 0.82684563758389262}

 params1 = params.copy()
 params1["class_weight"] = cw
 model_2 confusion matrix
        -1  0  1  trueTotal
 -1         212  0  0        212
 0          106  0  0        106
 1          215  0  0        215
 predTotal  533  0  0        533

我真的只是想找一个关于我如何改变class_weight来尝试改进我对-1和1的真实预测并且惩罚-1和1的假阳性(0预测或0实际预测)的例子在给定以下成本矩阵的情况下,1和-1是好的。调整权重并不会产生我认为他们会这样做的预测现在我想知道我对class_weight的理解是否正确。

   cost matrix
        -1  0    1 
 -1     10  0  -10       
  0      0  0    0        
  1    -10  0   10        

**编辑**

为了澄清,class_weight.compute_class_weight(" balanced" ...)产生与n_samples /(n_classes * np.bincount(y))相同的值

y = np.where(tdf[targetName] == -1, 2, tdf[targetName])
len(y)/(3*np.bincount(y))
array([ 1.58029759,  0.82684564,  0.86371284])

当传入模型时,混淆矩阵与"平衡"不相同。

0 个答案:

没有答案