本文来源公众号“程序员学长”,仅用于学术分享,侵权删,干货满满。
原文链接:最强总结,机器学习中处理不平衡数据集的五种方法!!
今天给大家分享处理不平衡数据集的常用方法。
在开始之前,我们先来了解一下什么是不平衡的数据集。
不平衡数据集是指在分类任务中,不同类别的样本数量差异显著的数据集,通常表现为少数类样本远少于多数类样本。这样的数据集在现实生活中很常见,比如欺诈检测、医疗诊断、故障预测等场景。
例如,在一个包含 10,000 个实例的数据集中,95% 属于一个类(类 0),只有 5% 属于另一个类(类 1),很明显,模型可能会高度关注多数类,而经常完全忽略少数类。
不平衡数据的问题
在不平衡的数据集中,多数类别主导着模型的预测,导致少数类别的预测性能较差。
例如,如果 95% 的数据被标记为 0 类,则将所有实例预测为 0 类可获得 95% 的准确率,即使 1 类预测完全不正确。
示例:
考虑一个欺诈检测系统,其中 99% 的交易是合法的,只有 1% 是欺诈的。预测所有交易均为合法的模型将达到 99% 的准确率,但无法检测到任何欺诈行为,使其无法达到预期目的。
让我们通过一个例子来可视化不平衡数据
import numpy as np
import pandas as pd
import plotly.express as px
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix
import plotly.figure_factory as ff
# Generate imbalanced data
n_samples = 10000
class_0_ratio = 0.95
n_class_0 = int(n_samples * class_0_ratio)
n_class_1 = n_samples - n_class_0
X_class_0 = np.random.randn(n_class_0, 2)
X_class_1 = np.random.randn(n_class_1, 2) + 2 # Shift class 1 data
y_class_0 = np.zeros(n_class_0)
y_class_1 = np.ones(n_class_1)
X = np.concatenate((X_class_0, X_class_1), axis=0)
y = np.concatenate((y_class_0, y_class_1), axis=0)
# Create a Pandas DataFrame for easier handling
df = pd.DataFrame(X, columns=['Feature 1', 'Feature 2'])
df['Target'] = y
# Visualize class distribution
fig = px.histogram(df, x='Target', title='Class Distribution', width=800, height=600)
fig.update_layout(title_x=0.5)
fig.update_xaxes(tickvals=[0, 1], ticktext=['Class 0', 'Class 1'])
fig.show()
# Split data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Train a Logistic Regression model
model = LogisticRegression()
model.fit(X_train, y_train)
# Make predictions on the test set
y_pred = model.predict(X_test)
# Evaluate the model
accuracy = acc