一、数据归一化

(一)使用数据归一化的目的

在数据处理中,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
通常的数据归一化方法有两种:

  • 最值归一化(normalization):

把所有数据映射到0-1之间。最值归一化的使用范围是特征的分布具有明显边界的(如分数0-100、灰度0-255),受outlier的影响比较大。

x_scale=(x-x_min)/(x_max-x_min )
  • 均值方差归一化(standardization):

把所有的数据归一到均值为0方差为1的分布中。适用于没有明显边界,且有可能存在极端数据值的情况。

x_scale=(x-x_mean)/σ

其中:x_mean为样本数据的均值,σ为样本数据的标准差。

(二)最值归一化实现

为了了解最值归一化的代码实现,先我们可以创建100个随机数,然后对其进行最值归一化。

import numpy as np
# 创建100个随机数
x = np.random.randint(0,100,size=100)# 最值归一化(向量)
# 最值归一化公式,映射到0,1之间
(x - np.min(x)) / (np.max(x) -  np.min(x))# 最值归一化(矩阵)
# 0~100范围内的50*2的矩阵
X = np.random.randint(0,100,(50,2))
# 将矩阵改为浮点型
X = np.array(X, dtype=float)
# 最值归一化公式,对于每一个维度(列方向)进行归一化。
# X[:,0]第一列,第一个特征
X[:,0] = (X[:,0] - np.min(X[:,0])) / (np.max(X[:,0]) - np.min(X[:,0]))
# X[:,1]第二列,第二个特征
X[:,1] = (X[:,1] - np.min(X[:,1])) / (np.max(X[:,1]) - np.min(X[:,1]))# 如果有n个特征,可以写个循环:
for i in range(0,2):X[:,i] = (X[:,i]-np.min(X[:,i])) / (np.max(X[:,i] - np.min(X[:,i])))import matplotlib.pyplot as plt
# 简单绘制样本,看横纵坐标
plt.scatter(X[:,0],X[:,1])
plt.show()

生成效果图

(三) 均值方差归一化实现

同样地,为了了解均值方差归一化的代码实现,我们可以创建100个随机数,然后对其进行均值方差归一化。

X2 = np.array(np.random.randint(0,100,(50,2)),dtype=float)# 套用公式,对每一列做均值方差归一化
for i in range(0,2):X2[:,i]=(X2[:,i]-np.mean(X2[:,i])) / np.std(X2[:,i])plt.scatter(X2[:,0],X2[:,1])
plt.show()

并绘制样本

(四)Sklearn中的归一化

我们在建模时要将数据集划分为训练数据集&测试数据集。

训练数据集进行归一化处理,需要计算出训练数据集的均值mean_train和方差std_train。

问题是:我们在对测试数据集进行归一化时,要计算测试数据的均值和方差么?

答案是否定的。在对测试数据集进行归一化时,仍然要使用训练数据集的均值train_mean方差std_train。这是因为测试数据是模拟的真实环境,真实环境中可能无法得到均值和方差,对数据进行归一化。只能够使用公式**(x_test - mean_train) / std_train**并且,数据归一化也是算法的一部分,针对后面所有的数据,也应该做同样的处理.

因此我们要保存训练数据集中得到的均值和方差。

在sklearn中专门的用来数据归一化的方法:StandardScaler

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_splitiris = datasets.load_iris() #加载鸢尾花数据集
X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=666)
########以下为数据归一化过程
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
# 归一化的过程跟训练模型一样
standardScaler.fit(X_train)
standardScaler.mean_
standardScaler.scale_   # 表述数据分布范围的变量,替代std_# 使用transform
X_train_standard = standardScaler.transform(X_train)
X_test_standard = standardScaler.transform(X_test)
#得到训练集和测试集

(五)自己实现均值方差归一化

仿照sklearn的风格,可以自己实现一下均值方差归一化的方法。


