class_imbalance_data_check#
数据检查,用于检查任何目标标签是否不平衡,或每个目标的取值数量是否低于 CV 折叠次数的 2 倍。
用于分类问题。
模块内容#
类摘要#
检查任何目标标签是否不平衡,或每个目标的取值数量是否低于 CV 折叠次数的 2 倍。用于分类问题。 |
目录#
- class evalml.data_checks.class_imbalance_data_check.ClassImbalanceDataCheck(threshold=0.1, min_samples=100, num_cv_folds=3, test_size=None)[源码]#
检查任何目标标签是否不平衡,或每个目标的取值数量是否低于 CV 折叠次数的 2 倍。用于分类问题。
- 参数
threshold (float) – 类别不平衡的最低阈值,低于此值将引发警告。此阈值通过比较每个类别中的样本数量与该类别样本数和多数类别样本数之和来计算。例如,一个多类别情况,类别 0、1 和 2 的样本数分别为 [900, 900, 100],类别 2 的阈值为 0.10 (100 / (900 + 100))。默认为 0.10。
min_samples (int) – 每个可接受类别的最小样本数。如果少数类别同时低于阈值和 min_samples,则认为这是严重不平衡。必须大于 0。默认为 100。
num_cv_folds (int) – 交叉验证折叠次数。必须为正数。选择 0 可忽略此警告。默认为 3。
test_size (None, float, int) – 测试集大小的百分比。用于在将数据分割为训练集和验证/测试集之前计算类别不平衡。
- 引发
ValueError – 如果阈值不在 0 到 0.5 之间
ValueError – 如果 min_samples 不大于 0
ValueError – 如果 CV 折叠次数为负数
ValueError – 如果 test_size 不在 0 到 1 之间
方法
- name(cls)#
返回描述数据检查的名称。
- validate(self, X, y)[源码]#
检查二分类和多分类问题中是否有任何目标标签不平衡超过阈值。
忽略目标标签中出现的 NaN 值。
- 参数
X (pd.DataFrame, np.ndarray) – 特征。忽略。
y (pd.Series, np.ndarray) – 要检查不平衡数据的目标标签。
- 返回值
- 如果类别不平衡小于阈值,则返回包含 DataCheckWarnings 的字典,
如果每个目标的取值数量低于 2 * num_cv_folds,则返回 DataCheckErrors。
- 返回类型
dict
示例
>>> import pandas as pd ... >>> X = pd.DataFrame() >>> y = pd.Series([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
在此二分类示例中,目标类别 0 的实例少于 10% (threshold=0.10),并且少于 2 * 交叉折叠次数 (2 * 3 = 6)。因此,作为类别不平衡数据检查的一部分,将同时返回警告和错误。此外,如果一个目标的出现次数少于 min_samples(默认为 100)并且低于阈值,则将引发严重类别不平衡警告。
>>> class_imb_dc = ClassImbalanceDataCheck(threshold=0.10) >>> assert class_imb_dc.validate(X, y) == [ ... { ... "message": "The number of instances of these targets is less than 2 * the number of cross folds = 6 instances: [0]", ... "data_check_name": "ClassImbalanceDataCheck", ... "level": "error", ... "code": "CLASS_IMBALANCE_BELOW_FOLDS", ... "details": {"target_values": [0], "rows": None, "columns": None}, ... "action_options": [] ... }, ... { ... "message": "The following labels fall below 10% of the target: [0]", ... "data_check_name": "ClassImbalanceDataCheck", ... "level": "warning", ... "code": "CLASS_IMBALANCE_BELOW_THRESHOLD", ... "details": {"target_values": [0], "rows": None, "columns": None}, ... "action_options": [] ... }, ... { ... "message": "The following labels in the target have severe class imbalance because they fall under 10% of the target and have less than 100 samples: [0]", ... "data_check_name": "ClassImbalanceDataCheck", ... "level": "warning", ... "code": "CLASS_IMBALANCE_SEVERE", ... "details": {"target_values": [0], "rows": None, "columns": None}, ... "action_options": [] ... } ... ]
在此多分类示例中,目标类别 0 在观察值中少于 30%,但如果只有 1 个 CV 折叠,所需的最小实例数为 2 * 1 = 2。因此,只会引发警告,而不会引发错误。
>>> y = pd.Series([0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2]) >>> class_imb_dc = ClassImbalanceDataCheck(threshold=0.30, min_samples=5, num_cv_folds=1) >>> assert class_imb_dc.validate(X, y) == [ ... { ... "message": "The following labels fall below 30% of the target: [0]", ... "data_check_name": "ClassImbalanceDataCheck", ... "level": "warning", ... "code": "CLASS_IMBALANCE_BELOW_THRESHOLD", ... "details": {"target_values": [0], "rows": None, "columns": None}, ... "action_options": [] ... }, ... { ... "message": "The following labels in the target have severe class imbalance because they fall under 30% of the target and have less than 5 samples: [0]", ... "data_check_name": "ClassImbalanceDataCheck", ... "level": "warning", ... "code": "CLASS_IMBALANCE_SEVERE", ... "details": {"target_values": [0], "rows": None, "columns": None}, ... "action_options": [] ... } ... ] ... >>> y = pd.Series([0, 0, 1, 1, 1, 1, 2, 2, 2, 2]) >>> class_imb_dc = ClassImbalanceDataCheck(threshold=0.30, num_cv_folds=1) >>> assert class_imb_dc.validate(X, y) == []