数据预处理关注的问题:
单变量正态性虽然不能保证多变量的正态性,但是它是有帮助的。并且一般解决了正态性问题的话,就可以解决异方差或者线性度的问题。而且很多模型假设数据服从正态分布后,它的样本均值和方差就相互独立,这样就能更好的进行统计推断和假设验证。
数据右偏的话可以对所有数据取对数、取平方根等,它的原理是因为这样的变换的导数是逐渐减小的,也就是说它的增速逐渐减缓,所以就可以把大的数据向左移,使数据接近正态分布。 如果左偏的话可以取相反数转化为右偏的情况。
通常来说,可以尝试一下几种方法:
对数变换 即将原始数据X的对数值作为新的分布数据:x = np.log(x)
当原始数据中有小值及零时,x = np.log1p(x)
平方根变换 即将原始数据X的平方根作为新的分布数据 x = np.sqrt(x)
倒数变换 x= 1/x 即将原始数据X的倒数作为新的分析数据
数据预处理—4.为什么要趋近于正态分布?详解_哎呦-_-不错的博客-CSDN博客_为什么数据要符合正态分布
上面公式中y(λ)表示变换后的值,根据λ的值不同,属于不同的变换,当λ值取以下特定的几个值时就变成了特殊的数据变换:
λ值取多少,我们可以利用Python中现成的函数,让函数自动去探索,然后返回给我们最优的值是多少就可以。这个函数就是boxcox_normmax
,这个函数用来计算给定的非正态数据对应的最优λ值。另外一个函数boxcox_normplot
来查看到底哪种方法计算出来的λ值更可靠
当我们得到最优的λ值以后,就可以根据λ值进行数据转换了,这个时候可以用另外的一个函数boxcox
,这个函数是根据指定的λ值对原始数据进行转换。
检测训练集和测试集数据是否来自同一数据(数据分布情况是否相同)
将训练集和测试集分别打上不同的标签然后进行训练,假设使用AUC作为分类精度评价函数:
如果不一致,
SMOTE:该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。(优点是相当于合理地对小样本的分类平面进行的一定程度的外扩;也相当于对小类错分进行加权惩罚
最简单的泛化模型的方法就是使用更多的数据。问题在于像逻辑回归和随机森林的分类器趋向于在泛化的时候忽略掉少数类。一个简单的最佳实践是使用所有的少数类和n个不同的多数类组成n个不同的数据集,构建模型。
设小类中有N个样本。将大类聚类成N个簇,然后使用每个簇的中心组成大类中的N个样本,加上小类中所有的样本进行训练。(优点是保留了大类在特征空间的分布特性,又降低了大类数据的数目)
对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集)。 一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。
对小样本进行过采样(例如含L倍的重复数据),其实在计算小样本错分cost functions时会累加L倍的惩罚分数。
Synthetic Minority Oversampling Technique
SMOTE是基于随机过采样算法的一种改进方案,由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产生模型过拟合的问题,即使得模型学习到的信息过于特别(Specific)而不够泛化(General)。
SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中
奇异值分解矩阵
数据方差最大方向
通过映射变换将每个数据点映射到相应的概率分布上。具体的是,在高维空间中使用高斯分布将距离转换为概率分布,在低维空间中,使用长尾分布来将距离转换为概率分布,从而是的高维度空间中的中低等距离在映射后能够有个较大的距离,使得降维时能够避免过多关注局部特征,而忽视全局特征。
from sklearn.manifold import TSNE
from sklearn.datasets import load_iris,load_digits
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
%config InlineBackend.figure_format = "svg"
digits = load_digits()
X_tsne = TSNE(n_components=2, random_state=33).fit_transform(digits.data)
X_pca = PCA(n_components=2).fit_transform(digits.data)
font = {"color": "darkred",
"size": 13,
"family" : "serif"}
plt.style.use("dark_background")
plt.figure(figsize=(8.5, 4))
plt.subplot(1, 2, 1)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c=digits.target, alpha=0.6,
cmap=plt.cm.get_cmap('rainbow', 10))
plt.title("t-SNE", fontdict=font)
cbar = plt.colorbar(ticks=range(10))
cbar.set_label(label='digit value', fontdict=font)
plt.clim(-0.5, 9.5)
plt.subplot(1, 2, 2)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=digits.target, alpha=0.6,
cmap=plt.cm.get_cmap('rainbow', 10))
plt.title("PCA", fontdict=font)
cbar = plt.colorbar(ticks=range(10))
cbar.set_label(label='digit value', fontdict=font)
plt.clim(-0.5, 9.5)
plt.tight_layout()
1. 过滤法:使用发散性或相关性指标对各个特征进行评分,选择分数大于阈值的特征或者选择前K个分数最大的特征。
方差选择法(发散性),卡方检验法(相关性),皮尔森相关系数法法(相关性),互信息系数法(相关性)
2. 封装法Wrapper:根据⽬标函数(通常是预测效果评分),每次选择若⼲特征,或者排除若⼲特征,即重复执行的嵌入法
RFE递归特征消除法
3. 嵌入法Embedded:先使⽤某些机器学习的算法和模型进⾏训练,得到各个特征的权值系数,根据系数从⼤到⼩选择特征
3.1 StandardScale 标准缩放(Z 分数标准化)
3.2 MinMaxScaler(按数值范围缩放)
假设我们要缩放的特征数值范围为 (a, b)。
3.3 Normalizer
Normalizer使用L1或者L2范数来缩放数据,默认值为L2。Normalizer计算方法是:除以L1或者L2范数。(axis=1对行计算)
3.4 RobustScaler(抗异常值缩放)
使用对异常值稳健的统计(分位数)来缩放特征。假设我们要将缩放的特征分位数范围为 (a, b)。
3.5 MaxAbsScaler
X_scaled = X/X.max(X.abs(X), axis=0)
X.abs(X)取特征列的绝对值,X.max(axis=0)为当前特征列的最大值。实际就是除以绝对值的最大值
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import Normalizer
from sklearn.preprocessing import RobustScaler
from sklearn.preprocessing import MaxAbsScaler
from sklearn.preprocessing import Binarizer
StandardScaler().fit_transform(x)
Binarizer(threshold= 0.9).transform(x)
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
#独热编码
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) # fit来学习编码
enc.transform([[0, 1, 3]]).toarray() # 进行编码
#标签编码
le = LabelEncoder()
le.fit([1,5,67,100])
le.transform([1,1,100,67,5])
tricks:
这种⽅法简单的通过⼀些现有的相似数据来补充缺失数据。最常见的是使用相关系数矩阵来确定哪个变量(如变量Y)与缺失值所在变量(如变量X)最相关。然后把所有个案按Y的取值大小进行排序。那么变量X的缺失值就可以用排在缺失值前的那个个案的数据来代替了。
⽤现有数据的均值或众数来填充缺失数据。
先依据已知数据建⽴⼀个回归模型,再通过回归模型预测缺失数据。
超过上下界的值称为异常值
上界 =上四分位数 + k(上四分位数 - 下四分位数)
下界 =下四分位数 - k(上四分位数 - 下四分位数)
当k=1.5时表示中度异常;当k=3时表示高度异常。箱形图中默认k=1.5。
Python中的空值有None、NaN、""、“ ”四种类型
None 是字符串类型的空值,只有None是NoneType型的。NaN 是数值型的空值。“” 是一个空字符串。“ “是一个还有一个或多个空格的字符串。
read_csv('data.csv', na_values='', engine='xlrd')
解决样本不平衡问题的奇技淫巧 汇总_songhk0209的博客-CSDN博客
标准化和归一化有什么区别?
专栏 | 基于 Jupyter 的特征工程手册:数据预处理(一) - 知乎