import numpy as npclass StandardScaler:def __init__(self):self.mean_ = Noneself.scale_ = Nonedef fit(self, X):"""根据训练数据集X获得数据的均值和方差"""assert X.ndim == 2, "The dimension of X must be 2"# 求出每个列的均值self.mean_ = np.array([np.mean(X[:,i] for i in range(X.shape[1]))])self.scale_ = np.array([np.std(X[:, i] for i in range(X.shape[1]))])return selfdef tranform(self, X):"""将X根据StandardScaler进行均值方差归一化处理"""assert X.ndim == 2, "The dimension of X must be 2"assert self.mean_ is not None and self.scale_ is not None, \"must fit before transform"assert X.shape[1] == len(self.mean_), \"the feature number of X must be equal to mean_ and std_"# 创建一个空的浮点型矩阵,大小和X相同resX = np.empty(shape=X.shape, dtype=float)# 对于每一列(维度)都计算for col in range(X.shape[1]):resX[:,col] = (X[:,col] - self.mean_[col]) / self.scale_[col]return resX

二、kNN的优缺点

KNN的主要优点有:

  1. 理论成熟,思想简单,既可以用来做分类也可以用来做回归
  2. 天然解决多分类问题,也可用于回归问题
  3. 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感
  4. 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合

KNN的主要缺点有:

  1. 计算量大,效率低。即使优化算法,效率也不高。
  2. 高度数据相关,样本不平衡的时候,对稀有类别的预测准确率低。
  3. 相比决策树模型,KNN模型可解释性不强。
  4. 维度灾难:随着维度的增加,“看似相近”的两个点之间的距离越来越大,而knn非常依赖距离。
维数 点到点 距离
1维 0到1的距离 1
2维 (0,0)到(1,1)的距离 1.414
3维 (0,0,0)到(1,1,1)的距离 1.73
64维 (0,0,…0)到(1,1,…1) 8
10000维 (0,0,…0)到(1,1,…1) 100

10000维貌似很多,但实际上就是100*100像素的黑白灰图片。

三、KD树

(一)KD树概念

Kd-树是K-dimension tree的缩写。是对数据点在k维空间(如二维(x,y),三维(x,y,z),k维(x1,y,z…))中划分的一种数据结构,主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索)。本质上说,Kd-树就是一种平衡二叉树。KD树是一种查询索引结构,广泛应用于数据库索引中。
由于K近邻法的重要步骤是对所有的实例点进行快速k近邻搜索。如果采用线性扫描(linear scan),要计算输入点与每一个点的距离,时间复杂度非常高。因此在查询操作时,使用kd树。

(二)KD树的原理

kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构,且kd树是一种二叉树,表示对k维空间的一个划分。
k-d tree是每个节点均为k维样本点的二叉树,其上的每个样本点代表一个超平面,该超平面垂直于当前划分维度的坐标轴,并在该维度上将空间划分为两部分,一部分在其左子树,另一部分在其右子树。即若当前节点的划分维度为d,其左子树上所有点在d维的坐标值均小于当前值,右子树上所有点在d维的坐标值均大于等于当前值,本定义对其任意子节点均成立。

(三)kd树的构建

常规的k-d tree的构建过程为:

  1. 循环依序取数据点的各维度来作为切分维度,
  2. 取数据点在该维度的中值作为切分超平面,
  3. 将中值左侧的数据点挂在其左子树,将中值右侧的数据点挂在其右子树,
  4. 递归处理其子树,直至所有数据点挂载完毕。

