单个特征
归一化
归一化首先在特征(维度)非常多的时候,可以防止某一维或某几维对数据影响过大,也是为了把不同来源的数据统一到一个参考区间下,这样比较起来才有意义,其次可以程序可以运行更快。 例如:一个人的身高和体重两个特征,假如体重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)