数据预处理:机器学习中的关键步骤

一、处理缺失值

在现实世界的数据集中,缺失值是常见的问题。处理缺失值的方法有很多种,常见的有删除包含缺失值的行或列,以及用特定的值填充缺失值。

1. 删除缺失值

Pandas 提供了 dropna() 方法,可以方便地删除包含缺失值的行或列。例如:

import pandas as pd

# 加载数据
data = pd.read_csv('property-data.csv')

# 删除包含缺失值的行
cleaned_data = data.dropna()

dropna() 方法的参数非常灵活,例如 axis=0 表示删除行,axis=1 表示删除列;how='any' 表示只要有一个缺失值就删除,how='all' 表示只有当所有值都缺失时才删除。

2. 填充缺失值

如果数据集中的缺失值较多,直接删除可能会导致数据量大幅减少。此时,可以用特定的值填充缺失值。常见的填充方法包括使用均值、中位数、众数或常数等。

# 使用均值填充缺失值
data.fillna(data.mean(), inplace=True)

# 使用中位数填充缺失值
data.fillna(data.median(), inplace=True)

# 使用常数填充缺失值
data.fillna(0, inplace=True)

此外,还可以使用 SimpleImputer 类来处理缺失值。例如:

from sklearn.impute import SimpleImputer

# 使用均值填充
imputer = SimpleImputer(strategy='mean')
data_imputed = imputer.fit_transform(data)

二、数据标准化

数据标准化是将数据按比例缩放,使之落入一个特定的小区间,如 [0,1] 或 [-1,1]。标准化的目的是消除不同特征之间的量纲影响,使数据具有可比性。

1. 最大最小值标准化

最大最小值标准化(MinMaxScaler)将数据缩放到 [0,1] 区间:

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)

2. Z值标准化

Z值标准化(StandardScaler)将数据转换为均值为 0、方差为 1 的标准正态分布:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)

三、特征编码

特征编码是将分类变量转换为数值变量,以便机器学习模型能够处理。

1. 独热编码(OneHotEncoder)

独热编码将分类变量转换为二进制稀疏矩阵,每个类别对应一个特征:

from sklearn.preprocessing import OneHotEncoder

encoder = OneHotEncoder()
data_encoded = encoder.fit_transform(data[['category']])

2. 序号编码(OrdinalEncoder)

序号编码将有序分类变量转换为整数编码,保留类别间的顺序关系:

from sklearn.preprocessing import OrdinalEncoder

encoder = OrdinalEncoder()
data_encoded = encoder.fit_transform(data[['category']])

3. 目标标签编码(LabelEncoder)

目标标签编码将目标标签转换为 0 到 n_classes-1 的整数编码:

from sklearn.preprocessing import LabelEncoder

encoder = LabelEncoder()
data_encoded = encoder.fit_transform(data['target'])

四、数据二值化

数据二值化是将数据分为两类(0 或 1),通常用于二分类问题。二值化可以根据数值是否大于某个阈值来完成:

from sklearn.preprocessing import Binarizer

binarizer = Binarizer(threshold=0.5)
data_binarized = binarizer.fit_transform(data)

五、其他

为了加深对数据预处理的理解,以下是一些常见的数据预处理函数及其功能,并附上具体的代码示例。

1. preprocessing.scale()

功能:标准化,将数据转换为均值为 0、方差为 1 的标准正态分布。

代码示例

from sklearn.preprocessing import scale
import numpy as np

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 标准化
data_scaled = scale(data)

print(data_scaled)

2. preprocessing.MinMaxScaler()

功能:最大最小值标准化,将数据缩放到 [0,1] 区间。

代码示例

from sklearn.preprocessing import MinMaxScaler

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建标准化器
scaler = MinMaxScaler()

# 拟合并转换数据
data_scaled = scaler.fit_transform(data)

print(data_scaled)

3. preprocessing.StandardScaler()

功能:Z值标准化,将数据转换为均值为 0、方差为 1 的标准正态分布。

代码示例

from sklearn.preprocessing import StandardScaler

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建标准化器
scaler = StandardScaler()

# 拟合并转换数据
data_scaled = scaler.fit_transform(data)

print(data_scaled)

4. preprocessing.MaxAbsScaler()

功能:绝对值最大标准化,将数据缩放至 [-1,1] 范围。

代码示例

from sklearn.preprocessing import MaxAbsScaler

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建标准化器
scaler = MaxAbsScaler()

# 拟合并转换数据
data_scaled = scaler.fit_transform(data)

print(data_scaled)

5. preprocessing.RobustScaler()

功能:抗离群值标准化,基于中位数和四分位距(IQR)转换数据。

代码示例

from sklearn.preprocessing import RobustScaler

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建标准化器
scaler = RobustScaler()

# 拟合并转换数据
data_scaled = scaler.fit_transform(data)

print(data_scaled)

6. preprocessing.QuantileTransformer()

功能:分位数变换,将数据映射到均匀分布或正态分布。

代码示例