对于构建过程,有两个优化点:
• 选择切分维度:根据数据点在各维度上的分布情况,方差越大,分布越分散,从方差大的维度开始切分,有较好的切分效果和平衡性。
• 确定中值点:预先对原始数据点在所有维度进行一次排序,存储下来,然后在后续的中值选择中,无须每次都对其子集进行排序,提升了性能。也可以从原始数据点中随机选择固定数目的点,然后对其进行排序,每次从这些样本点中取中值,来作为分割超平面。该方式在实践中被证明可以取得很好性能及很好的平衡性。
例子:采用常规的构建方式,以二维平面点(x,y)的集合(2,3),(5,4),(9,6),(4,7),(8,1),(7,2) 为例结合下图来说明k-d tree的构建过程:

  1. 构建根节点时,此时的切分维度为x,如上点集合在x维从小到大排序为(2,3),(4,7),(5,4),(7,2),(8,1),(9,6);其中值为(7,2)。(注:2,4,5,7,8,9在数学中的中值为(5 + 7)/2=6,但因该算法的中值需在点集合之内,所以本文中值计算用的是len(points)//2=3, points[3]=(7,2))
  2. (2,3),(4,7),(5,4)挂在(7,2)节点的左子树,(8,1),(9,6)挂在(7,2)节点的右子树。
  3. 构建(7,2)节点的左子树时,点集合(2,3),(4,7),(5,4)此时的切分维度为y,中值为(5,4)作为分割平面,(2,3)挂在其左子树,(4,7)挂在其右子树。
  4. 构建(7,2)节点的右子树时,点集合(8,1),(9,6)此时的切分维度也为y,中值为(9,6)作为分割平面,(8,1)挂在其左子树。至此k-d tree构建完成。

    上述的构建过程结合下图可以看出,构建一个k-d tree即是将一个二维平面逐步划分的过程。

    需要注意的是,对于每次切分,都是循环顺序选择维度的,二维是:x->y-> x->y->x…;三维则是:x->y->z-> x->y->z…。
    下面从三维空间来看一下k-d tree的构建及空间划分过程。首先,边框为红色的竖直平面将整个空间划分为两部分,此两部分又分别被边框为绿色的水平平面划分为上下两部分。最后此4个子空间又分别被边框为蓝色的竖直平面分割为两部分,变为8个子空间,此8个子空间即为叶子节点。

    总之,KD树看似复杂,其实就是根据维度顺序,按顺序先后循环进行切分,从而达到空间分割的目的。

(四)KD树的检索

kd树的检索是KNN算法至关重要的一步,给定点p,查询数据集中与其距离最近点的过程即为最近邻搜索。

如在构建好的k-d tree上搜索(3,5)的最近邻时,对二维空间的最近邻搜索过程作分析。首先从根节点(7,2)出发,将当前最近邻设为(7,2),对该k-d tree作深度优先遍历。以(3,5)为圆心,其到(7,2)的距离为半径画圆(多维空间为超球面),可以看出(8,1)右侧的区域与该圆不相交,所以(8,1)的右子树全部忽略。接着走到(7,2)左子树根节点(5,4),与原最近邻对比距离后,更新当前最近邻为(5,4)。以(3,5)为圆心,其到(5,4)的距离为半径画圆,发现(7,2)右侧的区域与该圆不相交,忽略该侧所有节点,这样(7,2)的整个右子树被标记为已忽略。遍历完(5,4)的左右叶子节点,发现与当前最优距离相等,不更新最近邻。所以(3,5)的最近邻为(5,4)。

(五)sklearn中的KDTree

Sklearn中有KDTree的实现,仅构建了一个二维空间的k-d tree,然后对其作k近邻搜索及指定半径的范围搜索。多维空间的检索,调用方式与此例相差无多。

import numpy as np
from matplotlib import pyplot as plt
from matplotlib.patches import Circle
from sklearn.neighbors import KDTree
np.random.seed(0)
points = np.random.random((100, 2))
tree = KDTree(points)
point = points[0]
# kNN
dists, indices = tree.query([point], k=3)
print(dists, indices)
# query radius
indices = tree.query_radius([point], r=0.2)
print(indices)
fig = plt.figure()
ax = fig.add_subplot(111, aspect='equal')
ax.add_patch(Circle(point, 0.2, color='r', fill=False))
X, Y = [p[0] for p in points], [p[1] for p in points]
plt.scatter(X, Y)
plt.scatter([point[0]], [point[1]], c='r')
plt.show()

四、特征工程是什么?

特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。
虽然我们也有自动的机器学习框架,但特征工程永不过时,即使对于自动化方法,其中也有一部分经常需要根据数据类型、领域和要解决的问题而设计特殊的特征。
特征工程包含了

  •  Data PreProcessing(数据预处理)、
  •  Feature Extraction(特征提取)、
  •  Feature Selection(特征选择)
  •  Feature construction(特征构造)等子问题,
    而数据预处理又包括了数据清洗和特征预处理等子问题。

特征预处理介绍

特征预处理包括无量纲化、特征分桶、统计变换和特征编码等步骤

五、数值型特征无量纲化

我们的数据一般都是有单位的,比如身高的单位有m,cm,这个无量纲化并不是说把m变成cm,而是说,无论是m还是cm,最后都会变成1,也就是没有了单位。

无量纲化使不同规格的数据转换到同一规格。常见的无量纲化方法有标准化和归一化。
数据标准化的原因:

某些算法要求样本具有零均值和单位方差;
需要消除样本不同属性具有不同量级时的影响。

  • 归一化有可能提高精度;

    数量级的差异将导致量级较大的属性占据主导地位,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要);

  • 数量级的差异将导致迭代收敛速度减慢;

    当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;

  • 依赖于样本距离的算法对于数据的数量级非常敏感。

