分享

机器学习之数据清洗

 NeighborMrSun 2023-02-27 发布于湖南

一、数据清洗

1.1重复值:重复值会导致数据方差变小,影响数据分布,重复值主要分为两种:

1.1.1 记录重复:一个或多个特征列的几条记录完全一致

对于记录重复数据,一般采用直接删除方式:

DataFrame.drop_duplicates(subset=None,Keep='first',inplace=Flase) #去掉完全相同的行
subset: 用来指定特定的列,默认所有列

1.1.2 特征重复:一个或多个特征名不同,但是数据完全一样

pandas提供了一个corr函数可以进行相似度的检测,当相似度为1,表示两列数据一模一样。

DataFrame.corr(method='pearson',min_periods=1)

1.2缺省值:缺省值会导致数据量变小,增加分析难度,影响准确性

# dataframe查看某列缺省值和非缺省值的数量
data['temp'].isnull().sum()
data['temp'].notnull().sum()

1.2.1 删除法:当缺省的个数非常少时可以采用直接删除的方式

图片

1.2.2 替换法:对于连续变化的量的缺省情况,可以考虑使用前一个非None值或者后一个非None值或者某个固定的value进行替换

图片

1.2.3插值法:pandas提供了interpolate方法进行插值操作,但是scipy提供的interpolate模块功能更加全面

##线性插值
import numpy as np
from scipy.interpolate import interp1d
x=np.array([1,2,3,4,5,8,9,10])
y=np.array([2,8,18,32,50,128,162,200])
linearinsert=interp1d(x,y,kind='linear')
x2=[6,7] #需要插值的x2值不能超过x的范围
y2=linearinsert(x2)
print(y2)
[ 76. 102.]

1.3异常值:数据处理中,异常值是指偏离明显的数值,有时候也成为离群点,异常值在进行数据分析的时候,分析结果容易产生偏差甚至错误,对于异常值,一般采用删除的方法。3δ原则和箱型图用于做初步的数据探查,如果经过检验数据服从正态分布,就使用3δ原则,否则使用箱型图。

1.3.1 3δ原则

如果数据服从正态分布,在3σ原则下,异常值被定义为⼀组测定值中与平均值的偏差超过三倍标准差的值。在正态分布下,距离平均值3σ之外的值出现的概率为 P(|x-µ|>3σ)<=0.003,属于极个别的⼩概率事件。如果数据不服从正态分布,也可以⽤远离平均值的多少倍标准差来描述 这个原则有个前提条件:数据需要服从正态分布。

# 正态分布的检验方法:KS检验
# 基于累计分布函数的,用于检验一个分布是否符合某种理论分布或比较两个经验分布是否有显著差异。
# kstest方法:参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差
# 结果返回两个值:statistic → D值,pvalue → P值
# H0:样本符合
# H1:样本不符合
# 如果p>0.05接受H0,为正态分布 ,反之
#导入scipy模块
from scipy import stats
import pandas as pd
data = pd.read_excel(r'sale.xls', index_col = False) #读取数据
u = data[u'销量'].mean() # 计算均值
std = data[u'销量'].std()  # 计算标准差
stats.kstest(data[u'销量'], 'norm', (u, std))
# 结果展示KstestResult(statistic=0.16962184456795837, pvalue=1.5900252683896546e-05)
# 原文链接:https://blog.csdn.net/weixin_45063703/article/details/122379055
# 3δ原则异常值判断方法
import numpy as np
import pandas as pd
defdetect_outliers(data,threshold=3):
mean_d = np.mean(data)
    std_d = np.std(data)
outliers =[]
    for y in data_d:
z_score=(y - mean_d)/std_d
        if np.abs(z_score)> threshold:
outliers.append(y)
    return outliers

1.3.2 箱型图

四分位间距 (IQR) 的概念被⽤于构建箱形图。IQR 是统计学中的⼀个概念,通过将数据集分成四分位来衡量统计分散度和数据可变性。简单来说,任何数据集或任意⼀组观测值都可以根据数据的值以及它们与整个数据集的⽐较情况被划分为四个确定的间隔。四分位数会将数 据分为三个点和四个区间。四分位间距对定义离群点⾮常重要。它是第三个四分位数和第⼀个四分位数的差 (IQR = Q3 -Q1)。在这种情况下,离群点被定义为低于箱 形图下触须(或 Q1 − 1.5x IQR)或⾼于箱形图上触须(或 Q3 + 1.5x IQR)的观测值。

