机器学习Python实践总共有22个章节(Ch1-22)
本文主要介绍的是部分三
部分三 数据准备(Ch8-9)
特征工程是最基本和重要的!!!
数据预处理:需要对数据本身的特性进行
其中有缺失值的需要填充
无效数据要剔除
有冗余维的要选择
数据预处理三个步骤:
- 数据的准备
- 数据的转换(1.调整数据尺度(Rescale Data) 2.正态化数据(Standardize Data) 3.标准化数据(Normalize Data) 4.二值数据(Binarize Data))
- 数据的输出
处理数据的流程:
导入数据 2.按照算法的输入和输出整理数据 3.格式化输入数据 4. 总结显示数据的变化
格式化数据两种方法:
适合和多重变换(Fit and Multiple Transform)——①调用fit()函数准备数据转换的参数,②transform()函数来数据预处理
适合和变换组合(Combined Fit-and-Transform)
数据的转换
1.调整数据尺度(Rescale Data)
将数据的所有属性标准化,将数据转换成0~1之间的值(对于梯度下降很有用,回归算法、神经网络算法和K近邻算法的准确度提高☝️很有用)——scikit-learn中常用MinMaxScaler类来调整数据尺度。
统计学中,按照对事物描述的精确度分为: (从低到高划分)
定类尺度(最低):按事物的类别属性进行分类
定序尺度:对事物的等级或顺序的一种测度,可以比较优劣或排序
定距尺度:区分为类别之后再讲不同的类别进行排序,准确指出类别之间的差距(定类尺度再定序尺度的集合)
定比尺度:(定距尺度的update)在定距尺度基础上,有一个固定的绝对“零”点。 一般定距尺度和定比尺度:都是对类别+次序的测度,所以使用时不做严格区分。
# 调整数据尺度(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为属性,Y为class类别(X,Y都跟array一样为二维数组)
X = array[:, 0:8]
Y = array[:, 8]
scaler = MinMaxScaler(feature_range=(0, 1))
# 数据转换
rescaledX = scaler.fit_transform(X)
# 设定数据的打印格式
set_printoptions(precision=3)
print(f"经过调整X的数据尺度,使得数据均在0和1之间:\n{rescaledX}")
#rescaledX的行数和列数
print(rescaledX.shape)
输出结果:
2.正态化数据(Standardize Data)
假定数据符合高斯分布的算法输入——使用scikit-learn中常用StandardScaler类来进行正态化数据处理。
- 这些算法有:线性回归,逻辑回归和线性判别分析等!
代码只有下图红框处的不同!
输出结果:
3.标准化数据(Normalize Data)
适合用于稀疏数据(具有很多0的数据)——使用scikit-learn中常用Normalizer类
- 处理流程为:将每一行的数据距离处理成1,即归一化处理~
代码只有下图红框处的不同!
输出结果:
4.二值数据(Binarize Data)
用于生成明确值 or 特征工程增加属性——使用scikit-learn中常用Binarizer类
- 处理流程为:设定某个阈值,大于阈值的设为1,小于阈值的为0,转化成二值——这个过程称之为:二分数据 or 阈值转换。
代码只有下图红框处的不同!
输出结果:
数据特征选定——十分重要!
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已!
特征工程的本质:一项工程活动,目的:最大限度地从原始数据中提取合适的特征,以供算法和模型使用。
特征处理是特征工程的核心部分。 scikit-learn 提供了较为完整的特征处理方法,包括数据预处理、特征选择、降维等。 scikit-learn四个数据特征选择的方法:
- 单变量特征选定
- 递归特征消除
- 主要成分分析(PCA)
- 特征的重要性
- 特征选定的作用:1.降低数据的拟合度(减少冗余的数据) 2.提高算法的精度(减少误导的数据,误导的数据会对预测新数据产生干扰(尤其是线性相关算法,线性回归算法和逻辑回归算法)) 3.减少训练时间(越少的数据,训练时间越短)
1.单变量特征选定
单变量的特征选定(univariate-selection)
- scikit-learn中提供了SelectKBest类,利用卡方检验(或者其他统计方法,e.g.相关系数等 可以作为score_func来进行特征选定)选择对结果影响最大的数据特征。
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
test = SelectKBest(score_func=chi2,k=4)#chi2为卡方检验,k=4即选择4个对结果影响最大的特征
2.递归特征消除
递归特征消除(recursive feature elimination-selection)
- scikit-learn中提供了RFE类,选择一个基模型(比如:线性相关算法中的逻辑回归)进行多轮训练,经过每一轮基模型的accuracy来选出对结果影响最大的数据特征。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
rfe = RFE(model,n_features_to_select=3)#选出3个对结果影响最大的特征
3.主要成分分析(PCA)
主要成分分析(principle component analysis-selection)
PCA降维具体操作:
常见的数学降维方法(即使用线性代数来转换压缩数据):主要成分分析(PCA) 还有 线性判别分析(LDA)
- PCA:为了让映射后的样本具有更大的发散性——无监督的降维方法
- LDA:为了让映射后的样本具有更好的分类性——有监督的降维方法
- scikit-learn中提供了PCA类,在聚类算法中,主要使用的还是PCA对数据进行降维,以利于数据的简化分析和可视化。
from sklearn.decomposition import PCA
pca = PCA(n_components=3)#最终将到特征维度为3
4.特征重要性
使用集成算法中的袋装算法,能够计算数据特征的重要性。
常见的袋装算法有:
- 袋装决策树算法(Bagged Decision Tree)
- 随机森林算法(Random Forest)
- 极端随机数算法
- scikit-learn中提供了ExtraTreesClassifier类对特征的重要性进行计算,来选择对结果影响最大的数据特征。
from sklearn.ensemble import ExtraTreesClassifier
model = ExtraTreesClassifier()
fit = model.fit(X, Y)
print(fit.feature_importances_)
计算出的是8个特征的得分