1.数据标准化(Standardization)

标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。

1)定义

基于原始数据的均值(mean)和标准差(standarddeviation)进行数据的标准化。将A的原始值x使用z-score标准化到x’。z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。

标准化公式:

均值和标准差都是在样本集上定义的,而不是在单个样本上定义的。标准化是针对某个属性的,需要用到所有样本在该属性上的值。

2)优缺点

优点:

  • Z-Score最大的优点就是简单,容易计算,Z-Score能够应用于数值型的数据,并且不受数据量级的影响,因为它本身的作用就是消除量级给分析带来的不便。

缺点:

  • o 估算Z-Score需要总体的平均值与方差,但是这一值在真实的分析与挖掘中很难得到,大多数情况下是用样本的均值与标准差替代;
  • o Z-Score对于数据的分布有一定的要求,正态分布是最有利于Z-Score计算的;
  • o Z-Score消除了数据具有的实际意义,A的Z-Score与B的Z-Score与他们各自的分数不再有关系,因此Z-Score的结果只能用于比较数据间的结果,数据的真实意义还需要还原原值;
  • o 在存在异常值时无法保证平衡的特征尺度。

2.归一化

1)MinMax归一化

区间缩放法利用了边界值信息,将属性缩放到[0,1]。

公式:

实现代码

from sklearn.preprocessing import MinMaxScaler
#区间缩放,返回值为缩放到[0, 1]区间的数据
minMaxScaler  = MinMaxScaler().fit(X_train)
minMaxScaler.transform(X_train)

缺点:
这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义;

MinMaxScaler对异常值的存在非常敏感。

2)MaxAbs归一化

单独地缩放和转换每个特征,使得训练集中的每个特征的最大绝对值将为1.0,将属性缩放到[-1,1]。它不会移动/居中数据,因此不会破坏任何稀疏性。

MaxAbs公式

缺点:
这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义;

MaxAbsScaler与先前的缩放器不同,绝对值映射在[0,1]范围内。

在仅有正数据时,该缩放器的行为MinMaxScaler与此类似,因此也存在大的异常值。

实现代码

from sklearn.preprocessing import MaxAbsScaler
maxAbsScaler  = MaxAbsScaler().fit(X_train)
maxAbsScaler.transform(X_train)

3.正态分布化(Normalization)

1)定义

正则化的过程是将每个样本缩放到单位范数(每个样本的范数为1),如果要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。

该方法是文本分类和聚类分析中经常使用的向量空间模型(Vector Space Model)的基础。

Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。

2)规则为l2的公式

3)正则化效果

选定的特征仅具有正值,转换后的数据仅位于正象限中。如果某些原始特征具有正值和负值的混合,则情况并非如此。

4)实现代码

from sklearn.preprocessing import Normalizer
#归一化,返回值为归一化后的数据
normalizer  = Normalizer(norm='l2').fit(X_train)
normalizer.transform(X_train)