图片

#箱型图异常值识别方法
defdetect_outliers(sr):
q1 = sr.quantile(0.25)
    q3 = sr.quantile(0.75)
iqr = q3-q1 #Interquartile range
    fence_low  = q1-1.5*iqr
fence_high = q3+1.5*iqr
    outliers = sr.loc[(sr < fence_low)|(sr > fence_high)]
return outliers
# 链接:https://wenku.baidu.com/view/66158847986648d7c1c708a1284ac850ad0204b8.html

二、数据标准化

数据标准化是机器学习、数据挖掘中常用的一种方法,是最基本的一个步骤。

数据标准化主要是应对特征向量中数据很分散的情况,防止小数据被大数据(绝对值)吞并的情况。

另外,数据标准化也有加速训练,防止梯度爆炸的作用。

为什么要标准化/归一化?

提升模型精度:标准化/归一化后,不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。

加速模型收敛:标准化/归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。

如下图所示:图片左图表示未经过数据标准化处理的loss更新函数,右图表示经过数据标准化后的loss更新图。可见经过标准化后的数据更容易迭代到最优点,而且收敛更快。

哪些机器学习算法需要标准化和归一化:

1)需要使用梯度下降和计算距离的模型要做归一化,因为不做归一化会使收敛的路径程z字型下降,导致收敛路径太慢,而且不容易找到最优解,归一化之后加快了梯度下降求最优解的速度,并有可能提高精度。比如说线性回归、逻辑回归、adaboost、xgboost、GBDT、SVM、NeuralNetwork等。需要计算距离的模型需要做归一化,比如说KNN、KMeans等。

2)概率模型、树形结构模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、随机森林。

归一化比标准化方法产生的标准差小,使用归一化来缩放数据,则数据将更集中在均值附近。这是由于归一化的缩放是“拍扁”统一到区间(仅由极值决定),而标准化的缩放是更加“弹性”和“动态”的,和整体样本的分布有很大的关系。所以归一化不能很好地处理离群值,而标准化对异常值的鲁棒性强,在许多情况下,它优于归一化。--如果要使用归一化,需要先将异常值排除,如果使用标准化则需要检验数据是否符合正态分布。

2.1 [0, 1] 标准化

[0, 1] 标准化是最基本的一种数据标准化方法,指的是将数据压缩到0~1之间。

标准化公式如下图片

#代码如下
def MaxMinNormalization(x):
    '''[0,1] normaliaztion'''
x = (x - np.min(x)) / (np.max(x) - np.min(x))

   return x

#或者使用现成库
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(df)
scaled_features = scaler.transform(df)
df_MinMax = pd.DataFrame(data=scaled_features, columns=['Age', 'Salary','Purchased','Country_France','Country_Germany', 'Country_spain'])

原始数据和转换后数据对比图片

图片

2.2 Z-score标准化

Z-score标准化是基于数据均值和方差的标准化化方法。标准化后的数据是均值为0,方差为1的正态分布。这种方法要求原始数据的分布可以近似为高斯分布,否则效果会很差。如果不服从高斯分布,可以考虑将原始数据取log或者开根号,再检验是否符合高斯分布。

标准化公式如下图片

#代码实现
def ZscoreNormalization(x):
    '''Z-score normaliaztion'''
x = (x - np.mean(x)) / np.std(x)

   return x

#或者使用现成库
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
sc_X = sc_X.fit_transform(df)
sc_X = pd.DataFrame(data=sc_X, columns=['Age', 'Salary','Purchased','Country_France','Country_Germany', 'Country_spain'])

图片

三、数据转换

3.1哑变量处理

某些数据不是数值型的数据,如性别等,在进行计算的时候,往往需要数值型的数据,此时,需要将这些数据进行数值型的转换。哑变量也称虚拟变量,当自变量x为多分类时,会将每一类用一个变哑变量表示。例如x1表示坐飞机,x2表示做火车,x3表示自驾等,当x1=1表示坐飞机,x1=0表示不坐飞机。

在此需要注意的是3值以上的离散变量需要进行哑变量处理,并且增加截距项intercept,同时进行训练集和测试集的拆分。(目的是防止模型过拟合)

