数据预处理:机器学习中的关键步骤
一、处理缺失值
在现实世界的数据集中,缺失值是常见的问题。处理缺失值的方法有很多种,常见的有删除包含缺失值的行或列,以及用特定的值填充缺失值。
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 MinMaxScalerscaler = MinMaxScaler()
data_scaled = scaler.fit_transform(data)
2. Z值标准化
Z值标准化(StandardScaler)将数据转换为均值为 0、方差为 1 的标准正态分布:
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
三、特征编码
特征编码是将分类变量转换为数值变量,以便机器学习模型能够处理。
1. 独热编码(OneHotEncoder)
独热编码将分类变量转换为二进制稀疏矩阵,每个类别对应一个特征:
from sklearn.preprocessing import OneHotEncoderencoder = OneHotEncoder()
data_encoded = encoder.fit_transform(data[['category']])
2. 序号编码(OrdinalEncoder)
序号编码将有序分类变量转换为整数编码,保留类别间的顺序关系:
from sklearn.preprocessing import OrdinalEncoderencoder = OrdinalEncoder()
data_encoded = encoder.fit_transform(data[['category']])
3. 目标标签编码(LabelEncoder)
目标标签编码将目标标签转换为 0 到 n_classes-1 的整数编码:
from sklearn.preprocessing import LabelEncoderencoder = LabelEncoder()
data_encoded = encoder.fit_transform(data['target'])
四、数据二值化
数据二值化是将数据分为两类(0 或 1),通常用于二分类问题。二值化可以根据数值是否大于某个阈值来完成:
from sklearn.preprocessing import Binarizerbinarizer = 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')
六、总结
数据预处理是机器学习中不可或缺的一步。通过处理缺失值、数据标准化、特征编码和数据二值化等操作,可以显著提高数据的质量,从而提升模型的性能。希望这篇文章能帮助你更好地理解和应用数据预处理技术。