4.标准化与归一化对比

1)标准化与归一化的异同

相同点:
它们的相同点在于都能取消由于量纲不同引起的误差;都是一种线性变换,都是对向量X按照比例压缩再进行平移。

不同点:

  • 目的不同,归一化是为了消除纲量压缩到[0,1]区间;
    标准化只是调整特征整体的分布;
  • 归一化与最大,最小值有关;
    标准化与均值,标准差有关;
  • 归一化输出在[0,1]之间;
    标准化无限制。

2)什么时候用归一化?什么时候用标准化?

  • 如果对输出结果范围有要求,用归一化;
  • 如果数据较为稳定,不存在极端的最大最小值,用归一化;
  • 如果数据存在异常值和较多噪音,用标准化,可以间接通过中心化避免异常值和极端值的影响。

3)归一化与标准化的应用场景

  • 在分类、聚类算法中,需要使用距离来度量相似性的时候(如SVM、KNN)、或者使用PCA技术进行降维的时候,标准化(Z-score
    standardization)表现更好;

  • 在不涉及距离度量、协方差计算、数据不符合正太分布的时候,可以使用第一种方法或其他归一化方法。
    比如图像处理中,将RGB图像转换为灰度图像后将其值限定在[0 255]的范围;

  • 基于树的方法不需要进行特征的归一化。
    例如随机森林,bagging与boosting等方法。
    如果是基于参数的模型或者基于距离的模型,因为需要对参数或者距离进行计算,都需要进行归一化。

一般来说,建议优先使用标准化。对于输出有要求时再尝试别的方法,如归一化或者更加复杂的方法。很多方法都可以将输出范围调整到[0, 1],如果我们对于数据的分布有假设的话,更加有效的方法是使用相对应的概率密度函数来转换。

除了上面介绍的方法外,还有一些相对没这么常用的处理方法:

  • RobustScaler、
  • PowerTransformer、
  • QuantileTransformer
  • 和QuantileTransformer等。

六、数值型特征特征分箱(数据离散化)

离散化是数值型特征非常重要的一个处理,其实就是要将数值型数据转化成类别型数据。连续值的取值空间可能是无穷的,为了便于表示和在模型中处理,需要对连续值特征进行离散化处理。

分箱的重要性及其优势:

  • 离散特征的增加和减少都很容易,易于模型的快速迭代;
  • 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
  • 离散化后的特征对异常数据有很强的鲁棒性;
    比如一个特征是年龄>30是1,否则0。
    如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
  • 对于线性模型,表达能力受限;
    单变量离散化为N个后,每个变量有单独的权重,相当于模型引入了非线性,能够提升模型表达能力,加大拟合;
  • 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
  • 特征离散化后,模型会更稳定;
    比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。
    当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
  • 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险;
  • 可以将缺失作为独立的一类带入模型;
  • 将所有变量变换到相似的尺度上。

1.无监督分箱法

1)自定义分箱

自定义分箱,是指根据业务经验或者常识等自行设定划分的区间,然后将原始数据归类到各个区间中。

2)等距分箱

定义
按照相同宽度将数据分成几等份。

从最小值到最大值之间,均分为 N 等份, 这样, 如果 A,B 为最小最大值, 则每个区间的长度为 W=(B−A)/N , 则区间边界值为A+W,A+2W,….A+(N−1)W 。这里只考虑边界,每个等份里面的实例数量可能不等。

缺点是受到异常值的影响比较大

实现程序

import pandas as pd
df = pd.DataFrame([[22,1],[13,1],[33,1],[52,0],[16,0],[42,1],[53,1],[39,1],[26,0],[66,0]],columns=['age','Y'])
df['age_bin_2'] = pd.cut(df['age'],3)  #新增一列存储等距划分的分箱特征
display(df)
##结果
age Y   age_bin_2
0   22  1   (12.947, 30.667]
1   13  1   (12.947, 30.667]
2   33  1   (30.667, 48.333]
3   52  0   (48.333, 66.0]
4   16  0   (12.947, 30.667]
5   42  1   (30.667, 48.333]
6   53  1   (48.333, 66.0]
7   39  1   (30.667, 48.333]
8   26  0   (12.947, 30.667]
9   66  0   (48.333, 66.0]

