机器学习笔记 - 在逻辑回归中使用分类权重处理不平衡数据

        逻辑回归是用于分类任务的监督 机器学习技术之一。大多数情况下,分类数据集会出现类别不平衡,某个类别的样本较多,而某些类别的样本数量非常少。使用不平衡的数据集进行模型构建会导致错误的预测,并且对具有更多样本的类更有利。了解类权重在逻辑回归中的重要性,以及为什么需要平衡类权重才能产生可​​靠的模型。

1、分类权重

        类权重是用于分类任务的术语,其中数据集的每个类别将根据每个类别的出现频率提供一定的权重。因此类权重将负责为梯度更新的所有类别赋予相等的权重。使用不平衡的类别权重将导致偏向数据中出现最多的类别。为了获得更可靠和无偏的分类模型,重要的是要有均匀的类权重分布。类权重的均匀分布也将产生各种参数,如精度、召回率和 F1 分数,因为类权重将被平衡。

        与不平衡类权重相关的主要问题是准确性。对于不平衡类权重,产生的准确度通常会很高,因为它会偏向于出现最多的类,因为它会考虑更高的类权重。

        假设正在使用医疗保健数据或业务驱动的数据,并且类别权重不平衡。因此,如果不解决数据中的类别不平衡问题,则会导致模型的误解。此外,某些参数(如假阳性和假阴性)将变为 0,因为模型将更倾向于频繁出现的类别。

        为了理解类权重的重要性,让我们考虑一个目标变量分布不平衡的分类数据集。

        这里使用了一个医疗保健数据集,让我们通过计数图分析目标变量的不均匀分布。

         可以看到目标变量非常不平衡,其中类 0 与类 1 相比具有更高的类权重。因此,让我们使用不平衡目标变量构建逻辑回归,并尝试评估模型中的某些参数。

X=df.drop('stroke',axis=1)
y=df['stroke']
from sklearn.model_selection import train_test_split
X_train,X_test,Y_train,Y_test=train_test_split(X,y,test_size=0.2,random_state=42)
from sklearn.linear_model import LogisticRegression
lr_imb=LogisticRegression(random_state=42)
lr_imb_model=lr_imb.fit(X_train,Y_train)
y_pred=lr_imb_model.predict(X_test)
print('Classification report of imbalanced logistic regression \n',classification_report(Y_test,y_pred))
 
 
plot_confusion_matrix(lr_imb_model,X_test,Y_test)

        从分类报告中我们可以观察到,权重较大的类的调和平均数(F1-score)更多,而权重较小的类的调和平均数等参数为0。此外,该模型产生了准确率得分为 94%,这意味着该模型会做出错误的预测,并且更倾向于频繁出现的类。所以这是与不平衡类权重相关的主要问题,结果证明平衡类权重以产生无偏且更可靠的模型。

2、平衡分类权重

        只需在逻辑回归模型中声明 class_weight 参数为平衡,即可使用逻辑回归模型平衡类权重。可以绕过标准参数自动平衡类权重,因为可以向数据中的每个类别提供每个类的平衡权重或随机权重。

(1)使用类权重的“平衡”参数

        逻辑回归模型正在拟合类别权重作为“平衡”的标准参数。该参数在 scikit-learn 模型中很容易获得。让我们看看如何使用此参数并获得逻辑回归模型并评估某些参数。

lr_bal=LogisticRegression(random_state=42,class_weight='balanced')
lr_bal_model=lr_bal.fit(X_train,Y_train)
y_pred_bal=lr_bal_model.predict(X_test)
print('Classification report for balanced classes \n',classification_report(Y_test,y_pred_bal))

plot_confusion_matrix(lr_bal_model,X_test,Y_test)

 

         可以看到,在拟合逻辑回归模型时使用平衡的类权重后,我们可以看到与不平衡模型相比,准确度有所降低,但较低出现类的调和平均值有所增加。精度、召回率和 F1 分数等其他参数也有所增加,这有助于机器学习工程师对模型进行适当的解释。 

        该模型可以进一步超调以产生更好的参数和性能。此外,如果混淆矩阵也被评估,我们可以看到我们能够产生正确的参数,如假阳性和假阴性,这表明模型不倾向于或偏向频繁出现的类别。

(2)使用字典作为参数平衡类权重

        类权重将使用字典来平衡,其中字典键是数据集的类,字典的键是分配给每个数据类的权重百分比。因此,让我们研究如何使用字典作为类权重的参数并评估模型的某些参数。

lr_bal2=LogisticRegression(random_state=42,class_weight={0: 0.2,1: 0.8}).fit(X_train,Y_train)
y_pred_bal2=lr_bal2.predict(X_test)
print(classification_report(Y_test,y_pred_bal2))

plot_confusion_matrix(lr_bal2,X_test,Y_test)

        因此,在数据中的类之间使用随机权重分布后,与使用“平衡”参数相比,我们看到模型准确性有所提高,但这里显示了类权重的平衡,百分比为 80 和 20。因此,如果类平衡相等或接近相等,则模型将产生与使用“平衡”参数获得的模型相似的性能。

        这就是类权重的不平衡和平衡对模型性能的影响。一般来说,使用平衡的数据来生成可靠的模型并从模型中获得正确的预测是一种很好的做法。现在让我们尝试了解正在为不同的类权重参数计算类权重。

3、计算不平衡类权重

        为了计算类权重,使用“compute_class_weight”内置函数,如下所示,相应地,少数类和多数类的类权重可以如下所示计算。

        # 使用 sklearn 计算权重

sklearn_weights1 = class_weight.compute_class_weight(class_weight=None,y=df['stroke'],classes=np.unique(y)) 
sklearn_weights1

         在这里我们可以看到,对于不平衡的类,分配给少数类和多数类的权重是相同的,这说明了模型对多数类的偏见。

(1)使用“balanced”参数后计算类权重

        使用“balanced”参数后可以计算类权重,如下所示。

sklearn_weights2 = class_weight.compute_class_weight(class_weight='balanced',y=df['stroke'],classes=np.unique(y)) 
Sklearn_weights2

        可以看到,与第 0 类相比,第 1 类具有较少的样本数,因此赋予了更多权重。因此,让我们尝试获得可以很容易解释的权重,如下所示。 

        与多数类相比,“平衡”参数为少数类提供了更多的权重,这有助于我们产生更好的可靠模型。

(3)使用字典作为参数计算类权重

        在这里,类权重将通过为每个数据类提供权重分布的随机百分比来计算,如下所示。

# 使用 sklearn 计算权重
dict1={0: 0.2,1: 0.8} 
sklearn_weights3 = class_weight.compute_class_weight(class_weight=dict1,y=df['stroke'],classes=np.unique(y)) 
sklearn_weights3

         在这里,我们可以看到指定的 20% 的权重应用于 0 类,80% 的权重应用于数据集的 1 类。现在让我们尝试解释如下所示的类权重,以便于理解。

4、小结

        类权重在任何分类机器学习模型中都起着非常重要的作用。所以我们看到了类权重和类权重的平衡对于获得一个可靠的模型是多么重要。类权重平衡对于获得可用于正确预测的无偏差模型非常重要。类别权重的不平衡导致了模型的错误预测和错误解释。因此,平衡类权重以获得可用于实时预测的可靠模型非常重要。

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/125757941