【说明】文章内容来自《机器学习入门——基于sklearn》,用于学习记录。若有争议联系删除。
特征预处理就是对数据进行集成、转换、规约等一系列处理,使之适合算法模型的过程。
sklearn提供了preprocessing模块,用于归一化、标准化、鲁棒化、正则化等数据预处理。
方法名 | 方法含义 |
preprocessing.MinMaxScaler | 归一化 |
preprocessing.StandardScaler | 标准化 |
preprocessing.RobustScaler | 鲁棒化 |
preprocessing.normalize | 正则化 |
1、归一化
归一化又称区间缩放法,采用归一化将不同规格的数据转换到同一规格。归一化利用边界值信息将特征的取值区间缩放到某个特点的范围,如[0,1]等。
归一化计算公式:
【参数说明】
- max:最大值
- min:最小值
- mx, mi:用于指定区间,默认mx为1,mi为0.
归一化将原始数据通过线性变换缩放到[0,1]。由于异常值往往是最大值或最小值,所以归一化的鲁棒性较差。
sklearn提供了MinMaxScaler方法进行归一化,具体语法如下:
MinMaxScaler(feature_range = (0,1))#feature_range = (0,1)将范围设置为0~1。
1.1 归一化示例:
from sklearn.preprocessing import MinMaxScaler
def Normalization():
Normalization = MinMaxScaler(feature_range = (0,1))
data = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
print(data)
#调用fit_transform#意思是找出data的均值和标准差,并应用在data上
data_Normal = Normalization.fit_transform(data)
print(data_Normal)
return None
if __name__ == '__main__':
Normalization()
#############直接调用
# from sklearn import preprocessing
# data1 = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
# min_max_scaler = preprocessing.MinMaxScaler()
# data1_minmax = min_max_scaler.fit_transform(data1)
# print(data1_minmax)
2、标准化
标准化用于解决归一化容易收到样本中最大值或者最小值等异常值的影响问题,将数据按比例缩放到特定区间。
标准差公式:
z-score标准化转换公式:
参数说明:
:平均值
标准化的前提是特征俯冲正态分布。进行标准化后,数据聚集在0附近,方差为1,有利于模型的训练。
sklearn提供了StandardScaler方法实现标准化,具体语法:
StandardScaler(copy, with_mean)
【参数说明】
copy:取值为True或False。在用归一化的值代替原来的值时设置为False。
with_mean:取值为True或False。在处理稀疏矩阵时设置为False。
标准化示例:
from sklearn.preprocessing import StandardScaler
def Standardization():
std = StandardScaler()
data = [[1.,-1.,3.],[2.,4.,2.],[4.,6.,-1.]]
print(data)
data_Standard = std.fit_transform(data)
print(data_Standard)
return None
if __name__ == '__main__':
Standardization()
3、鲁棒化
当数据包含许多异常值,使用平均值和方差缩放均不能取得较好效果,可以使用鲁棒性缩放方法处理。
preprossing的RobustScaler使用中位数和四分位数进行数据转换,直接将异常值剔除,具体语法:
- RobustScaler(quantile_range,with_centerring,with_scaling)
- with_centering:布尔值,默认为True,表示在缩放之前将数据居中
- with_scaling:布尔值,默认为True,表示将数据缩放发哦四分位数范围
- quantile_range:元组,默认值为(25.0,75.0),即IQR(四分位间距),表示用于计算scale的分位数范围
鲁棒化示例:
from sklearn.preprocessing import RobustScaler
X = [[1.,-2., 2.],[-2., 1., 3.],[4., 1., -2.]]
transformer = RobustScaler().fit(X)
RobustScaler(quantile_range = (25.0, 75.0),with_centering = True, with_scaling = True)
print(transformer.transform(X))
4、正则化
正则化是将每个样本缩放到单位范式,使数据分布在一个半径为1的圆或者球内。
preprocessing模块提供了normalize方法实现正则化,语法:
normalize(X,norm = 'l2')
【参数说明】
X:样本数据
l2: L2范数
示例:
from sklearn.preprocessing import normalize
X = [[1., -1., 2.],[2., 0., 0.],[0., 1., -1.]]
X_normalized = normalize(X,norm='l2')
print(X_normalized)
5、案例
【说明】需要自己创建一个dummy.xls文件。内容如下:
import pandas as pd
import numpy as np
from collections import Counter #引入计数器
from sklearn import preprocessing
from matplotlib import pyplot as plt
import seaborn as sns #seaborn绘图库
plt.rcParams['font.sans-serif'] = ['SimHei']#中文字体设置为黑体
plt.rcParams['axes.unicode_minus'] = False#解决保存图像时负号显示为方块的问题
sns.set(font = 'SimHei') #解决seaborn中文显示问题
data = pd.read_excel("e:/dummy.xls") #在e盘根目录下创建dummy.xls文件
print(data)
#显示序列的前n 行(默认值)
print('data head:\n',data.head())
#查看数据的行列大小
print('data.shape:\n',data.shape)
#显示制定列的数据描述属性值
print('data.describe:\n',data.describe())
#进行列级别的判断,只要某一列有NaN或值为空,则为真
print(data.isnull().any())
#将列中为NaN或值为空的个数统计出来,并将缺失值最多的排在前面
total = data.isnull().sum().sort_values(ascending = False)
print('total:\n',total)
#输出百分比
# .isnull()查找缺失值,sort_values(ascending = False)是否按指定列的数组进行排序
percent = (data.isnull().sum()/data.isnull().count()).sort_values(ascending = False)
#pd.concat()函数可以沿着指定的轴将多个dataframe或者series拼接到一起。axis = 左右拼接,
missing_data = pd.concat([total,percent],axis = 1, keys = ['Total','Percent'])
missing_data.head(20)
#导入missingno并删除缺失值
# import missingno
# missingno.matrix(data)
data = data.dropna(thresh = data.shape[0] * 0.5, axis = 1)
#将至少有一半以上是非空的列筛选出来
#如果某一行都是NaN才删除,默认只保留没有空值的行
data1 = data.dropna(axis = 0,how = 'any')
print(data1)
#统计重复记录数
data.duplicated().sum()
data.drop_duplicates()
data.columns
id_col = ['姓名']
cat_col = ['学历','学校']
cont_col = ['成绩','能力']
print(data[cat_col])
print(data[cont_col])
#计算出现的频次
for i in cat_col:
print(pd.Series(data1[i]).value_counts())
plt.plot(data1[i])
dummies = pd.get_dummies(data1[cat_col])#转换为哑变量可以增加数据特征
print('哑变量:\n',dummies)
from sklearn import preprocessing
#对连续型数据进行统计
data1[cont_col].describe()
#对连续型数据,将偏度大于0.75的数值用取对数的方法进行转换,使之符合正态分布
skewed_feats = data[cont_col].apply(lambda x: (x.dropna()).skew())
skewed_feats = skewed_feats[skewed_feats > 0.75]
skewed_feats = skewed_feats.index
data[skewed_feats] = np.log1p(data[skewed_feats])
print(skewed_feats)
#对连续数据进行标准化
scaled = preprocessing.scale(data[cont_col])
scaled = pd.DataFrame(scaled,columns = cont_col)
print(scaled)
m = dummies.join(scaled)
data_cleaned = data[id_col].join(m)
print('标准化:\n',data_cleaned)
#变量之间的相关性
print('变量之间的相关性:\n',data_cleaned.corr())
#绘制热力图
def corr_heat(df):
dfData = abs(df.corr())
plt.subplots(figsize = (9,9))
sns.heatmap(dfData, annot = True, vmax = 1, square = True, cmap = 'Blues')
plt.show()
corr_heat(data_cleaned)