3)等频分箱

定义
将数据分成几等份,每等份数据里面的个数是一样的。
区间的边界值要经过选择,使得每个区间包含大致相等的实例数量。比如说 N=10 ,每个区间应该包含大约10%的实例。

实现程序

import pandas as pd
df = pd.DataFrame([[22,1],[13,1],[33,1],[52,0],[16,0],[42,1],[53,1],[39,1],[26,0],[66,0]],columns=['age','Y'])
df['age_bin_1'] = pd.qcut(df['age'],3) #新增一列存储等频划分的分箱特征
display(df)
## 结果age    Y    age_bin
0    22    1    (12.999, 26.0]
1    13    1    (12.999, 26.0]
2    33    1    (26.0, 42.0]
3    52    0    (42.0, 66.0]
4    16    0    (12.999, 26.0]
5    42    1    (26.0, 42.0]
6    53    1    (42.0, 66.0]
7    39    1    (26.0, 42.0]
8    26    0    (12.999, 26.0]
9    66    0    (42.0, 66.0]

4)聚类分箱

定义
基于k均值聚类的分箱:k均值聚类法将观测值聚为k类,但在聚类过程中需要保证分箱的有序性:第一个分箱中所有观测值都要小于第二个分箱中的观测值,第二个分箱中所有观测值都要小于第三个分箱中的观测值,等等。

实现步骤

  • Step 0:

对预处理后的数据进行归一化处理;

  • Step 1:

将归一化处理过的数据,应用k-means聚类算法,划分为多个区间:
采用等距法设定k-means聚类算法的初始中心,得到聚类中心;

  • Step 2:

在得到聚类中心后将相邻的聚类中心的中点作为分类的划分点,将各个对象加入到距离最近的类中,从而将数据划分为多个区间;

  • Step 3:

重新计算每个聚类中心,然后重新划分数据,直到每个聚类中心不再变化,得到最终的聚类结果。
实现代码

from sklearn.cluster import KMeans
kmodel=KMeans(n_clusters=k)  #k为聚成几类
kmodel.fit(data.reshape(len(data),1))) #训练模型
c=pd.DataFrame(kmodel.cluster_centers_) #求聚类中心
c=c.sort_values(by=’列索引') #排序  
w=pd.rolling_mean(c,2).iloc[1:] #用滑动窗口求均值的方法求相邻两项求中点,作为边界点
w=[0] +list(w[0] + [ data.max() ]  #把首末边界点加上
d3= pd.cut(data,w,labels=range(k)) #cut函数

5)二值化(Binarization)

定义
二值化可以将数值型(numerical)的feature进行阀值化得到boolean型数据。这对于下游的概率估计来说可能很有用(比如:数据分布为Bernoulli分布时)。

公式
定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0,公式如下:

2.有监督分箱法

1)卡方分箱法

定义
自底向上的(即基于合并的)数据离散化方法。它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。

基本思想
对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。

实现步骤

  • Step 0:

预先定义一个卡方的阈值;

  • Step 1:

初始化;
根据要离散的属性对实例进行排序,每个实例属于一个区间;

  • Step 2:

合并区间;
计算每一对相邻区间的卡方值;
将卡方值最小的一对区间合并;

Aij:第i区间第j类的实例的数量;Eij:Aij的期望频率(=(Ni*Cj)/N),N是总样本数,Ni是第i组的样本数,Cj是第j类样本在全体中的比例;
阈值的意义
类别和属性独立时,有90%的可能性,计算得到的卡方值会小于4.6。大于阈值4.6的卡方值就说明属性和类不是相互独立的,不能合并。如果阈值选的大,区间合并就会进行很多次,离散后的区间数量少、区间大。阈值的选择直接会影响到离散后的区间数量和区间大小。

