均值,中位数,众数在各种分布中的位置
数据清理:处理缺失值,光滑噪声数据,识别或者删除离群值,解决不一致的数据。
数据集成:不同数据库中的数据,多个数据源的数据整合到一起,在集成的过程中要考虑数据一致性的问题。比如,同一属性的数据在不同的数据库里,命名不同。
数据规约:包括维规约和数值规约。
维规约:数据压缩,比如主成分分析,小波变换,属性子集选择,属性构造。
数值规约:最小最大归一化,z值标准化,小数定标规范化(属性值小数点位置移动)
噪声数据的处理:分箱,将数据排列后,分成若干个等频的箱,没个箱的数据可以用改箱子的平均数做平滑处理。
回归:用一个函数拟合数据来光滑数据。
离群点分析:聚类方法找出离群点。
数据相关性的检测方法:
卡方检验:
其中c,r分别为A,B可能取值的数目。
皮尔逊相关系数:
缺失数据常用处理方法
a:直接丢弃,如果样本数据过少,缺失值记录超过10%,直接丢弃会导致大量信息的丢失,或者缺失数据记录有明显数据分布规律或特征,有些类别标签集中在这些缺失记录中,丢弃会导致模型过拟合,分类不准确。
b:插补的方法
用常数,中位数,众数,平均值补足
用模型预测值补全
少量重要意义的数据,可以采用专家补足
c:不处理,有些模型比如树模型可自动处理缺失值
数据降维之特征选择
经验法:依靠业务背景和对业务的理解,从众多维度选择对结果影响很大的特征。
测算法:通过不断选择特征进行计算,选取最佳特征方案
统计分析方法
机器学习算法:决策树,对特征进行选取
特征选择的好处在于:不仅降低了维度,还保留了特征原本的业务意义,特征可解释性好,便于业务理解和应用
共线性:输入的自变量之间存在较高的线性相关度。过度无关的维度参与计算浪费资源和时间,降低模型的稳定性和准确性。
共线性的检测方法:
容忍度:每个自变量和其他自变量回归建模,算出决定系数,1减去决定系数为容忍度,值越小越可能共线性
方差膨胀因子(variance inflation factor):容忍度的倒数
特征值:对自变量做主成分分析,如果多个维度的特征值为0,可能有严重的共线性
数据标准化处理方法
标准化z-score:
(x−mean)/std
(
x
−
m
e
a
n
)
/
s
t
d
改变数据的分布,是数据呈标准差为1,均值为0 的正态分布,不适合稀疏数据,离群点标准化处理后容易失去离群特征。
max-min:
(x−min)/(max−min)
(
x
−
m
i
n
)
/
(
m
a
x
−
m
i
n
)
是数据完全落入【0,1】,能保存原有数据分布
maxabs:
x/|max|
x
/
|
m
a
x
|
数据落入【-1,1】,能保存原数据分布,也适合稀疏数据
robustscaler:针对离群点做标准化处理
四种数据处理方法在sklearn.preprocessing都有实现
数据离散化
通常是对连续数据做处理,变成离散属性,但是也有对离散数据做离散化的(原离散化的数据过多,需要合并,或者不符合业务逻辑,要重新划分)离散化的好处在于:
节约计算资源,提高计算效率
算法模型的计算需要。有些模型可以处理连续数据,比如决策树,但是其本身也是先将数据离散化。
增强模型的稳定性和准确性,离散后一本异常数据会被划到一个子集中,异常值对模型的影响大大降低,尤其是基于距离计算的模型
模型应用和部署的需要,因为原始数据的值域分布过多,不符合业务逻辑,难以被理解和应用。
离散化常用方法
分位数法(4分位,5分位,10分位),等距法(等间距,较好的保持原数据的分布),等频法(每个区间观察值相同,改变又有数据的分布),聚类法(kmeans对数据聚类离散),卡方
二值化处理
数据点跟阀值比较,如果大于就设置为1,小于就设置为0,可以得到只有两个值域的2值化数据。
原始数据
#将时间换成是周几,周一为0,周日为6,时间离散化
df['weekday'] = pd.to_datetime(df['datetime']).map(lambda x:x.weekday())
#离散数据的离散化
map_tmep = pd.DataFrame(np.vstack([df['age'].sort_values().unique(),
['0-40','0-40','0-40','0-40','40-80','40-80','40-80','40-80','>80','>80']]).T,
columns=['age','age_change'])
df = df.merge(map_tmep,left_on='age',right_on='age',how='outer').drop('age',axis=1)
#连续数据离散化
df['amount1'] = pd.cut(df['amount'],bins=[0,200,1000,5000,10000])
#使用聚类离散化
kmean = KMeans(n_clusters=4,random_state=33)
df['amount_mean'] = kmean.fit_predict(df['amount'].values[:,np.newaxis])
#使用4分位离散化
df['amount_quatile'] = pd.qcut(df['amount'],4,labels=['bad','medim','good','awesome'])
#2值化
df['income_binary'] = np.where(df['income']>df['income'].mean(),1,0)