news 2026/8/22 11:16:00

HoRain云--Sklearn 数据预处理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--Sklearn 数据预处理

数据预处理是机器学习项目中的一个关键步骤,它直接影响模型的训练效果和最终性能。

在进行机器学习建模时,数据预处理是至关重要的一步,它帮助我们清洗和转换原始数据,以便为机器学习模型提供最佳的输入。

数据预处理涉及多个步骤,包括处理缺失值、数据转换、标准化、编码等。

合适的预处理不仅能提高模型的准确性,还能帮助模型更好地泛化。


1、处理缺失值

缺失值是指在数据集中某些特征的值缺失。

机器学习算法通常无法直接处理缺失值,因此我们需要对缺失值进行处理。

检查缺失值

首先,检查数据集中是否有缺失值。

通常可以使用 pandas 来查看数据集中的缺失值:

实例

import pandas as pd

# 假设我们有一个 DataFrame df
print(df.isnull().sum()) # 查看每一列缺失值的数量

填充缺失值

对于缺失值的处理,最常用的方法是填充。

常见的填充策略包括:

  • 填充均值(Mean):适用于数值型数据。
  • 填充中位数(Median):对于含有离群值的数据集,使用中位数可能更有效。
  • 填充最频繁值(Mode):适用于类别型数据。

在 scikit-learn 中,SimpleImputer 可以轻松实现缺失值填充:

实例

from sklearn.impute import SimpleImputer

# 对于数值型数据,使用均值填充
imputer = SimpleImputer(strategy='mean') # 可选:'mean', 'median', 'most_frequent'
df_imputed = imputer.fit_transform(df) # 填充缺失值

删除缺失值

如果缺失值的数量较少,并且删除这些数据不会显著影响分析结果,另一种选择是直接删除缺失值。

df_cleaned = df.dropna() # 删除包含缺失值的行

更多内容可以参考:Pandas 数据清洗


2、数据缩放

机器学习算法对数据的尺度敏感,因此需要对数据进行缩放,使得特征具有相同的尺度。

常见的缩放方法有:

  • 标准化(Standardization):将数据转换为均值为0、标准差为1的分布。适用于大多数机器学习算法。
  • 归一化(Normalization):将数据缩放到指定范围(通常是 [0, 1])。

标准化

标准化可以通过 StandardScaler 实现,它会将每个特征转换为零均值和单位方差:

实例

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X) # 标准化 X

归一化

归一化将每个特征缩放到一个指定的范围(通常是 [0, 1])。

MinMaxScaler 用于将数据进行归一化:

实例

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X) # 归一化 X

为什么需要标准化和归一化?

  • 标准化:对于距离度量(如 K 最近邻、支持向量机等)非常重要,因为特征的尺度不一致可能导致某些特征对模型的影响过大。标准化能确保每个特征对模型有相同的贡献。

  • 归一化:有些算法(如神经网络、梯度下降优化算法等)对输入数据的范围非常敏感,归一化有助于加速收敛。


3、类别变量编码

机器学习模型通常无法直接处理字符串类型的类别变量,因此需要将类别变量转化为数值型数据。

常见的编码方法有:

标签编码

标签编码将每个类别映射到一个唯一的整数。

适用于类别之间有顺序关系的情况(例如,低、中、高)。

实例

from sklearn.preprocessing import LabelEncoder

# 假设我们有一个类别变量 y
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y) # 将类别变量转换为整数

独热编码

独热编码将每个类别转换为一个二进制的向量,适用于类别之间没有顺序关系的情况(例如,颜色、国家等)。

OneHotEncoder 可以将类别变量转化为独热编码。

实例

from sklearn.preprocessing import OneHotEncoder

# 假设我们有一个类别变量 X
encoder = OneHotEncoder(sparse=False) # sparse=False 返回一个密集矩阵
X_encoded = encoder.fit_transform(X) # 将类别变量转换为独热编码

在 pandas 中,也可以使用 get_dummies() 函数进行独热编码:

X_encoded = pd.get_dummies(X)

4、特征选择

特征选择是通过选择最重要的特征来提高模型的性能,并减少计算成本。

常见的特征选择方法包括:

基于模型的特征选择

使用一些机器学习模型(如决策树或随机森林)来评估特征的重要性,从而进行特征选择。

实例

from sklearn.ensemble import RandomForestClassifier

# 训练一个随机森林模型
clf = RandomForestClassifier()
clf.fit(X_train, y_train)

# 获取特征重要性
importances = clf.feature_importances_
print(importances)

递归特征消除(Recursive Feature Elimination,RFE)

RFE 是一种通过递归的方式,逐步删除最不重要的特征,从而选择最优特征的方法。

RFE 可以帮助我们自动选择重要特征。

实例

from sklearn.feature_selection import RFE

