Python数学建模 缺失值与异常值处理

基于Python的数学建模

数据缺失值与异常值处理

缺失值的定义与原因

  1. 定义:缺失值,即存在特征或标签为空值的样本。包含空值的数据会使建模过程陷入混乱,导致不可靠输出。缺少过多的数据也将丢失大量有效信息,使数据模型难以把握数据规律。
  2. 缺失原因
    • 部分信息暂时无法获取
    • 由于人为因素丢失部分信息
    • 部分对象的某个或某些属性不可用

缺失值的处理

生成缺失数据

data = pd.DataFrame({'A':[None,2,3,4,None,6],'B':[4,None,7,10,15,21],'C':[3,6,18,7,10,13]})
data

在这里插入图片描述

删除法

  1. 特征删除法:当一个特征缺失“过多”的数据时,对其填充的数据可能是无价值的,因此直接将该指标删除。特征值缺失量的标准无硬性规定,正常缺失30%以上便可以删除变量。
  2. 样本删除法:当含缺失值的样本量在总数据量占比较小时,可以仅删除含缺失值的样本量。
data_1 = data.copy()
data_1 = data_1.dropna(axis=0,how='any') # 以行为参考,如果有空值,就删除该行
data_1

在这里插入图片描述

data_1 = data.copy()
data_1 = data_1.dropna(axis=1,how='any') # 以列为参考,如果有空值,就删除该列
data_1

在这里插入图片描述

简单填充

  1. 手动填充:填充效果最好,产生的数据偏离最小,当在处理大规模数据时不可行。
  2. 统计填充:若缺失值为数值数据,可以计算其他对象的均值、加权均值或中位数来填补缺失值。若缺失值为分类数据,可以使用众数,选择在其他对象中出现频率最高的值进行填充。
# 均值填充
data_3 = data.copy()
data_3 = data_3.fillna(data_3.mean()) 
# 中位数填充
data_3 = data.copy()
data_3 = data_3.fillna(data_3.median()) 
# 使用前一个数据进行填充
data_3 = data.copy()
data_3 = data_3.fillna(value=None, method='ffill',axis=0) 
# 使用后一个数据进行填充
data_3 = data.copy()
data_3 = data_3.fillna(value=None, method='backfill',axis=0) 
# Sklearn 插值工具
from sklearn.impute import SimpleImputer
# Strategy可以指定填充方式,mean均值填补,median中位数填补,most_frequent众数填补,constant常数填补
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
data_3 = data.copy()
data_3 = imp.fit_transform(data_3)
data_3

在这里插入图片描述

插值法

  1. 热卡填充法(就近补齐):对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。通常会找到超出一个的相似对象,在所有匹配对象中没有最好的,而是从中随机的挑选一个作为填充值,不同的问题选用不同的标准来对相似进行判定。但不同的问题可能会选用不同的标准来对相似进行判定,难以定义相似标准,主观因素较多。
  2. KNN最近邻填充
    • 先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。
    • 这个方法要求我们选择k的值(最近邻居的数量),以及距离度量。
    • KNN既可以预测离散属性(加权投票)也可以预测连续属性(加权平均)。
from sklearn.impute import KNNImputer

imputer = KNNImputer(missing_values=np.nan, 
                     n_neighbors=2, # 用于插补的相邻样本数。
                     weights='distance') # 用于预测的权重函数
data_4 = data.copy()
data_4 = imputer.fit_transform(data_4)
data_4

在这里插入图片描述

  1. 多重插补
    • 在处理缺失值时,可以通过链式方程的多重插补(MICE,Multiple Imputation by Chained Equations)估算缺失值。从技术上讲,任何能够推理的预测模型都可以用于MICE。
    • miceforest库可以实现随机森林的链式方程式(MICE)多重插补,具有快速、内存利用率高的特征,无需太多设置即可插入缺失的分类和数值数据,并且具有一系列可用的诊断图。
import miceforest as mf
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
iris = pd.concat(load_iris(as_frame=True,return_X_y=True),axis=1)
iris.rename({"target": "species"}, inplace=True, axis=1)
iris['species'] = iris['species'].astype('category')
# 引入缺失数据
iris_amp = mf.ampute_data(iris,perc=0.25,random_state=1991)
iris_amp

在这里插入图片描述

# 初始化插补模型
kernel = mf.ImputationKernel( 
  iris_amp,
  datasets=5, # 将datasets设置为5,创建多个插补数据集
  save_all_iterations=True,
  random_state=666
)
# MICE算法进行2次迭代
kernel.mice(2) 
# 直接从内核中获取已插值的数据集
completed_dataset = kernel.complete_data(dataset=0, inplace=False)
completed_dataset

在这里插入图片描述

异常值检测

  1. 箱线图
from matplotlib import pyplot as plt
# 加载鸢尾花数据集
iris = pd.concat(load_iris(as_frame=True,return_X_y=True),axis=1).iloc[:,0]
_ = plt.boxplot(iris)

在这里插入图片描述

# 生成异常值
iris_1 = iris.copy()
iris_1[4]=14
_ = plt.boxplot(iris_1)

在这里插入图片描述
2. 3 σ \sigma σ原则(拉依达准则)

def three_sigma(data, n=3):
    """
    data: DataFrame某一列
    """
    rule = (data.mean() - n * data.std() > data) | (data.mean() + n * data.std() < data) 
    index = np.arange(data.shape[0])[rule]
    outrange = data.iloc[index]
    return outrange

# 异常值检测
print(three_sigma(iris,n=3))

在这里插入图片描述

# 生成异常值
iris_1 = iris.copy()
iris_1[4]=14
print(three_sigma(iris_1,n=3))

在这里插入图片描述

  • 14
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中,可以使用插值法来填充缺失值。一种常用的插值方法是拉格朗日插值。引用中提供了一个使用拉格朗日插值法填补缺失值的示例代码。该代码使用了scipy库的lagrange函数进行插值计算。步骤如下: 1. 导入必要的库和函数:`from scipy.interpolate import lagrange` 2. 定义一个列向量s,表示需要进行插值的列 3. 定义ployinterp_column函数,该函数接受列向量s、插值位置n和取后数据个数k作为参数 4. 在ployinterp_column函数中,根据插值位置n和取后数据个数k,提取需要进行插值的数据 5. 剔除空值,使用lagrange函数进行插值计算,并返回插值结果 6. 定义data_lagrange函数,该函数接受一个DataFrame对象data作为参数 7. 在data_lagrange函数中,遍历data的每一列,并判断是否存在缺失值,如果存在则进行插值填补 8. 返回填补完缺失值的DataFrame对象data 使用插值法填充缺失值的示例代码如下: ```python from scipy.interpolate import lagrange def ployinterp_column(s, n, k=5): y = s.iloc[list(range(n-k, n)) + list(range(n+1, n+1+k))] # 取数 y = y[y.notnull()] # 剔除空值 return lagrange(y.index, list(y))(n) # 插值并返回插值结果 def data_lagrange(data): for i in data.columns: for j in range(len(data)): if data[i].isnull()[j]: data.loc[j,i = ployinterp_column(data[i], j) return data ``` 你可以将你的数据存储在一个DataFrame对象中,然后调用data_lagrange函数来填充缺失值。填充后的数据将会替换原始的缺失值

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_泥鳅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值