Python机器学习实战:数据预处理与特征工程详解

许南星
许南星
发布时间:2026-10-14| 5人浏览过
原创

本文深入解析Python机器学习中的数据准备流程,涵盖数据预处理四大核心方法:Min-Max缩放、正态化、标准化及二值化处理,并详细阐述特征选定策略,包括单变量卡方检验、递归特征消除(RFE)、主成分分析(PCA)及基于树模型的特征重要性评估,助力提升模型精度与训练效率。

特征选择过程往往既困难又耗时,且高度依赖于对业务需求的深刻理解及领域专业知识的积累。在机器学习应用开发的全流程中,特征工程构成了最基础且至关重要的环节。

——吴恩达

1.数据预处理

数据预处理工作必须紧密结合数据自身的分布特性与业务背景展开。具体操作包括对缺失值进行合理填补、剔除无效或异常数据,以及删除冗余维度。这些步骤的执行标准均与数据本身的物理或统计特性紧密相关。

1.1调整数据尺度

当数据的各个属性采用不同的度量单位或量级时,通过调整数据尺度使所有属性统一至相同量级,将极大简化机器学习算法模型的训练过程。

在scikit-learn库中,可利用MinMaxScaler类实现数据尺度的调整。该操作将不同计量单位的数据映射至统一的数值范围,有助于提升分类或分组的准确性。MinMaxScaler的核心作用是将属性缩放到指定的区间,或对数据进行标准化处理,使数据均值聚集在0附近且方差为1。


from numpy import set_printoptions
from pandas import read_csv
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]
#X相当于所有数据
Y = array[:,8]
#Y为最后的class,即结果
transformer = MinMaxScaler(feature_range=(0,1)).fit(X)
#数据转化
newX = transformer.fit_transform(X)
#设定数据的打印格式
set_printoptions(precision=3)
#设置精度
print(newX)

[[0.353 0.744 0.59 ... 0.501 0.234 0.483] [0.059 0.427 0.541 ... 0.396 0.117 0.167] [0.471 0.92 0.525 ... 0.347 0.254 0.183] ... [0.294 0.608 0.59 ... 0.39 0.071 0.15 ] [0.059 0.633 0.492 ... 0.449 0.116 0.433] [0.059 0.467 0.574 ... 0.453 0.101 0.033]]

1.2正态化数据

正态化处理是应对符合高斯分布数据的有效手段,其输出结果以0为中位数,方差为1。在scikit-learn中,可通过StandardScaler类执行正态化处理操作。


transformer = StandardScaler().fit(X)
#数据转换
_newX = transformer.transform(X)
#设定数据打印格式
set_printoptions(precision=3)
#设置精度
#print(_newX)

[[ 0.64 0.848 0.15 ... 0.204 0.468 1.426] [-0.845 -1.123 -0.161 ... -0.684 -0.365 -0.191] [ 1.234 1.944 -0.264 ... -1.103 0.604 -0.106] ... [ 0.343 0.003 0.15 ... -0.735 -0.685 -0.276] [-0.845 0.16 -0.471 ... -0.24 -0.371 1.171] [-0.845 -0.873 0.046 ... -0.202 -0.474 -0.871]]

1.3标准化数据

标准化数据旨在将每一行数据的向量距离处理为1(在线性代数中称为矢量模长为1),此过程亦被称为“归一化”处理。该方法特别适用于处理稀疏数据(即包含大量0值的数据)。归一化处理能显著提升使用权重输入的神经网络以及基于距离度量的K近邻算法的预测准确度。

在scikit-learn中,可通过Normalizer类实现标准化处理。


transformer = Normalizer().fit(X)
#数据转换
__newX = transformer.transform(X)
#设置数据打印格式
set_printoptions(precision=3)
print(__newX)

[[0.034 0.828 0.403 ... 0.188 0.004 0.28 ] [0.008 0.716 0.556 ... 0.224 0.003 0.261] [0.04 0.924 0.323 ... 0.118 0.003 0.162] ... [0.027 0.651 0.388 ... 0.141 0.001 0.161] [0.007 0.838 0.399 ... 0.2 0.002 0.313] [0.008 0.736 0.554 ... 0.241 0.002 0.182]]

1.4二值数据

