区块链技术博客
www.b2bchain.cn

机器学习特征工程与KNN详细探讨

这篇文章主要介绍了机器学习特征工程与KNN详细探讨的讲解,通过具体代码实例进行20502 讲解,并且分析了机器学习特征工程与KNN详细探讨的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=20502

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

机器学习特征工程

    • 1.什么是特征工程
    • 2.数据归一化
      • 2.1 最值归一化的实现
      • 2.2 均值方差归一化的实现
      • 2.3 Sklearn中的归一化
    • 3.KNN算法的优缺点探讨
      • 3.1KNN的主要优点:
      • 3.2 KNN的主要缺点
      • 3.3 KNN优化之KD树
        • 3.3.1 KD树的原理
        • 3.3.2 Sklearn中KDTree

1.什么是特征工程

特征在机器学习以及数据挖掘的过程中是最为重要的一个指标,在美团机器学习实践中曾探讨,数据和特征决定了机器学习的上限,而模型和算法只是无限的逼近这个上限。而在实际的工作中,根据业务部门或者甲方提出的需求,通常情况下数据都是给定的,那么作为一名工程师,我们只能够在有限的数据中根据实际情况来找到更多的特征,那么在这一过程中特征工程就应运而生。

2.数据归一化

在实际应用中,样本的不同特征的单位不同,会在求距离时造成很大的影响。比如在房屋价格分析中,房屋总价是400万和600万,这样在价格样本中就会差200万,而他们的面积可能是60和90,这样的均价样本差则为30,这样就导致结果会被总价所主导,因为面积的差距太小了,如果我们用百万作为单位,那么价格样本差就会变成2, 那么实际的模型又会被面积所主导。
我们发现,在量纲不同的情况下,以上的情况,不能反映样本中每一个特征的重要程度。这就需要数据归一化了。
一般来说,我们的解决方案是:把所有的数据都映射到同一个尺度(量纲)上。
一般来说,常用的数据归一化有两种:

  • 最值归一化:把所有数据映射到0-1之间。最值归一化的使用范围是特征的分布具有明显边界的(分数0~100分、灰度0~255),受outlier的影响比较大
    机器学习特征工程与KNN详细探讨
  • 均值方差归一化:把所有数据归一到均值为0方差为1的分布中。适用于数据中没有明显的边界,有可能存在极端数据值的情况.

机器学习特征工程与KNN详细探讨

2.1 最值归一化的实现

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() 

机器学习特征工程与KNN详细探讨

2.2 均值方差归一化的实现

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() 

机器学习特征工程与KNN详细探讨

2.3 Sklearn中的归一化

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

import numpy as np # 加载鸢尾花数据集 from sklearn import datasets from sklearn.model_selection import train_test_split  iris = 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) 

3.KNN算法的优缺点探讨

3.1KNN的主要优点:

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

3.2 KNN的主要缺点

  • 计算量大,效率低。即使优化算法,效率也不高。
  • 高度数据相关,样本不平衡的时候,对稀有类别的预测准确率低
  • 相比决策树模型,KNN模型可解释性不强
  • 维度灾难:随着维度的增加,“看似相近”的两个点之间的距离越来越大,而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

3.3 KNN优化之KD树

K近邻法的重要步骤是对所有的实例点进行快速k近邻搜索。如果采用线性扫描(linear scan),要计算输入点与每一个点的距离,时间复杂度非常高。因此在查询操作时,使用kd树。

3.3.1 KD树的原理

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

3.3.2 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()  

机器学习特征工程与KNN详细探讨

本文转自互联网,侵权联系删除机器学习特征工程与KNN详细探讨

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 机器学习特征工程与KNN详细探讨
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们