注意
ChiMerge算法推荐使用0.90、0.95、0.99置信度,最大区间数取10到15之间;

也可以不考虑卡方阈值,此时可以考虑最小区间数或者最大区间数。
指定区间数量的上限和下限,最多几个区间,最少几个区间;
对于类别型变量,需要分箱时需要按照某种方式进行排序。

2)最小熵法分箱

需要使总熵值达到最小,也就是使分箱能够最大限度地区分因变量的各类别。

  • 熵是信息论中数据无序程度的度量标准,提出信息熵的基本目的是找出某种符号系统的信息量和冗余度之间的关系,以便能用最小的成本和消耗来实现最高效率的数据存储、管理和传递。
  • 数据集的熵越低,说明数据之间的差异越小,最小熵划分就是为了使每箱中的数据具有最好的相似性。给定箱的个数,如果考虑所有可能的分箱情况,最小熵方法得到的箱应该是具有最小熵的分箱。

总之,

  • 特征预处理是数据预处理过程的重要步骤,是对数据的一个的标准的处理,几乎所有的数据处理过程都会涉及该步骤。
  • 我们对特征进行分箱后,需要对分箱后的每组(箱)进行woe编码和IV值的计算,通过IV值进行变量筛选后,然后才能放进模型训练。
  • 分箱后需要进行特征编码,如:LabelEncode、OneHotEncode或LabelBinarizer等。

学习总结:

1、为什么要对数值类型数据做归一化处理?

  • 数字类型的各特征取值尺度范围可能不同,不同特征的取值范围可能不同,变化程度可能不同,归一化化会规避掉这种情况,使各特征都统一到一个大致相同的区间内。
  • 常用的特征归一化方法有,线性函数归一化(Min-Max Scaling)、零均值归一化(Z-score Normalization)

2、标准化和归一化有何异同?
相同点:都对不同特征维度的伸缩变换。
不同点:

  • 标准化就是一种对样本数据在不同维度上进行一个伸缩变化(而不改变数据的几何距离),也就是不改变原始数据的信息(分布)。
  • 归一化则会在不同维度上对数据进行不同的伸缩变化(归一区间,会改变数据的原始距离,分布,信息),使得其呈类圆形。虽然这样样本会失去原始的信息,但这防止了归一化前直接对原始数据进行梯度下降类似的优化算法时最终解被数值大的特征所主导。

3、将数值型数据转化成类别型数据,有何方法?如何实现?
采用数值型特征分箱的方法,常用的无监督分箱法包括:自定义分箱、等距分箱、等频分箱、聚类分箱、二值化分箱等。有监督分箱法包括:卡方分箱法、最小熵法分箱等。
实现的方法是先设定划分的区间,然后将原始数据归类到各个区间,从而完成特征分箱,达到将数值类型数据转换成类别型数据。

4、KNN在进行查询操作时使用何种算法,其原理是什么?
采用KD树算法进行查询,根据给定的点p,在KD树中查询数据集中与其距离最近点的过程即为最近邻搜索。先从根节点做深度优先遍历,然后以点p为圆心,p与根节点的之间的距离做半径,画圆,将不与该圆相交的子树全部忽略。然后再找到与p相邻最近的第二个维度的值的点,采用相同的办法,直至找到最接近的点。然后根据k值来找到参与投票的点的数量,根据其对应的值进行排队,最终根据投票的结果得到p的分类。

