特征工程—特征预处理及K-近邻算法总结

五、特征工程—特征预处理

1.特征预处理概念

通过一些转换函数将特征数据转换为更加适合算法模型的特征数据的过程。

2.为什么要进行归一化/标准化?

特征的单位或者大小相差较大,或者说某些特征的方差比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征。

无量纲化:就是将不同规格的数据转换到同一规格

3.特征预处理API
skklearn.preprocessing

3.1 归一化

  • 概念:通过对原始数据进行变换把数据映射到(默认为[0,1])之间

  • 公式

    • 特征工程—特征预处理及K-近邻算法总结_第1张图片

    作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

  • sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)

    • MinMaxScalar.fi_transform(X)
      • X:numpy array格式的数据
    • 返回值:转换后的形状相同的array
  • 示例:

    import pandas as pd
    from sklearn.preprocessing import MinMaxScaler
    
    def minmax_demo():
        
        '''
       	归一化演示
        '''
        data = pd.read_csv("dating.txt")
        
        # 1 实例化一个转换器类
        transfer = MinMaxScale(feature_range=(2,3))
        # 2 调用fit_transfrom
        data = transfer.fit_transfrom(data)
        print("最小值最大值归一化处理的结果:",data)
        
        return None
    
    minmax_demo()
    
  • 归一化总结

    • 注意最大值和最小值是变化的,另外,最大值和最小值非常容易受异常点影响,所以这种方式鲁棒性很差,只适合传统精确小数据场景

3.2 标准化

  • 概念:通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内

  • 公式:
    特征工程—特征预处理及K-近邻算法总结_第2张图片

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变

  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小

  • sklearn.preprocessing.StandardScaler()

    • 处理之后每列来说所有数据都聚集在均值0附近和标准差1
    • StandardScaler.fit_transform(X)
      • X:numpy array格式的数据
    • 返回值:转换后的形状相同的array
  • 示例:

import pandas as pd
from sklearn.preprocessing import StandardScaler

def stand_demo():
    
    '''
    标准化演示
    '''
    data = pd.read_csv("dating.txt")
    
    transfer = StandardScaler()
    data = transfer.fit_transform(data)
    print("标准化结果:",data)
    print("每一列特征的平均值:",transfer.mean_)
    print("每列特征的方差:",transfer.var_)
    
    return None

stand_demo()
  • 标准化总结:
    • 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

六、案例2:鸢尾花种类预测

1.再识K-近邻算法API
  • sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)
    • n_neighbors:
      • int : 可选,默认为5,查询默认使用的邻居数
    • algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}
      • 快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,用户可以自己指定搜索算法进行搜索。
        • brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算很耗时。
        • kd_tree构造kd树存储结构以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个节点是一个超巨星,在维数小于20时效率高。
        • ball_tree是为了克服kd树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每一个节点是一个超球体。
2.案例
步骤分析:
  • 1.获取数据集
  • 2.数据基本处理
  • 3.特征工程
  • 4.机器学习
  • 5.模型评估

2.1代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 1.获取数据集
iris = load_iris()

# 2.数据的基本处理
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)

# 3.标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)

# 4.模型训练,KNN算法
estimator = KNeighborsClassifier(n_neighbors=9)
estimator.fit(x_train,y_train)

# 5.模型评估
# 方案一,对比真实值和预测值
y_predict = estimator.predict(x_test)
print("预测值为:",y_predict)
print("真实值和预测值的对比:",y_predict==y_test)
# 方案二,直接计算准确率
score = estimator.score(x_test,y_test)
print("准确率为:",score)

七、K-近邻算法总结

  • 优点:
    • 简单有效
    • 重新训练的代价低
    • 适合类域交叉样本
      • KNN方法主要靠周围有限的临近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更合适
    • 适合大样本自动分类
      • KNN算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这中算法比较容易产生误分。
  • 缺点:
    • 惰性学习
      • KNN算法是懒散学习方法
    • 类别评分不是规格化
      • 不像一些通过概率评分的分类
    • 输出可解释性不强
      • 列入决策树的输出可解释性就较强
    • 对不均衡的样本不擅长
      • 当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本的时候,该样本的K个邻居中大容量的样本占多数。该算法只计算“最近的”邻居样本,某一类样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进。
    • 计算量较大
      • 目前常用的解决方法是事先对已知样本进行剪辑,事先去除对分类作用不大的样本。

你可能感兴趣的:(K-近邻算法,特征工程,特征预处理)