数据预处理
- 数据格式化
先用fit()函数准备数据转换的参数,再用transform函数进行预处理。
fit(): 简单来说,就是求得训练集X的均值,方差,最大值,最小值,这些训练集X固有的属性。
transform(): 在fit的基础上,进行标准化,降维,归一化等操作(看具体用的是哪个工具,如PCA,StandardScaler等)。
fit_transform(): fit_transform是fit和transform的组合,既包括了训练又包含了转换。
transform()和fit_transform()二者的功能都是对数据进行某种统一处理(比如标准化~N(0,1),将数据缩放(映射)到某个固定区间,归一化,正则化等)
具体看实际问题应用。
- 调整数据尺度
即对数据的范围进行大小缩放。通过minmaxscaler实现
# 调整数据尺度(0..)
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import MinMaxScaler
# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
scaler = MinMaxScaler(feature_range=(0, 1))
# 数据转换
rescaledX = scaler.fit_transform(X)
# 设定数据的打印格式
set_printoptions(precision=3)
print(rescaledX)
- 正态化数据
假定数据服从高斯分布,进行标准化。通过Normalizer().fit(X)实现
# 标准化数据
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
scaler = Normalizer().fit(X)
# 数据转换
rescaledX = scaler.transform(X)
# 设定数据的打印格式
set_printoptions(precision=3)
print(rescaledX)
- 标准化数据
将每一行的数据的距离处理成1:
# 标准化数据
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
scaler = Normalizer().fit(X)
# 数据转换
rescaledX = scaler.transform(X)
# 设定数据的打印格式
set_printoptions(precision=3)
print(rescaledX)
- 二值化数据
大于阈值设置为1,小于阈值设置为0
# 二值数据
from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Binarizer
# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
transform = Binarizer(threshold=0.0).fit(X)
# 数据转换
newX = transform.transform(X)
# 设定数据的打印格式
set_printoptions(precision=3)
print(newX)
数据特征选取
- 单变量特征选定
通过卡方检验来判定自变量对因变量的相关性。
卡方检验就是样本的实际观察值与理论推断值之前的偏离程度,
卡方值越大,偏离值越大,越不符合;
卡方值越小,偏离值越小,越符合。
# 通过卡方检验选定数据特征
from csv import reader
from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]#第9列,即数据的标签
# 特征选定
test = SelectKBest(score_func=chi2, k=4)#根据给定的选择器chi2,选择出前k个与标签最相关的特征。
fit = test.fit(X, Y)
set_printoptions(precision=3)
print(fit.scores_)#输出8个组每组计算出的卡方值
features = fit.transform(X)
print(features)#输出最相关的前k个特征卡方值
-
递归特征消除法
通过一个基模型进行多轮训练,每轮训练后消除若干权值系数的特征。 -
主成分分析
PCA老熟人了,通过矩阵变换进行降维。因为我的凸优化大作业就是PCA+SVM,专门写了一贴做这个,详见那篇博文。
a. 设有M个N维数据:
b. 将原始数据按列组成N行M列矩阵X
c. 将X的每一行进行零均值化,即减去每一行的均值
d. 求出X的协方差矩阵C
e. 求出协方差矩阵C的特征值及对应的特征向量,C的特征值就是Y的每维元素的方差,也是D的对角线元素,从大到小沿对角线排列构成D。
f. 将特征向量按对应特征值大小从上到下按行排列成矩阵,根据实际业务场景,取前R行组成矩阵P
g. Y=PX即为降到R维后的目标矩阵
# 通过主要成分分析选定数据特征
from pandas import read_csv
from sklearn.decomposition import PCA
# 导入数据
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
# 将数据分为输入数据和输出结果
array = data.values
X = array[:, 0:8]
Y = array[:, 8]
# 特征选定
pca = PCA(n_components=3)
fit = pca.fit(X)
print("解释方差:%s" % fit.explained_variance_ratio_)
print(fit.components_)
- 特征重要性
略