#Pandas提供函数get_dummies获取并将非数值型的数据(哑数据)并转换成数值型数据。pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)[source]图片

参数详解 data : array-like, Series, or DataFrame 输入的数据 prefix : string, get_dummies转换后,列名的前缀,默认为None columns : 指定需要实现类别转换的列名 否则转换所有类别性的列 dummy_na : bool, default False 增加一列表示空缺值,如果False就忽略空缺值 drop_first : bool, default False 获得k中的k-1个类别值,去除第一个,防止出现多重共线性 原文链接:https://blog.csdn.net/qq_43404784/article/details/89486442 

    若针对训练数据已经做好了独热编码并建立了模型,而新增的预测数据或分类数据的类别变量未包含完整的类别。此时直接使用pd.get_dummies,会发现与训练集得到的结果不一样。例如:训练数据中季节列中春、夏、秋、冬都出现过,而在新的测试数据中只出现了春与夏,两者的结果会不一样。可以在预测数据中新增以下代码,详见原文。

data['季节'] = data['季节'].astype(
    'category',
categories=['春', '夏', '秋', '冬']
)

3.2 对循环特征比如24小时的编码,用cos和sin进行编码

hour_x = cos(2pihour/24) and hour_y = sin(2pihour/24)

原文链接:https://blog.csdn.net/qq_34107425/article/details/103939891

四、误差评估

参考链接:https://blog.csdn.net/weixin_44333889/article/details/122057943

对于回归评价:

MAE 会忽略异常值,而 RMSE 会注意到异常值并得到没有偏差的预测。那么应该使用哪个指标呢?很遗憾,不存在确定的答案。如果你是一名供应链领域的数据科学家,你应该多做试验:如果使用 MAE 作为性能评估指标会得到很大偏差,你可能需要使用 RMSE。如果数据集包含很多异常值,导致预测结果产生偏移,你可能需要用 MAE。

还需要注意的是,你可以选择一个或多个评估指标(如 MAE&bias)来计算预测的误差,然后用另一个指标(RMSE?)来对模型进行优化。

还有最后一个技巧,面对实际值较低的序列,可以将其聚合到一个更大的时间范围。例如,如果以星期为周期的值很低,你可以试试按照月份来进行预测,甚至按季度预测。你也可以通过简单的除法,把原始时间序列分解到较小的时间范围上。这一方法可以帮助你更好地使用 MAE 作为评估指标,同时对峰值做平滑处理。

对于分类则集中使用AUC

4.1回归评价-均方误差(MSE)

均方误差(Mean Square Error,MSE),反映估计量与被估计量之间差异程度的一种度量。设t是根据子样确定的总体参数θ的一个估计量,(θ-t)2的数学期望,称为估计量t的均方误差。它等于σ2+b2,其中σ2与b分别是t的方差与偏倚。图片

4.2回归评价-均方根误差(RMSE)

均方根误差(Root Mean Square Error,RMSE),从名称来看,我们都能猜得到是什么意思。多了一个根,这个“根”的意思顾名思义,就只是加了个根号。均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根,在实际测量中,观测次数n总是有限的,真值只能用最可信赖(最佳)值来代替。图片

4.3回归评价-平均绝对误差(MAE)

平均绝对误差(Mean Absolute Error,MAE),绝对偏差平均值即平均偏差,指各次测量值的绝对偏差绝对值的平均值。平均绝对误差可以避免误差相互抵消的问题,因而可以准确反映实际预测误差的大小。图片

4.4回归评价-平均绝对百分比误差(MAPE)

平均绝对百分比误差(Mean Absolute Percentage Error,MAPE),平均绝对百分比误差之所以可以描述准确度是因为平均绝对百分比误差本身常用于衡量预测准确性的统计指标,如时间序列的预测。图片

4.5回归评价-对称平均绝对百分比误差(SMAPE)

对称平均绝对百分比误差(Symmetric Mean Absolute Percentage Error,SMAPE)图片

import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error,mean_absolute_error, mean_absolute_error
def check_error(orig, pred, name_col='', index_name=''):
'''
    orig:实际值
pred:预测值
    '''
bias = np.mean(orig - pred)
    mse = mean_squared_error(orig, pred)
rmse = sqrt(mean_squared_error(orig, pred))
    mae = mean_absolute_error(orig, pred)
