机器学习 sklearn 特征预处理

备注:刷视频记录一下,以防知识点遗忘。

数据的特征预处理

单个特征

(1)归一化

引入:避免某一个特征对最终结果造成更大影响,为了不造成干扰。

例如:数据含有多个特征,但是某个特征的数据非常大,导致了其他特征的数据可以忽略不计,但是我又不想看到这样的情况,所以引入归一化。例如:下面里程数的数值非常大,如果不处理直接*权重,会导致结果误差较大:

归一化的计算公式:

说白了就是某列的某个数据x,在最大最小区间中的占比,再缩放到指定的区间,默认0-1。

归一化存在的问题:由公式我们不难发现,最大最小值受异常点的影响非常大,这种方法鲁棒性(反应产品稳定性)较差,只适合传统精确小数据场景(少)。例如下图:红色为异常点。

from sklearn.preprocessing import MinMaxScaler

def mm():
    """
    归一化处理
    :return: None
    """
    mm = MinMaxScaler(feature_range=(2, 3))
    data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
    print(data)

    return None

将特征值缩放到(2,3)之间,处理后的数据如下图:

(3)标准化

引入:对于标准化出现异常点,影响最大最小值,结果将发生该变。但是少量异常点对平均值影响并不大,方差改变较小。

标准化计算公式:

备注一下:方差用来衡量数据的稳定性。数据分散:方差大。数据集中:方差小。

标准化处理后的结果:将原始数据转换到均值为0,方差为1 的范围。

总结:异常数据标准化更好一点,通常使用的是标准化。

from sklearn.preprocessing import StandardScaler
def stand():
    """
    标准化缩放
    :return:
    """
    std = StandardScaler()
    #构造为二维数组
    data = std.fit_transform([[1,-1,3], [2,4,2], [4,6,-1]])
    print(data)
    return None

(3)缺失值

这里除了使用sklearn 的Imputer的方法,还可以使用的是pandas对数进行处理。

from sklearn.preprocessing import Imputer

def im():
    """
    缺失值处理
    :return:None
    """
    #NaN nan 0是列,1是行
    im = Imputer(missing_values='NaN', strategy='mean', axis = 0)
    data = im.fit_transform([[1,2],[np.nan, 3],[7, 6]])

    print(data)
    return None

多个特征

降维

实际就是减少一些特征的数量

降维的方法:特征选择,主成分分析:PCA,神经网络。

1)特征选择--删除低方差特征。

原因:当方差为0的时候,这一列特征的数据都一样,不能当做分析的特征。指定方差为0 的都出删除。

from sklearn.feature_selection import VarianceThreshold

def var():
    """
    他正选择-删除低方差的特征
    :return:
    """
    var = VarianceThreshold(threshold=1.0)
    data = var.fit_transform([[0,2,0,3], [0,1,4,3], [0,1,1,3]])
    print(data)
    return  None

下面输出删除方差小于1后的结果,结果显示如下:

2)主成分分析进行降维(PCA)

核心:把你的维度降低,里面的数据没有损耗很多

特征数量达到上百个,考虑使用。

from sklearn.decomposition import PCA

def pca():
    """
    主成分分析进行降维
    :return: None
    """
    #n_components:小数,0~1       90%
    pca = PCA(n_components=0.9)
    data = pca.fit_transform([[2, 8, 4,5],[6,3,0,8],[5,4,9,1]])
    print(data)

    return None

处理后的结果如下:

猜你喜欢

转载自blog.csdn.net/Rand_C/article/details/85709281