机器学习--标准化和缺失值处理、数据降维
标准化和缺失值的处理
标准化 :
特点 : 通过对原始数据进行变换把数据变换到均值为0, 标准差为1的范围内.
## 对于归一化来说:如果出现异常点,影响了大值和小值,那么结果显然会发生改变 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从 而方差改变较小。在已有样本足够多的情况下比较稳定,适合现代嘈杂的大数据场景。 ##
标准化API :
API : sklearn.preprocessing.StandarScaler StandardScaler() 处理之后每列所有数据都聚集在均值为0标准差为1附近 StandarScaler.fit_transform(x) x:numpy array格式的数据(n_samples,n_features) 返回值:转换后的形状相同的array StandarScaler.mean_ 原始数据中每列的平均值中位数 StandarScaler.std_ 原始主句每列特征的方差 步骤 实例化 StandarScaler 通过 fit_transform 转换
案例 :案例 :案例 :案例 :
import numpy as np from sklearn.preprocessing import StandardScaler ss = StandardScaler() # 实例化 data = np.array([[5000,2,10,40],[6000,3,15,45],[50000,5,15,40]]) # 数据 res = ss.fit_transform(data) print(res)
缺失值的处理方法 :
删除 : 如果每列或者行数据达到一定比例, 建议放弃整行或整列 .
插补 : 可以通过缺失值每行或每列的平均值/中位数来填充.
缺失值处理API :
sklearn缺失值接口 : sklearn.impute.SimpleImputer SimpleImputer(missing_values=‘NaN‘,strategy=‘mean‘,axis=0) 完成缺失值插补 SimpleImputer.fit_transform(x) x:numpy array格式的数据 返回值:转换后形状相同也即是的array 步骤 初始化SimpleImputer,指定缺失值,指定填补策略,指定行或列。 注:缺失值也可以是别的指定要替换的值 调用 ?t_transform
案例:案例:案例:案例:
import numpy as np from sklearn.impute import SimpleImputer data = np.array([[1,2],[np.NaN,3],[7,6]]) si = SimpleImputer() # si = SimpleImputer(missing_values=6,strategy=‘most_frequent‘) # missing_values : 指定值填充,默认为NaN. # strategy : 填充数值计算方法 [‘mean‘, ‘median‘, ‘most_frequent‘, ‘constant‘] res = si.fit_transform(data) print(res)
## ?? 列avg,不包含NaN,不计算NaN行 ##
数据降维
数据降维 :这里的维度指定是特征数量,这里的降维是指减少特征的数量。
数据降维有2种,分别是特征选择 和 主成分分析.
特征选择 :
特征选择的原因 :
冗余 : 部分特征的相关度搞,容易消化计算性能.
噪声 : 部分特征对预测结果有影响.
概念 :
特征选择就是指 单纯的从提取到的所有特征选择部分特征作为训练集特征, 特征在选择前和选择后可以改变值,也可以不改变值.但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分.
主要方法:
Filter(过滤式): VarianceThreshold
Embedded(嵌入式): 正则化 , 决策树
特征选择API (降维):
类:sklearn.feature_selection.VarianceThreshold VarianceThreshold(threshold=0.0) 删除所有低方差特征 Variance.?t_transform(x) x:numpy array格式的数据 返回值:删除方差低于threshold的特征之后的数据集 默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征 流程 初始化VarianceThreshold,指定阈值方差 调用 ?t_transform
案例:案例:案例:案例:
# 案例演示 import numpy as np from sklearn.feature_selection import VarianceThreshold data = np.array([[0,2,0,3],[0,1,4,3],[0,1,2,3]]) print(‘降维前:‘,data) vt = VarianceThreshold(threshold=0.0) #过滤方差为0 , 数据不变 res = vt.fit_transform(data) # 少部分数据 print(‘降维后:‘,res)
主成分分析 :
本质 : PCA是一种分析,简化数据集的技术.
目的 : 是数据维度压缩,尽可能降低原数据的维数(复杂度),尽可能的减少损失信息
作用 : 可以消减回归分析或者聚类分析中特征的数量
使用场景 : 特征数量达到上百的时候,考虑数据的简化.
主成分分析API(降维) :
类 sklearn.decompositon.PCAPCA(n_componets=None) 将数据分解为较低维数据 PCA.?t_transform(x) x:numpy array格式 返回值:转换后降低维度的array n_componets参数: 小数:表示将信息保存到原信息的百分比,例如0.95表示降维后信息量是原来的95%。一般制定到0.9-0.95 整数:较少到的特征数量,一般不使用 流程 实例化 PCA 调用 ?t_transform
案例:案例:案例:案例:
from sklearn.decomposition import PCA pca = PCA(n_components=0.95) data = np.array([[2,8,4,5],[6,3,0,8],[5,4,9,1]]) print(‘主成分分析降维前:\n‘,data) res = pca.fit_transform(data) print(‘主成分分析降维后:\n‘,res) # 维度下降,不损失信息
真实案例演示 :
案例代码 :
# 代码 import pandas as pd from sklearn.decomposition import PCA # 读取四张表的数据 prior = pd.read_csv(r‘D:\dataanalysis\Felix\week7\instacart\order_products__prior.csv‘) # 没有数据,只有代码..... product = pd.read_csv(r‘D:\dataanalysis\Felix\week7\instacart\products.csv‘) orders = pd.read_csv(r‘D:\dataanalysis\Felix\week7\instacart\orders.csv‘) aisles = pd.read_csv(r‘D:\dataanalysis\Felix\week7\instacart\aisles.csv‘) # 合并四张表到一张表,(用户-物品类别) data = pd.merge(prior, product, on=‘product_id‘) data = pd.merge(data, orders, on=‘order_id‘ ) data = pd.merge(data, aisles, on=‘aisle_id‘) # 建立一个以用户为行,产品为列的表 # 即用户和产品进行交叉 table = pd.crosstab(data[‘user_id‘], data[‘aisle‘]) # 数据结构为(206209, 134),需要做主成分分析,进行降维 pca = PCA(n_components=0.9) res = pca.fit_transform(table) # 最后降维成: (206209, 27)
API总结 :
1. fit_transform() : 输入数据直接转换
2. fit() : 输入数据,计算一些中间值,但是不能转换
3. transform() : 进行数据转换
4. fit_transform() = fit() + transform()