深入解析sklearn的make_classification创建三类不平衡分类数据集实战在机器学习实践中高质量的数据集是算法验证和模型训练的基础。当我们需要测试分类算法在不平衡数据上的表现时手动创建符合特定需求的数据集就显得尤为重要。scikit-learn提供的make_classification函数是一个强大的工具它允许我们生成各种复杂度的分类数据集包括样本数量不平衡的多类数据集。1. make_classification函数核心参数解析make_classification是scikit-learn中用于生成模拟分类数据集的函数它提供了丰富的参数来控制数据的分布特性。让我们先了解其中最关键的一些参数from sklearn.datasets import make_classification # 基础参数示例 X, y make_classification( n_samples1250, # 总样本量 n_features20, # 特征总数 n_informative5, # 有效特征数 n_redundant2, # 冗余特征数 n_classes3, # 类别数 weights[0.8, 0.15, 0.05], # 类别权重 flip_y0.01, # 随机噪声比例 random_state42 # 随机种子 )1.1 控制数据结构的参数n_informative真正对分类有贡献的特征数量。这些特征将用于构建分类的超平面。n_redundant由信息特征线性组合生成的特征数量增加了数据的真实感。n_repeated直接从信息特征和冗余特征中复制的特征数量。# 特征类型对分类的影响比较 import pandas as pd params { 仅信息特征: {n_informative: 5, n_redundant: 0, n_repeated: 0}, 含冗余特征: {n_informative: 3, n_redundant: 2, n_repeated: 0}, 含重复特征: {n_informative: 3, n_redundant: 1, n_repeated: 1} } results [] for desc, config in params.items(): X, y make_classification(n_samples1000, n_features5, **config, random_state42) # 这里可以添加分类性能评估代码 results.append({配置: desc, 特征类型: str(config)}) pd.DataFrame(results)1.2 控制类别不平衡的参数weights每个类别的相对比例。例如[0.8, 0.15, 0.05]将生成80%、15%和5%的三个类别。n_clusters_per_class每个类别由多少个簇组成增加此值会使类别分布更复杂。注意当设置不平衡权重时确保weights数组的和为1.0否则sklearn会自动进行归一化处理。2. 创建三类不平衡数据集实战现在让我们按照题目要求创建一个三类不平衡数据集样本数分别为1000、200和50。2.1 数据集生成代码from sklearn.datasets import make_classification import matplotlib.pyplot as plt import numpy as np # 生成三类不平衡数据集 X, y make_classification( n_samples1250, # 1000200501250 n_features2, # 二维特征方便可视化 n_informative2, # 两个有效特征 n_redundant0, # 无冗余特征 n_classes3, # 三个类别 weights[0.8, 0.16, 0.04], # 对应1000,200,50 class_sep1.5, # 控制类别间距 flip_y0.02, # 加入少量噪声 random_state42 ) # 查看各类样本数量 unique, counts np.unique(y, return_countsTrue) print(dict(zip(unique, counts))) # 输出{0: 1000, 1: 200, 2: 50}2.2 数据集可视化# 可视化三类数据分布 plt.figure(figsize(10, 6)) colors [#1f77b4, #ff7f0e, #2ca02c] markers [o, s, ^] for i, color, marker in zip([0, 1, 2], colors, markers): plt.scatter(X[y i, 0], X[y i, 1], colorcolor, markermarker, labelfClass {i} (n{counts[i]}), edgecolork, alpha0.7) plt.title(Three-class Imbalanced Dataset (1000:200:50)) plt.xlabel(Feature 1) plt.ylabel(Feature 2) plt.legend() plt.grid(True) plt.show()2.3 参数调整技巧在实际应用中我们可能需要调整参数以获得更符合需求的数据分布class_sep控制类别间的分离程度。值越大类别越容易区分。flip_y随机交换标签的比例增加数据噪声。cluster_std控制每个簇的标准差影响簇的紧密度。# 调整class_sep的效果比较 plt.figure(figsize(15, 5)) for i, sep in enumerate([0.5, 1.0, 1.5], 1): X, y make_classification( n_samples1250, n_features2, n_classes3, weights[0.8, 0.16, 0.04], class_sepsep, random_state42 ) plt.subplot(1, 3, i) for class_idx in [0, 1, 2]: plt.scatter(X[y class_idx, 0], X[y class_idx, 1], alpha0.6, labelfClass {class_idx}) plt.title(fclass_sep{sep}) plt.legend() plt.tight_layout() plt.show()3. 不平衡数据集的挑战与处理三类不平衡数据集(1000:200:50)带来了几个独特的挑战3.1 评估指标的选择对于不平衡数据集准确率(accuracy)往往不是合适的评估指标。考虑使用混淆矩阵(Confusion Matrix)精确率(Precision)、召回率(Recall)F1-score特别是加权F1ROC AUC对于多类问题使用macro或weightedfrom sklearn.metrics import classification_report from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) # 训练简单逻辑回归模型 model LogisticRegression(multi_classauto, solverlbfgs) model.fit(X_train, y_train) # 评估 y_pred model.predict(X_test) print(classification_report(y_test, y_pred))3.2 处理不平衡的常用方法重采样技术过采样少数类如SMOTE欠采样多数类类别权重在模型中使用class_weight参数# 使用类别权重的逻辑回归 weighted_model LogisticRegression( multi_classauto, solverlbfgs, class_weightbalanced # 自动调整权重 ) weighted_model.fit(X_train, y_train) # 比较结果 print(不加权模型) print(classification_report(y_test, model.predict(X_test))) print(\n加权模型) print(classification_report(y_test, weighted_model.predict(X_test)))3.3 实际应用中的注意事项保持测试集的分层抽样(stratify)以确保分布一致考虑使用交叉验证时也保持分层对于极度不平衡的类别(如50样本)可能需要收集更多数据或考虑异常检测方法4. 高级应用自定义数据分布make_classification还允许我们通过n_clusters_per_class参数创建更复杂的数据分布。4.1 多簇分布示例# 每个类别由多个簇组成 X, y make_classification( n_samples1250, n_features2, n_informative2, n_classes3, weights[0.8, 0.16, 0.04], n_clusters_per_class2, # 每个类有2个簇 random_state42 ) # 可视化 plt.figure(figsize(8, 6)) for i in [0, 1, 2]: plt.scatter(X[y i, 0], X[y i, 1], alpha0.6, labelfClass {i}) plt.title(Multi-cluster Distribution) plt.legend() plt.show()4.2 添加非线性可分性通过组合make_classification和其他生成函数可以创建更复杂的数据分布from sklearn.datasets import make_moons, make_circles # 生成一个月牙形和一个圆形数据集 X1, y1 make_moons(n_samples1000, noise0.1, random_state42) X2, y2 make_circles(n_samples250, noise0.1, factor0.5, random_state42) # 合并并创建三类不平衡数据集 X np.vstack([X1, X2]) y np.hstack([np.zeros(1000), np.ones(200), np.full(50, 2)]) # 1000:200:50 # 可视化 plt.figure(figsize(8, 6)) plt.scatter(X[y0, 0], X[y0, 1], alpha0.5, labelClass 0 (1000)) plt.scatter(X[y1, 0], X[y1, 1], alpha0.5, labelClass 1 (200)) plt.scatter(X[y2, 0], X[y2, 1], alpha0.5, labelClass 2 (50)) plt.legend() plt.title(Complex Non-linear Imbalanced Dataset) plt.show()4.3 高维数据生成与可视化虽然我们通常使用二维数据进行可视化演示但make_classification可以生成任意维度的数据# 生成20维特征的三类不平衡数据 X_highdim, y_highdim make_classification( n_samples1250, n_features20, n_informative8, n_redundant4, n_classes3, weights[0.8, 0.16, 0.04], random_state42 ) # 使用PCA降维可视化 from sklearn.decomposition import PCA pca PCA(n_components2) X_pca pca.fit_transform(X_highdim) plt.figure(figsize(8, 6)) for i in [0, 1, 2]: plt.scatter(X_pca[y_highdim i, 0], X_pca[y_highdim i, 1], alpha0.6, labelfClass {i}) plt.title(20D Data Visualized with PCA) plt.legend() plt.show()提示在高维数据生成时适当增加n_informative参数的值以确保在高维空间中有足够的判别特征。同时class_sep可能需要调整得更大一些因为高维空间中点之间的距离行为与低维空间不同。
企业数字化 ERP 产品动态
相关推荐
破解开题写作卡点,okbiye 一站式 AI 开题系统重塑学术选题筹备路径 okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图开题报告 - Okbiye智能写作https://www.okbiye.com/ai/ktbg 引言:开题报告成为学术起步的普遍难题
对于本专科、硕博阶段的学生来说,开题报告是整个毕业论文、学位课题研究的… · 2026/9/21 11:52:37
自动售货机售后服务的那些事,运营者要了解~YH ━━━━ 售后服务包含哪些内容自动售货机的售后服务,一般包括:设备维修:机器出现故障,联系售后上门维修配件更换:需要更换零配件技术支持:使用过程中的技术问题咨询远程诊断:有些问题可以通过远… · 2026/7/26 3:34:12
OpenDSS与MATLAB联合仿真平台设计:输配电网协同分析实践 简介:面向输配电系统建模与仿真需求,这份MATLAB与OpenDSS联合仿真平台资源包,适合电气工程、计算机、电子信息及数学等专业的学生用于课程设计、期末大作业或毕业设计。平台依托OpenDSS对电力系统的专业仿真能力,并结合MATLAB的数… · 2026/9/23 18:14:22
Fn键本质是硬件级键位映射切换开关 1. Fn键不是“隐藏功能”,而是被系统刻意设计的交互分层机制Fn键,全称Function Key,中文常被叫作“功能键”或“组合键开关”,但它既不是快捷键,也不是传统意义上的修饰键(Modifier Key)——它和… · 2026/9/23 18:14:03
5个坑搞定盛大网络热血传奇官网性能优化 5个坑搞定盛大网络热血传奇官网性能优化 看了一堆教程还是不会写项目?别慌,这不是你的错,是教程太“理想化”了。很多老手在 掘金技术社区… · 2026/9/23 18:13:57
Win11任务栏秒针显示:系统级时间精度增强指南 1. 这不是“隐藏彩蛋”,而是Win11真内置功能:任务栏秒针显示的来龙去脉你有没有在某个深夜加班时,盯着右下角那个跳动的时钟,突然发现——咦?它居然在动?不是每分钟跳一下,而是实实在在的“滴、… · 2026/9/23 18:13:51
4v1选型避坑指南:新手别再乱抄代码了 4v1选型避坑指南:新手别再乱抄代码了 刚接手项目,从网上抄了一段 4v1 数据聚合代码,结果一跑就报错?别急,这坑我踩过,你也别急。很多新手一上来就找“通用模板”,结果发现根本跑不通,连报错信息都看不懂,更别提怎么调了。 做 4v1… · 2026/9/23 18:13:50
学生党变声整活实测|4 款变声器横评,手机电脑全都有,一次搞定 最近刷短视频总能刷到变声整活,不管是联机游戏语音、和室友线上开玩笑,还是给自己短视频配趣味旁白,变声器直接把氛围感拉满。很多同学来问,市面上这么多变声软件,到底该选哪一个?我陆续试了 4 款热门工具&… · 2026/9/23 18:13:44
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29