大家好,我是小寒
当天给大家分享处置不平衡数据集的罕用方法。
在开局之前,咱们先来了解一下什么是不平衡的数据集。
不平衡数据集是指在分类义务中,不同类别的样本数量差异清楚的数据集,通常体现为少数类样本远少于少数类样本。这样的数据集在事实生存中很经常出现,比如欺诈检测、医疗诊断、缺点预测等场景。
例如,在一个蕴含 10,000 个实例的数据集中,95% 属于一个类(类 0),只要 5% 属于另一个类(类 1),很清楚,模型或许会高度关注少数类,而经常齐全疏忽少数类。
不平衡数据的疑问
在不平衡的数据集中,少数类别主导着模型的预测,造成少数类别的预测功能较差。
例如,假设 95% 的数据被标志为 0 类,则将一实际例预测为 0 类可取得 95% 的准确率,即使 1 类预测齐全不正确。
示例:
思考一个欺诈检测系统,其中 99% 的买卖是非法的,只要 1% 是欺诈的。预测一切买卖均为非法的模型将到达 99% 的准确率,但不可检测就任何欺诈行为,使其不可到达预期目的。
让咱们经过一个例子来可视化不平衡数据
import numpy as npimport pandas as pdimport plotly.express as pxfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matriximport plotly.figure_factory as ff# Generate imbalanced,, 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, width=800, height=600, title_x=0.5)fig.show()
此代码生成一个不平衡的数据集,其中 95% 的实例被标志为类 0,只要 5% 被标志为类 1。
当咱们可视化类别散布时,咱们会看到两个类别之间的清楚不平衡。
Accuracy: 0.9815Precision: 0.8451Recall: 0.6977F1-score: 0.7643
混杂矩阵显示,只管准确率很高,但少数类(类1)的准确率和召回率要低得多。该模型倾向少数类。
import plotly.express as pxdf["Target"] = df["Target"].astype(str)fig = px.scatter(df, x='Feature 1', y='Feature 2', color='Target'," alt="图片">处置不平衡数据的技术
1.随机欠采样
随机欠采样是一种经过增加少数类样本的数量来平衡类散布的方法。
详细做法是随机选用局部少数类样本并将其移除,使得少数类和少数类的样本数量凑近平衡。
好处
缺陷
from imblearn.under_sampling import RandomUnderSamplerfrom collections import Counter# Use RandomUnderSampler to balance the, random_state=42)X_resampled, y_resampled = undersampler.fit_resample(X, y)# Check the original class distributionprint("Original class distribution:", Counter(y))# Check the new class distribution after undersamplingprint("New class distribution after undersampling:", Counter(y_resampled))X_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=42)# Train a simple logistic regression modelmodel = LogisticRegression(solver='liblinear')model.fit(X_train, y_train)# Make predictionsy_pred = model.predict(X_test)# Evaluate the modelaccuracy = accuracy_score(y_test, y_pred)print(f"Accuracy: {accuracy:.4f}")# Distribution of undersampled, y='Feature 2', color='Target'," alt="图片">2.随机过采样
随机过采样经过参与少数类样本的数量来平衡类散布。
经常出现的做法是随机复制少数类的样本,直到少数类样本的数量与少数类样本的数量相等。
好处
缺陷
from imblearn.over_sampling import RandomOverSampler# Check the original class distributionoriginal_class_distribution = Counter(y)print("Original class distribution:", original_class_distribution)# Initialize RandomOverSampleroversampler = RandomOverSampler(sampling_strategy='auto', random_state=42)# Apply random oversampling to balance the)model.fit(X_train, y_train)# Make predictionsy_pred = model.predict(X_test)# Evaluate the modelaccuracy = accuracy_score(y_test, y_pred)print(f"Accuracy: {accuracy:.4f}")df_resampled = pd.DataFrame(X_oversampled, columns=['Feature 1', 'Feature 2'])df_resampled['Target'] = y_oversampleddf_resampled["Target"] = df_resampled["Target"].astype(str)fig = px.scatter(df_resampled, x='Feature 1', y='Feature 2', color='Target'," alt="图片">SMOTE 是一种分解过采样方法,经过生成新的少数类样原本平衡数据集。
它不是便捷地复制现有的少数类样本,而是经过对现有少数类样本的特色启动插值,创立新样本。
详细来说,SMOTE 从少数类样本当选取一个样本和其最近邻样本,在它们之间生成新的分解样本。
好处
缺陷
from imblearn.over_sampling import SMOTE# Check the original class distributionoriginal_class_distribution = Counter(y)print("Original class distribution:", original_class_distribution)# Initialize SMOTEsmote = SMOTE(sampling_strategy='auto', random_state=42)# Apply SMOTE to balance the)model.fit(X_train, y_train)# Make predictionsy_pred = model.predict(X_test)# Evaluate the modelaccuracy = accuracy_score(y_test, y_pred)print(f"Accuracy: {accuracy:.4f}")df_resampled = pd.DataFrame(X_smote, columns=['Feature 1', 'Feature 2'])df_resampled['Target'] = y_smotedf_resampled["Target"] = df_resampled["Target"].astype(str)fig = px.scatter(df_resampled, x='Feature 1', y='Feature 2', color='Target'," alt="图片">4.老本敏感型学习
老本敏感型学习经过为分类失误调配不同的成原本处置数据不平衡疑问。
在不平衡数据集中,错分少数类的代价通常比少数类更高。老本敏感型学习经过在损失函数中引入老本矩阵来调整模型,使得少数类的错分类损失更大,从而疏导模型愈加关注少数类。
好处
缺陷:
from sklearn.tree import DecisionTreeClassifierfrom sklearn.metrics import classification_reportfrom imblearn.under_sampling import RandomUnderSamplerfrom collections import Counterfrom sklearn.datasets import make_classification# Create a mock imbalanced>
5.平衡随机森林
平衡随机森林是在随机森林的基础上改良的一种方法,针对不平衡数据集做了优化。
它经过在构建每棵决策树时,对少数类启动随机欠采样,确保每棵树的训练集都是平衡的。同时,它联合了随机森林的个性,经过多个弱分类器的集成来提高全体的预测才干。
好处
缺陷:
from imblearn.ensemble import BalancedRandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score# Split the>
起源:程序员学长 机器学习数据集样本