Python 常用(聚类/分类)数据预处理方法

要对数据进行聚类/分类,往往需要经过以下几个步骤:

处理缺失值(我比较少遇到)--》数据标准化 --》降维(白化) --》训练 --》预测 --》评价模型效果

0. 缺失值的处理一般是填充缺省值或者平均值等方法,我一般直接补0

1. 对数据进行标准化。常用的方法有z-score和maxmin。其中,z-socre是(x-mean)/std,也就是去中心化。注意:标准化方法(以及降维)只能在训练集上训练,不能加入验证集或是测试集(防止“偷看”),然后再将训练好的模型用到验证集和测试集上。

from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler
# maxmin
min_max_scaler = MinMaxScaler()
train_data_scale = min_max_scaler.fit_transform(train_data)

# z-score
# 1. (x-mean)/std - the standard way
std_scaler = StandardScaler()
train_data_scale = std_scaler.fit_transform(train_data)
# 2. removes the median and scales the data according to the quantile range (25%-75%) - the robust way, suitable for data contain outliers.
rob_scaler = RobustScaler()
train_data_scale = rob_scaler.fit_transform(train_data)

有时候还会遇到nominal(标称)类型的字段,这时候需要首先将这些字段拿出来,然后进行one-hot编码。经过one-hot编码,一个有n种取值的特征变成n位二进制,比如:male,female --》(1,0),(0,1)。如果需要进行one-hot操作,则优先完成。

import random
from sklearn import preprocessing

enc = preprocessing.OneHotEncoder(handle_unknown='ignore')
# fit是找出每个字段有几种取值的过程,因此并不一定需要全部
sample_list = random.sample(str_feature_list, 100000)
enc.fit(sample_list)
enc_str_feature_list = enc.transform(str_feature_list).toarray()

2. 降维的方法包括PCA和AutoEncoder。PCA对数据进行降维(降维后的数据相当于换了一套坐标系,是无法被解释的)进行的是线性变换,AE则可以学习到非线性关系,表达能力更强但是问题是训练更慢。有些时候,预测器假设feature之间是互相独立的,因此就要将PCA的whiten参数设置为True对数据进行白化。该过程可能会使数据损失一些信息量,但在某些时候会提高预测的准确率。

from sklearn.decomposition import PCA

# 保存95%的信息
pca = PCA(n_components=0.95, svd_solver='full')
pca.fit(feature_list_scale)
pca_data = pca.transform(feature_list_scale)

3/4/5. sklearn已经帮我们实现了绝大多数功能的封装

常用的聚类算法:http://scikit-learn.sourceforge.net/stable/modules/clustering.html#clustering

常用的分类算法:http://scikit-learn.sourceforge.net/stable/supervised_learning.html

常用的评价指标:https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics

你可能感兴趣的:(Python)