mape = np.mean(np.abs((orig - pred) / orig)) * 100
    res_smape = 2.0 * np.mean(np.abs(pred - orig) / (np.abs(pred) + np.abs(orig))) * 100
error_group = [bias, mse, rmse, mae, mape,res_smape]
    serie = pd.DataFrame(error_group, index=['BIAS','MSE','RMSE','MAE', 'MAPE','SMAPE'], columns=[name_col])
serie.index.name = index_name
    return serie

4.6 AUC -二分类和多分类模型,采用AUC作为评价指标

from sklearn.metrics import roc_auc_score

roc_auc_score(y_true, y_score, *, average='macro', sample_weight=None, max_fpr=None, multi_class='raise', labels=None)

计算曲线ROC的面积

  • Parameters(参数) y_true : array-like of shape (n_samples,) or (n_samples, n_classes) 真实数据 二分类和多分类需要带有shape (n_samples)的标签,而多标签情况需要带有shape (n_samples, n_classes) 的二进制标签。

    y_score : array-like of shape (n_samples,) or (n_samples, n_classes) 预测结果数据 1.在二分类的情况下,它对应于形状数组(n_samples,),可以提供概率估计和非阈值决策值 概率估计值对应于具有更大标签的类别的概率,即estimator.classes_ [1], 因此是estimator.predict_proba(X,y)[:, 1]。决策值对应于estimator.decision_function(X,y)的输出。2.在多分类情况下,它对应于由predict_proba方法提供的概率估计的形状数组(n_samples,n_classes) 每个sample概率估计值为1;此外,每一个sample的概率估计值的顺序必须与y_true中标签的顺序相对应。3.在多标签情况下,它对应于一个形状数组(n_samples,n_classes)。概率估计由predict_proba方法提供,非阈值决策值由decision_function方法提供。

    average : {'micro’, 'macro’, 'samples’, 'weighted’} or None, default=’macro’ 当y_true是二进制时,这个参数将被忽略 'macro':简单地计算 binary metrics (二分指标)的平均值,赋予每个类别相同的权重 'micro':给每个 sample-class pair (样本类对)对 overall metric (总体指数) (sample-class 权重的结果除外) 等同的贡献。除了对每个类别的 metric 进行求和之外,这 个总和构成每个类别度量的 dividends (除数)和 divisors (除数)计算一个整体商。在 multilabel settings (多标签设置)中,Micro-averaging 可能是优先选择的,包括要忽略 majority class (多数类)的 multiclass classification (多类分类) 'weighted': 通过计算其在真实数据样本中的存在来对每个类的 score 进行加权的 binary metrics (二分指标) 的平均值来计算类不平衡。'samples':仅适用于多标签问题。它不计算每个类别的 measure,而是计算评估数据中的每个样本 的真实和预测类别的 metric (指标),并返回 (sample_weight-weighted) 加权平均。sample_weight :array-like of shape (n_samples,), default=None 样品权重

    sample_weight : array-like of shape (n_samples,), default=None 如果不为None,则返回范围为[0,max_fpr]的标准化部分AUC 对于多分类情况,max_fpr应该等于None或1.0

    multi_class:{'raise’, 'ovr’, 'ovo’}, default=’raise’ 仅用于多分类,默认值会引发错误,因此必须显式传递'ovr'或'ovo' 'ovr':一对多 'ovo':一对一 这两个概念想了解的参考为2.逻辑回归部分

    labels : array-like of shape (n_classes,), default=None
    仅用于多分类,标签列表索引了y_score中的类,如果为None,则使用y_true中标签的数字或字典顺序

  • 返回 AUC值

#二分类
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
X, y = load_breast_cancer(return_X_y=True)
clf = LogisticRegression(solver='liblinear', random_state=0).fit(X, y)
from sklearn.metrics import roc_auc_score
#方式一
roc_auc_score(y, clf.predict_proba(X)[:, 1])
#方式二
roc_auc_score(y, clf.decision_function(X))
#多分类
from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True)
clf = LogisticRegression(solver='liblinear').fit(X, y)
clf.predict_proba(X)
from sklearn.metrics import roc_auc_score
#multi_class='ovr'
roc_auc_score(y, clf.predict_proba(X), multi_class='ovr')
原文链接:https://blog.csdn.net/Alex_81D/article/details/115733060

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多