汉川市城乡建设局网站,阿里云网站建设方案,做的好的地方网站,合肥大型网站设计不平衡数据集是指一个类中的示例数量与另一类中的示例数量显著不同的情况。 例如在一个二元分类问题中#xff0c;一个类只占总样本的一小部分#xff0c;这被称为不平衡数据集。类不平衡会在构建机器学习模型时导致很多问题。不平衡数据集的主要问题之一是模型可能会偏向多数…不平衡数据集是指一个类中的示例数量与另一类中的示例数量显著不同的情况。 例如在一个二元分类问题中一个类只占总样本的一小部分这被称为不平衡数据集。类不平衡会在构建机器学习模型时导致很多问题。不平衡数据集的主要问题之一是模型可能会偏向多数类从而导致预测少数类的性能不佳。这是因为模型经过训练以最小化错误率并且当多数类被过度代表时模型倾向于更频繁地预测多数类。这会导致更高的准确率得分但少数类别得分较低。另一个问题是当模型暴露于新的、看不见的数据时它可能无法很好地泛化。这是因为该模型是在倾斜的数据集上训练的可能无法处理测试数据中的不平衡。在本文中我们将讨论处理不平衡数据集和提高机器学习模型性能的各种技巧和策略。将涵盖的一些技术包括重采样技术、代价敏感学习、使用适当的性能指标、集成方法和其他策略。通过这些技巧可以为不平衡的数据集构建有效的模型。处理不平衡数据集的技巧重采样技术是处理不平衡数据集的最流行方法之一。这些技术涉及减少多数类中的示例数量或增加少数类中的示例数量。欠采样可以从多数类中随机删除示例以减小其大小并平衡数据集。这种技术简单易行但会导致信息丢失因为它会丢弃一些多数类示例。过采样与欠采样相反过采样随机复制少数类中的示例以增加其大小。这种技术可能会导致过度拟合因为模型是在少数类的重复示例上训练的。SMOTE是一种更高级的技术它创建少数类的合成示例而不是复制现有示例。这种技术有助于在不引入重复项的情况下平衡数据集。代价敏感学习Cost-sensitive learning是另一种可用于处理不平衡数据集的技术。在这种方法中不同的错误分类成本被分配给不同的类别。这意味着与错误分类多数类示例相比模型因错误分类少数类示例而受到更严重的惩罚。在处理不平衡的数据集时使用适当的性能指标也很重要。准确性并不总是最好的指标因为在处理不平衡的数据集时它可能会产生误导。相反使用 AUC-ROC等指标可以更好地指示模型性能。集成方法例如 bagging 和 boosting也可以有效地对不平衡数据集进行建模。这些方法结合了多个模型的预测以提高整体性能。Bagging 涉及独立训练多个模型并对它们的预测进行平均而 boosting 涉及按顺序训练多个模型其中每个模型都试图纠正前一个模型的错误。重采样技术、成本敏感学习、使用适当的性能指标和集成方法是一些技巧和策略可以帮助处理不平衡的数据集并提高机器学习模型的性能。在不平衡数据集上提高模型性能的策略收集更多数据是在不平衡数据集上提高模型性能的最直接策略之一。通过增加少数类中的示例数量模型将有更多信息可供学习并且不太可能偏向多数类。当少数类中的示例数量非常少时此策略特别有用。生成合成样本是另一种可用于提高模型性能的策略。合成样本是人工创建的样本与少数类中的真实样本相似。这些样本可以使用 SMOTE等技术生成该技术通过在现有示例之间进行插值来创建合成示例。生成合成样本有助于平衡数据集并为模型提供更多示例以供学习。使用领域知识来关注重要样本也是一种可行的策略通过识别数据集中信息量最大的示例来提高模型性能。例如如果我们正在处理医学数据集可能知道某些症状或实验室结果更能表明某种疾病。通过关注这些例子可以提高模型准确预测少数类的能力。最后可以使用异常检测等高级技术来识别和关注少数类示例。这些技术可用于识别与多数类不同且可能是少数类示例的示例。这可以通过识别数据集中信息量最大的示例来帮助提高模型性能。在收集更多数据、生成合成样本、使用领域知识专注于重要样本以及使用异常检测等先进技术是一些可用于提高模型在不平衡数据集上的性能的策略。这些策略可以帮助平衡数据集为模型提供更多示例以供学习并识别数据集中信息量最大的示例。不平衡数据集的练习这里我们使用信用卡欺诈分类的数据集演示处理不平衡数据的方法 import pandas as pd import numpy as np from sklearn.preprocessing import RobustScaler from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn.metrics import confusion_matrix, classification_report,f1_score,recall_score,roc_auc_score, roc_curve import matplotlib.pyplot as plt import seaborn as sns from matplotlib import rc,rcParams import itertools import warnings warnings.filterwarnings(ignore, categoryDeprecationWarning) warnings.filterwarnings(ignore, categoryFutureWarning) warnings.filterwarnings(ignore, categoryUserWarning)读取数据 df pd.read_csv(creditcard.csv) df.head() print(Number of observations : ,len(df)) print(Number of variables : , len(df.columns)) #Number of observations : 284807 #Number of variables : 31查看数据集信息 df.info() class pandas.core.frame.DataFrame RangeIndex: 284807 entries, 0 to 284806 Data columns (total 31 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Time 284807 non-null float64 1 V1 284807 non-null float64 2 V2 284807 non-null float64 3 V3 284807 non-null float64 4 V4 284807 non-null float64 5 V5 284807 non-null float64 6 V6 284807 non-null float64 7 V7 284807 non-null float64 8 V8 284807 non-null float64 9 V9 284807 non-null float64 10 V10 284807 non-null float64 11 V11 284807 non-null float64 12 V12 284807 non-null float64 13 V13 284807 non-null float64 14 V14 284807 non-null float64 15 V15 284807 non-null float64 16 V16 284807 non-null float64 17 V17 284807 non-null float64 18 V18 284807 non-null float64 19 V19 284807 non-null float64 20 V20 284807 non-null float64 21 V21 284807 non-null float64 22 V22 284807 non-null float64 23 V23 284807 non-null float64 24 V24 284807 non-null float64 25 V25 284807 non-null float64 26 V26 284807 non-null float64 27 V27 284807 non-null float64 28 V28 284807 non-null float64 29 Amount 284807 non-null float64 30 Class 284807 non-null int64 dtypes: float64(30), int64(1) memory usage: 67.4 MB查看分类类别 f,axplt.subplots(1,2,figsize(18,8)) df[Class].value_counts().plot.pie(explode[0,0.1],autopct%1.1f%%,axax[0],shadowTrue) ax[0].set_title(dağılım) ax[0].set_ylabel() sns.countplot(Class,datadf,axax[1]) ax[1].set_title(Class) plt.show() rob_scaler RobustScaler() df[Amount] rob_scaler.fit_transform(df[Amount].values.reshape(-1,1)) df[Time] rob_scaler.fit_transform(df[Time].values.reshape(-1,1)) df.head()创建基类模型 X df.drop(Class, axis1) y df[Class] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.20, random_state123456) model LogisticRegression(random_state123456) model.fit(X_train, y_train) y_pred model.predict(X_test) accuracy accuracy_score(y_test, y_pred) print(Accuracy: %.3f%(accuracy))我们创建的模型的准确率评分为0.999。我们可以说我们的模型很完美吗混淆矩阵是一个用来描述分类模型的真实值在测试数据上的性能的表。它包含4种不同的估计值和实际值的组合。 def plot_confusion_matrix(cm, classes, titleConfusion matrix, cmapplt.cm.Blues): plt.rcParams.update({font.size: 19}) plt.imshow(cm, interpolationnearest, cmapcmap) plt.title(title,fontdict{size:16}) plt.colorbar() tick_marks np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation45,fontsize12,colorblue) plt.yticks(tick_marks, classes,fontsize12,colorblue) rc(font, weightbold) fmt .1f thresh cm.max() for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], fmt), horizontalalignmentcenter, colorred) plt.ylabel(True label,fontdict{size:16}) plt.xlabel(Predicted label,fontdict{size:16}) plt.tight_layout() plot_confusion_matrix(confusion_matrix(y_test, y_predy_pred), classes[Non Fraud,Fraud], titleConfusion matrix)•非欺诈类共进行了56875次预测其中56870次(TP)正确5次(FP)错误。•欺诈类共进行了87次预测其中31次(FN)错误56次(TN)正确。该模型可以预测欺诈状态准确率为0.99。但当检查混淆矩阵时欺诈类的错误预测率相当高。也就是说该模型正确地预测了非欺诈类的概率为0.99。但是非欺诈类的观测值的数量高于欺诈类的观测值的数量这拉搞了我们对准确率的计算并且我们更加关注的是欺诈类的准确率所以我们需要一个指标来衡量它的性能。选择正确的指标在处理不平衡数据集时选择正确的指标来评估模型的性能非常重要。传统指标如准确性、精确度和召回率可能不适用于不平衡的数据集因为它们没有考虑数据中类别的分布。经常用于不平衡数据集的一个指标是 F1 分数。F1 分数是精确率和召回率的调和平均值它提供了两个指标之间的平衡。计算如下F1 2 * (precision * recall) / (precision recall)另一个经常用于不平衡数据集的指标是 AUC-ROC。AUC-ROC 衡量模型区分正类和负类的能力。它是通过绘制不同分类阈值下的TPR与FPR来计算的。AUC-ROC 值的范围从 0.5随机猜测到 1.0完美分类。 print(classification_report(y_test, y_pred)) precision recall f1-score support 0 1.00 1.00 1.00 56875 1 0.92 0.64 0.76 87 accuracy 1.00 56962 macro avg 0.96 0.82 0.88 56962 weighted avg 1.00 1.00 1.00 56962返回对0(非欺诈)类的预测有多少是正确的。查看混淆矩阵56870 31 56901个非欺诈类预测其中56870个预测正确。0类的精度值接近1 (56870 / 56901)返回对1 (欺诈)类的预测有多少是正确的。查看混淆矩阵5 56 61个欺诈类别预测其中56个被正确估计。0类的精度为0.92 (56 / 61)可以看到差别还是很大的过采样通过复制少数类样本来稳定数据集。随机过采样:通过添加从少数群体中随机选择的样本来平衡数据集。如果数据集很小可以使用这种技术。可能会导致过拟合。randomoverampler方法接受sampling_strategy参数当sampling_strategy minority 被调用时它会增加minority类的数量使其与majority类的数量相等。我们可以在这个参数中输入一个浮点值。例如假设我们的少数群体人数为1000人多数群体人数为100人。如果我们说sampling_strategy 0.5少数类将被添加到500。 y_train.value_counts() 0 227440 1 405 Name: Class, dtype: int64 from imblearn.over_sampling import RandomOverSampler oversample RandomOverSampler(sampling_strategyminority) X_randomover, y_randomover oversample.fit_resample(X_train, y_train)采样后训练 model.fit(X_randomover, y_randomover) y_pred model.predict(X_test) plot_confusion_matrix(confusion_matrix(y_test, y_predy_pred), classes[Non Fraud,Fraud], titleConfusion matrix)应用随机过采样后训练模型的精度值为0.97出现了下降。但是从混淆矩阵来看模型的欺诈类的正确估计率有所提高。SMOTE 过采样:从少数群体中随机选取一个样本。然后为这个样本找到k个最近的邻居。从k个最近的邻居中随机选取一个将其与从少数类中随机选取的样本组合在特征空间中形成线段形成合成样本。 from imblearn.over_sampling import SMOTE oversample SMOTE() X_smote, y_smote oversample.fit_resample(X_train, y_train)使用SMOTE后的数据训练 model.fit(X_smote, y_smote) y_pred model.predict(X_test) accuracy accuracy_score(y_test, y_pred) plot_confusion_matrix(confusion_matrix(y_test, y_predy_pred), classes[Non Fraud,Fraud], titleConfusion matrix)可以看到与基线模型相比欺诈的准确率有所提高但是比随机过采样有所下降这可能是数据集的原因因为SMOTE采样会生成心的数据所以并不适合所有的数据集。总结在这篇文章中我们讨论了处理不平衡数据集和提高机器学习模型性能的各种技巧和策略。不平衡的数据集可能是机器学习中的一个常见问题并可能导致在预测少数类时表现不佳。本文介绍了一些可用于平衡数据集的重采样技术如欠采样、过采样和SMOTE。还讨论了成本敏感学习和使用适当的性能指标如AUC-ROC这可以提供更好的模型性能指示。处理不平衡的数据集是具有挑战性的但通过遵循本文讨论的技巧和策略可以建立有效的模型准确预测少数群体。重要的是要记住最佳方法将取决于特定的数据集和问题为了获得最佳结果可能需要结合各种技术。因此试验不同的技术并使用适当的指标评估它们的性能是很重要的。作者Emine Bozkuş