You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3环境下移除数据点调整数据集为均匀分布的方法咨询

数据集中心倾斜降采样为近似均匀分布的Python实现方案

你需要用到的都是Python数据生态的常用库,无需额外安装小众依赖,操作逻辑对初学者也比较友好:

依赖安装

如果还没装相关库可以先执行安装命令:

pip install pandas numpy scikit-learn

步骤1:读取原始CSV数据

用pandas直接读取本地csv文件即可:

import pandas as pd

# 替换引号内的路径为你自己的数据集文件路径
raw_df = pd.read_csv("your_dataset_path.csv")

步骤2:选择重采样方案

推荐两种实现思路,你可以根据自己的需求选:

方案1:分箱均匀采样(逻辑简单,易调试)

核心思路是把特征空间切分为等大小的区块,每个区块保留相同数量的样本,中心样本多的区块自动丢弃多余样本:

import numpy as np

# 👇 这里替换成你自己数据集里的特征列名,比如如果是二维特征就写["col1", "col2"]
feature_cols = ["x", "y"]
# 分箱数量,数值越大采样结果越接近均匀,可自行调整
n_bins = 20

# 给每个样本分配所属的区块ID
bin_labels = []
for col in feature_cols:
    bin_labels.append(pd.cut(raw_df[col], bins=n_bins, labels=False))
raw_df["bin_id"] = sum([bin_labels[i] * (n_bins ** i) for i in range(len(feature_cols))])

# 取所有区块的最小样本数作为每个区块的保留数量
min_sample_per_bin = raw_df["bin_id"].value_counts().min()
# 每个区块随机采样对应数量的样本
uniform_df = raw_df.groupby("bin_id", group_keys=False).apply(
    lambda x: x.sample(min_sample_per_bin, random_state=42)
)
# 删除辅助计算的bin_id列
uniform_df = uniform_df.drop("bin_id", axis=1)

方案2:密度加权采样(结果更平滑,适合多维度数据)

核心思路是计算每个样本的分布密度,中心区域密度高的样本采样保留概率更低,自动实现均匀化:

from sklearn.neighbors import KernelDensity
import numpy as np

# 👇 替换成你自己的特征列名
feature_cols = ["x", "y"]

# 拟合核密度模型计算每个样本的密度
kde = KernelDensity(kernel="gaussian", bandwidth=0.5).fit(raw_df[feature_cols])
raw_df["density"] = np.exp(kde.score_samples(raw_df[feature_cols]))

# 密度越高的样本保留概率越低,0.8为调整系数,可自行修改控制中心样本保留比例
max_density = raw_df["density"].max()
raw_df["sample_weight"] = 1 - (raw_df["density"] / max_density) * 0.8

# 按权重采样,可自行修改保留的样本数量/比例
# 示例为保留原始数据集40%的样本:
uniform_df = raw_df.sample(
    n=int(len(raw_df) * 0.4),
    weights="sample_weight",
    random_state=42
).reset_index(drop=True)
# 删除辅助计算列
uniform_df = uniform_df.drop(["density", "sample_weight"], axis=1)

步骤3:导出处理后的数据集

# 导出为新的csv文件,避免覆盖原始数据
uniform_df.to_csv("uniform_dataset.csv", index=False)

初学者调试提示

  • 固定random_state参数可以保证每次运行结果一致,方便对比参数调整效果
  • 分箱数量、密度计算的带宽、采样比例都可以根据你实际的分布效果调整,调整后可以用matplotlib画散点图确认均匀度
  • 如果是一维数据集,只需要保留一个特征列即可,多维数据往feature_cols里加列名就行

内容的提问来源于stack exchange,提问作者sheep_skins

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:54:04