机器学习笔记(三)——归一化、KD树、数值型特征无量纲化、数值型特征分箱等相关推荐

  1. 机器学习笔记三—卷积神经网络与循环神经网络

    系列文章目录 机器学习笔记一-机器学习基本知识 机器学习笔记二-梯度下降和反向传播 机器学习笔记三-卷积神经网络与循环神经网络 机器学习笔记四-机器学习可解释性 机器学习笔记五-机器学习攻击与防御 机 ...

  2. 最大信息熵增益_机器学习笔记(三)——搞懂决策树必备的信息增益

    一.何为决策树 决策树是监督学习算法之一,并且是一种基本的分类与回归方法:决策树也分为回归树和分类树,本文讨论的是分类树.如果了解或者学过数据结构,肯定对"树"这个概念是不陌生的, ...

  3. 机器学习算法之二KD树

    KD树 实现k近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索. 这在特征空间的维数大及训练数据容量大时尤其必要. k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练 ...

  4. 机器学习 K近邻之KD树基本概念、绘制KD树

    K近邻算法回顾 K近邻法模型的三要素: 距离度量:  K值的选取:K值的选取一般可以采用交叉验证法,且一般小于训练集样本量的平方根 分类决策规则:多数表决等价于误分类数最小 关于K近邻的问题: 1.简 ...

  5. 机器学习----KNN中的Kd树及BBF优化

    一.KD树基本解释 1.1.基础概念 1.2.什么是KD树 1.3.KD树的构建 1.3.1.算法的实现 1.3.2.构造代码部分 1.3.2.具体步骤 二.KD树基本操作 2.1.KD树查找 2.2 ...

  6. 机器学习 K近邻之KD树 搜索KD树

    思想:K近邻搜索 1.寻找"当前最近点" 寻找最近邻的子节点作为目标的"当前最近点" 2.回溯 以目标点和"当前最近点"的距离沿树根部进行回 ...

  7. CatBoost 模型中标称型特征转换成数字型特征

    接上一篇文章 CatBoost 模型中标称特征的处理 ,这篇说一下CatBoot中实现的标称特征处理方法. 可以查看官网原文 Transforming categorical features to ...

  8. 机器学习笔记(三)线性模型

    3.线性模型 3.1基本形式 线性模型(linearmodel)形式简单.易于建模,如果能把问题都用线性模型来刻画,那现今的世界就单调多了,好在我们的宇宙是如此的丰富,以至于需要通过更强大的非线性模型 ...

  9. 机器学习笔记——决策树之分类树

    一.什么是决策树 决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题. 本文主要介 ...

  10. 多变量线性回归(机器学习笔记三)

    文章目录 前言 一.准备 二.代价函数和偏导数 三.特征归一化 四.梯度下降 五.Matlab代码实现 六.结语 前言 上一章通过年龄-身高的例子介绍了单变量线性回归算法的实现过程.通过使用向量表示算 ...

最新文章

  1. hihocoder 1061.Beautiful String
  2. java mvc ef_一个简单MVC5 + EF6示例分享
  3. hdu 2824 The Euler function
  4. angularjs 路由---angularjs 搭建前端框架
  5. 推荐一个markdown格式转html格式的开源JavaScript库
  6. Spring思维导图(IOC篇)
  7. python multiprocessing多进程执行for循环的代码
  8. eclipse中设置编码格式
  9. GitHub超过2600星的TensorFlow教程,简洁清晰还不太难丨资源
  10. DLM - stackglue 层
  11. K8S实战之部署java应用
  12. 达芬奇调色软件 18 for Mac
  13. STM-1和SDH的关系
  14. oracle注射,中国联通沃支付一处Oracle数据库注射
  15. jQuery API .ajaxComplete()
  16. LCS算法和背包算法
  17. 神经网络编程的34个案例,人工神经网络编程内容
  18. 软件测试的基础知识(四)
  19. 香港 “一卡通”業務收費表
  20. 项目管理工具dhtmlxGantt甘特图入门教程(八):数据加载(二)

热门文章

  1. 15. 三数之和 (已经解决超时问题,但是依旧时间依旧不乐观)
  2. 如何获得复权后的股票数据
  3. 默认关闭IDEA的注释doc的rendered view模式
  4. QT笔记- 如何判断窗口小部件是否自动出现(或隐藏)了滑条?
  5. 网络适配器图标不见了,WLAN以太网都不见了
  6. 华硕FX63VM笔记本bios如何设置U盘启动
  7. 回归中的相关度和R平方值 学习笔记
  8. 理解Intel cpufreq intel_pstate driver的工作模式
  9. 动态规划——计算二项式系数问题
  10. 通过香港招行一卡通收回PayPal资金