机器学习sklearn—数据的特征预处理

单个特征

归一化

归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。 例如:一个人的身高和体重两个特征,假如体重50kg,身高175cm,由于两个单位不一样,数值大小不一样。如果比较两个人的体型差距时,那么身高的影响结果会比较大,k-临近算法会有这个距离公式。

min-max方法

常用的方法是通过对原始数据进行线性变换把数据映射到[0,1]之间

其中min是样本中最小值,max是样本中最大值,注意在数据流场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性(适用性)较差,只适合传统精确小数据场景。


def minmax():
    """
    归一化将数据处理到某一个指定的范围
    同等重要的特征数据, 如果某一个数据特别大 有可能会对结果的分析造成的影响比较大,此时就需要将处理的数据重要性平等的对待
    此时需要讲数据进行归一化的处理
    :return: 
    """
    # 创建对象
    min_max = MinMaxScaler(feature_range=(2,5))
    data = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
    # 转换数据
    data = min_max.fit_transform(data)
    print(data)
    return None

标准化

常用的方法是z-score标准化,经过处理后的数据均值为0,标准差为1

其中\muμ是样本的均值,\sigmaσ是样本的标准差,它们可以通过现有的样本进行估计,在已有的样本足够多的情况下比较稳定,适合嘈杂的数据场景

def stand():
    """
    将数据处理成一种比较稳定的正太分布数据
    :return: 
    """
    std = StandardScaler()
    data = [[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]]
    data = std.fit_transform(data)
    print(std.mean_)
    # print(std.std_)
    print(data)
    return None

sklearn中提供了StandardScalar类实现列标准化:

缺失值

由于各种原因,许多现实世界的数据集包含缺少的值,通常编码为空白,NaN或其他占位符。然而,这样的数据集与scikit的分类器不兼容,它们假设数组中的所有值都是数字,并且都具有和保持含义。使用不完整数据集的基本策略是丢弃包含缺失值的整个行和/或列。然而,这是以丢失可能是有价值的数据(即使不完整)的代价。更好的策略是估算缺失值,即从已知部分的数据中推断它们。

填充缺失值 使用sklearn.preprocessing中的Imputer类进行数据的填充

def imputer():
    """
    缺失值的处理
    axis 默认为0 是通过列的平均值来填充
    :return: None
    """
    im = Imputer(strategy="mean",axis=1)
    data = [[1, 2], [np.nan, 3], [7, 6]]

    data = im.fit_transform(data)
    print(data)

    return None

多个特征

降维

PCA(Principal component analysis),主成分分析。特点是保存数据集中对方差影响最大的那些特征,PCA极其容易受到数据中特征范围影响,所以在运用PCA前一定要做特征标准化,这样才能保证每维度特征的重要性等同。

sklearn.decomposition.PCA

def pca():
    """
    pca给数据降维 如果没有指定降低维度的数量, 会在原有的维度-1
    :return: None
    """
    p = PCA(n_components=2)
    data = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]

    data = p.fit_transform(data)
    print(data)
def pcaexample():
    """
    通过PCAde方式给用户购买商品类型的偏好进行数据降维
    orders --> order_products_prior  --> products  --> aisles
    :return: None
    """
    orders = pd.read_csv("./data/instacart/orders.csv")
    aisles = pd.read_csv("./data/instacart/aisles.csv")
    order_products_prior = pd.read_csv("./data/instacart/order_products_prior.csv")
    products = pd.read_csv("./data/instacart/products.csv")
    me = pd.merge(orders, order_products_prior, on=['order_id','order_id'])
    me = pd.merge(me, products, on=['product_id', 'product_id'])
    me = pd.merge(me, aisles, on=['aisle_id','aisle_id'])
    # 用户和商品类别的关系
    me = pd.crosstab(me['user_id'],aisles['aisle'])
    #创建pca降维对象
    pca = PCA(n_components=100)
    # fit_transform
    me = pca.fit_transform(me)
    print(me)

猜你喜欢

转载自blog.csdn.net/qq_39161737/article/details/78881126