# 使用线性模型进行递归特征消除
rfe = RFE(clf, n_features_to_select=3) # 保留 3 个最重要的特征
X_rfe = rfe.fit_transform(X_train, y_train)


5、特征工程

特征工程是通过对现有特征进行处理、组合或构造新的特征,以提高模型的表现。

特征工程的常见方式包括:

  • 特征组合:将两个或更多的特征组合成一个新特征。
  • 特征转换:对特征进行对数变换、平方根变换等,以解决数据的非线性问题。
  • 特征创建:根据现有数据创建新的特征,例如从时间戳中提取出日期、月份、星期等。

实例

# 例如,将两个数值型特征组合成一个新特征
df['new_feature'] = df['feature1'] * df['feature2']


6、特征提取

特征提取旨在从原始特征中提取出新的、更具表达力的特征。

常见的特征提取方法包括: 主成分分析(PCA) 和 线性判别分析(LDA)。

主成分分析(PCA)

PCA 是一种常用的降维技术,它通过线性变换将数据从高维空间映射到低维空间,使得新特征(主成分)尽可能保留数据的方差。

PCA 特别适用于特征数量过多的情况,可以有效降低计算复杂度。

实例

from sklearn.decomposition import PCA

# 假设 X 是特征矩阵
pca = PCA(n_components=2) # 降维到 2 个主成分
X_pca = pca.fit_transform(X)

PCA 主要用于两种场景:

  • 降维:当特征过多时,使用 PCA 降维可以减少计算成本,同时保留数据的主要信息。
  • 可视化:将高维数据映射到 2D 或 3D 空间,帮助我们可视化数据结构。

线性判别分析(LDA)

LDA 是一种监督学习的降维方法,它旨在找到一个线性组合,使得不同类别之间的距离最大化,类别内的距离最小化。

LDA 通常用于分类任务中。

实例

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# 假设 X 是特征矩阵,y 是目标变量
lda = LinearDiscriminantAnalysis(n_components=2) # 降维到 2 个线性判别组件
X_lda = lda.fit_transform(X, y)


7、处理不平衡数据

在分类问题中,如果数据集的各类别样本数量差异较大,可能会导致模型偏向预测多数类,从而影响模型的性能。

常见的处理方法包括:

上采样(Over-sampling)

通过增加少数类样本的数量,使得数据集更加平衡。

常见的方法是使用 SMOTE(Synthetic Minority Over-sampling Technique) 算法。

实例

from imblearn.over_sampling import SMOTE

smote = SMOTE()
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

下采样(Under-sampling)

通过减少多数类样本的数量,使得数据集更加平衡。

实例

from imblearn.under_sampling import RandomUnderSampler

undersampler = RandomUnderSampler()
X_resampled, y_resampled = undersampler.fit_resample(X_train, y_train)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 11:15:16

HoRain云--DeeSeek Harness 防御性编程:结果报告、清理与凭据

这一篇讲五个最重要的防御性编程模式:结果报告、dispose 停稳、凭据擦除、链接删除、回调隔离。一句话:这些模式防止「一个简单的边界情况把整个 Agent 搞挂」。先看对照图下面的图把坏示例与好示例并排对比,每条都来自真实的缺陷类别。官方把…

作者头像 李华
网站建设 2026/8/22 11:14:04

Path of Building 上手五步:把流放之路的配装从猜变成算

Path of Building 上手五步:把流放之路的配装从猜变成算 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 配一个新角色的时候,你大概率卡在这种时刻…

作者头像 李华
网站建设 2026/8/22 11:11:34

为什么程序要“同时干很多事”?从 CPU 到线程模型讲透并发编程

刚开始学并发编程时,很多人都会觉得它有点“反直觉”。 一个程序明明可以: 先执行 A 再执行 B 最后执行 C 为什么非要搞出: 多线程线程池锁CASvolatile并发容器 这些复杂东西? 其实并发编程出现的原因很简单:程序里的很…

作者头像 李华
网站建设 2026/8/22 11:10:39

全双工语音Agent评测:从首音延迟到事件级验收的实践指南

1. 项目概述:为什么评测全双工语音 Agent 是个技术活?最近和几个做语音交互的朋友聊天,大家不约而同地提到了一个痛点:自家的全双工语音 Agent 上线后,用户反馈总是“感觉有点慢”、“有时候会抢话”、“反应不太聪明”…

作者头像 李华
网站建设 2026/8/22 11:09:46

腾讯云服务器DD安装Debian 11/Ubuntu 20.04:原理、实战与避坑指南

1. 为什么我们需要在腾讯云上DD系统?如果你在腾讯云上用过CVM或者轻量应用服务器,大概率遇到过这样的场景:官方提供的系统镜像里,Debian版本停留在10(Buster),或者Ubuntu版本是18.04&#xff0c…

作者头像 李华