我从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])
当传入模型时,混淆矩阵与"平衡"不相同。