二值化处理通过设定阈值将连续数据转化为离散的二值形式:大于阈值的值被设置为1,小于或等于阈值的值被设置为0。

在scikit-learn中,可通过Binarizer类实现二值化处理。


transformer = Binarizer(threshold=0.0).fit(X)
#数据转换
newX_ = transformer.transform(X)
#设置数据打印格式
set_printoptions(precision=3)
print(newX_)

[[1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] ... [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.] [1. 1. 1. ... 1. 1. 1.]]

2.数据特征选定

在构建模型之前执行特征选定步骤,主要目的包括:降低数据过拟合风险、提高算法预测精度以及缩短模型训练时间。

2.1单变量特征选定

统计分析方法可用于评估并筛选出对预测结果影响最大的数据特征。在scikit-learn中,SelectKBest类提供了多种统计方法以选定关键数据特征,其中包含对卡方检验的实现。

卡方值的大小反映了实际观测值与理论推断值之间的吻合程度:卡方值越大,两者差异越显著;卡方值越小,两者越接近;若两者完全相等,则卡方值为0。


from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.decomposition import PCA
from sklearn.ensemble import ExtraTreesClassifier
 
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]
 
#通过卡方检验选定数据特征
#特征选定
test = SelectKBest(score_func=chi2,k=4)
fit = test.fit(X,Y)
set_printoptions(precision=3)
print(fit.scores_)
features = fit.transform(X)
print(features)

执行上述操作后,可获得卡方检验对每个数据特征的评分,并筛选出得分最高的四个特征。输出结果如下:[ 111.52 1411.887 17.605 53.108 2175.565 127.669 5.393 181.304] [[148. 0. 33.6 50. ] [ 85. 0. 26.6 31. ] [183. 0. 23.3 32. ] ... [121. 112. 26.2 30. ] [126. 0. 30.1 47. ] [ 93. 0. 30.4 23. ]]

2.2递归特征消除

递归特征消除(RFE)利用基础模型进行多轮迭代训练。每轮训练结束后,消除若干权值系数较小的特征,随后基于剩余的特征集进行下一轮训练。通过评估每个基础模型的精度,最终确定对预测结果影响最大的关键数据特征。


#递归特征消除
#特征选定
model = LogisticRegression(max_iter=3000)#需要手动设置最大迭代次数
rfe = RFE(model,3)
fit = rfe.fit(X,Y)
print("特征个数:")
print(fit.n_features_)
print("被选定的特征:")
print(fit.support_)
print("特征排名:")
print(fit.ranking_)

特征个数: 3 被选定的特征: [ True False False False False True True False] 特征排名: [1 2 4 6 5 1 1 3]

2.3数据降维

常见的降维方法包括PCA(主成分分析)和LDA(线性判别分析)。在聚类算法应用中,通常使用PCA对数据进行降维处理,从而简化数据分析流程并提升可视化效果。


#主要成分分析(数据降维)
#通过主要成分分析选定数据特征
pca = PCA(n_components=3)
fit = pca.fit(X)
print("解释方差:%s"% fit.explained_variance_ratio_)
print(fit.components_)

解释方差:[0.889 0.062 0.026] [[-2.022e-03 9.781e-02 1.609e-02 6.076e-02 9.931e-01 1.401e-02 5.372e-04 -3.565e-03] [-2.265e-02 -9.722e-01 -1.419e-01 5.786e-02 9.463e-02 -4.697e-02 -8.168e-04 -1.402e-01] [-2.246e-02 1.434e-01 -9.225e-01 -3.070e-01 2.098e-02 -1.324e-01 -6.400e-04 -1.255e-01]]

2.4特征重要性

可通过袋装决策树算法、随机森林算法以及极端随机树算法来计算数据特征的重要性评分。


#特征重要性
#特征选定
model = ExtraTreesClassifier()
fit = model.fit(X,Y)
print(fit.feature_importances_)

[0.109 0.234 0.101 0.077 0.076 0.14 0.121 0.142]

总结

本文主要阐述了机器学习中的数据准备工作,重点涵盖数据预处理与数据特征选定两大板块。这些步骤均为后续优化算法性能奠定了坚实基础。

到此这篇关于Python机器学习(三)数据准备的文章就介绍到这了,更多相关Python机器学习内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。