from sklearn.preprocessing import QuantileTransformer

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建变换器
transformer = QuantileTransformer(n_quantiles=10, random_state=0)

# 拟合并转换数据
data_transformed = transformer.fit_transform(data)

print(data_transformed)

7. preprocessing.PowerTransformer()

功能:幂变换,将非正态分布数据映射到正态分布。

代码示例

from sklearn.preprocessing import PowerTransformer

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建变换器
transformer = PowerTransformer(method='yeo-johnson')

# 拟合并转换数据
data_transformed = transformer.fit_transform(data)

print(data_transformed)

8. preprocessing.Normalizer()

功能:正则化,将样本特征缩放至单位范数。

代码示例

from sklearn.preprocessing import Normalizer

# 示例数据
data = np.array([[1, 2], [3, 4], [5, 6]])

# 创建正则化器
normalizer = Normalizer()

# 拟合并转换数据
data_normalized = normalizer.fit_transform(data)

print(data_normalized)

9. preprocessing.OrdinalEncoder()

功能:序号编码,将有序分类特征转换为整数编码。

代码示例

from sklearn.preprocessing import OrdinalEncoder

# 示例数据
data = np.array([['low'], ['medium'], ['high']])

# 创建编码器
encoder = OrdinalEncoder()

# 拟合并转换数据
data_encoded = encoder.fit_transform(data)

print(data_encoded)

10. preprocessing.LabelEncoder()

功能:标签编码,将目标标签转换为 0 到 n_classes-1 的整数编码。

代码示例

from sklearn.preprocessing import LabelEncoder

# 示例数据
labels = ['cat', 'dog', 'bird', 'cat', 'dog']

# 创建编码器
encoder = LabelEncoder()

# 拟合并转换数据
labels_encoded = encoder.fit_transform(labels)

print(labels_encoded)

11. preprocessing.MultiLabelBinarizer()

功能:多标签二值化,将多标签数据转换为二进制矩阵。

代码示例

from sklearn.preprocessing import MultiLabelBinarizer

# 示例数据
data = [['cat', 'dog'], ['dog', 'bird'], ['cat', 'bird']]

# 创建二值化器
binarizer = MultiLabelBinarizer()

# 拟合并转换数据
data_binarized = binarizer.fit_transform(data)

print(data_binarized)

12. preprocessing.OneHotEncoder()

功能:独热编码,将无序分类特征转换为二进制稀疏矩阵。

代码示例

from sklearn.preprocessing import OneHotEncoder

# 示例数据
data = np.array([['cat'], ['dog'], ['bird']])

# 创建编码器
encoder = OneHotEncoder()

# 拟合并转换数据
data_encoded = encoder.fit_transform(data)

print(data_encoded.toarray())

13. preprocessing.KBinsDiscretizer()

功能:k箱离散化,将连续数据离散化为 k 个区间。

代码示例

from sklearn.preprocessing import KBinsDiscretizer

# 示例数据
data = np.array([[1], [3], [5], [7], [9]])

# 创建离散化器
discretizer = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')

# 拟合并转换数据
data_discretized = discretizer.fit_transform(data)

print(data_discretized)

14. preprocessing.FunctionTransformer()

功能:自定义函数变换,将用户自定义函数应用于数据。

代码示例

from sklearn.preprocessing import FunctionTransformer

# 自定义函数
def log_transform(x):
    return np.log(x + 1)

# 创建变换器
transformer = FunctionTransformer(log_transform)

# 示例数据
data = np.array([[1], [3], [5], [7], [9]])

# 拟合并转换数据
data_transformed = transformer.fit_transform(data)

print(data_transformed)

15. preprocessing.Binarizer()

功能:二值化,将数据缩放到指定范围(默认 [0,1])。

代码示例

from sklearn.preprocessing import Binarizer

# 示例数据
data = np.array([[1], [3], [5], [7], [9]])

# 创建二值化器
binarizer = Binarizer(threshold=5)

# 拟合并转换数据
data_binarized = binarizer.fit_transform(data)

print(data_binarized)

16. preprocessing.PolynomialFeatures()

功能:多项式特征生成,生成特征的高次项和交互项。

代码示例

from sklearn.preprocessing import PolynomialFeatures

# 示例数据
data = np.array([[1, 2], [3, 4]])

# 创建多项式特征生成器
poly = PolynomialFeatures(degree=2)

# 拟合并转换数据
data_poly = poly.fit_transform(data)

print(data_poly)

17. preprocessing.Imputer()

功能:缺失值填充,通过均值、中位数、常数、众数等策略填补数据中的缺失值。

代码示例

from sklearn.impute import SimpleImputer

# 示例数据
data = np.array([[1, 2], [np.nan, 4], [5, 6]])

# 创建填充器
imputer = SimpleImputer(strategy='mean')

六、总结

数据预处理是机器学习中不可或缺的一步。通过处理缺失值、数据标准化、特征编码和数据二值化等操作,可以显著提高数据的质量,从而提升模型的性能。希望这篇文章能帮助你更好地理解和应用数据预处理技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值