使用Python实现数据预处理与特征工程

03-07 6阅读

在机器学习和数据分析领域,数据预处理与特征工程是至关重要的步骤。它们直接关系到模型的性能和准确性。本文将详细介绍如何使用Python进行数据预处理,并通过代码展示具体的实现方法。

1. 数据预处理的重要性

在现实世界中,原始数据往往存在许多问题,如缺失值、异常值、数据格式不一致等。这些问题如果不加以处理,会严重影响模型的效果。因此,在开始构建模型之前,必须对数据进行清洗和转换,使其更适合用于训练模型。

常见的数据预处理任务包括:

处理缺失值处理异常值编码分类变量标准化/归一化数值型特征特征选择

2. 环境准备

为了方便演示,我们使用pandas库来处理数据,numpy库来进行数值计算,scikit-learn库来进行特征工程相关的操作。你可以通过以下命令安装这些库:

pip install pandas numpy scikit-learn

接下来,我们将导入所需的库:

import pandas as pdimport numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScaler, OneHotEncoderfrom sklearn.impute import SimpleImputerfrom sklearn.compose import ColumnTransformerfrom sklearn.pipeline import Pipeline

3. 加载数据

假设我们有一个CSV文件data.csv,其中包含了一些关于房屋销售的数据。我们可以使用pandas来加载这个文件:

# 加载数据df = pd.read_csv('data.csv')# 查看前几行数据print(df.head())

输出可能是这样的:

   Id  SalePrice  LotArea  YearBuilt  OverallQual  OverallCond0   1      208500     8450        2003            7            51   2      181500     9600        1976            6            82   3      223500     11250       2001            7            53   4      140000     9550        1915            5            54   5      250000     14260       2000            8            5

4. 处理缺失值

在实际数据集中,经常会出现某些列存在缺失值的情况。我们可以使用SimpleImputer来填充这些缺失值。对于数值型特征,通常可以选择用均值或中位数填充;对于分类变量,则可以使用众数填充。

4.1 检查缺失值

首先,我们需要检查哪些列存在缺失值:

# 检查缺失值missing_values = df.isnull().sum()print(missing_values[missing_values > 0])

假设输出如下:

LotFrontage    259MasVnrType      8MasVnrArea      8...

4.2 填充缺失值

接下来,我们定义一个Pipeline来处理缺失值。我们将分别处理数值型和分类型特征:

# 定义数值型和分类型特征numeric_features = ['LotArea', 'YearBuilt', 'OverallQual', 'OverallCond']categorical_features = ['MasVnrType']# 创建Pipelinenumeric_transformer = Pipeline(steps=[    ('imputer', SimpleImputer(strategy='median')),  # 用中位数填充    ('scaler', StandardScaler())  # 标准化])categorical_transformer = Pipeline(steps=[    ('imputer', SimpleImputer(strategy='most_frequent')),  # 用众数填充    ('onehot', OneHotEncoder(handle_unknown='ignore'))  # one-hot编码])preprocessor = ColumnTransformer(    transformers=[        ('num', numeric_transformer, numeric_features),        ('cat', categorical_transformer, categorical_features)    ])# 应用预处理器X = df.drop('SalePrice', axis=1)  # 特征y = df['SalePrice']  # 目标变量X_preprocessed = preprocessor.fit_transform(X)# 打印预处理后的数据形状print(f"Preprocessed data shape: {X_preprocessed.shape}")

5. 处理异常值

异常值是指那些与其他观测值显著不同的数据点。它们可能会对模型产生负面影响,因此需要谨慎处理。常见的处理方法包括删除异常值、替换为合理值或者使用鲁棒性更强的算法。

5.1 检测异常值

一种简单的方法是通过箱线图(Boxplot)来检测异常值:

import matplotlib.pyplot as plt# 绘制箱线图plt.figure(figsize=(10, 6))df.boxplot(column=['LotArea'])plt.show()

从图中可以看到,LotArea列存在一些明显的异常值。

5.2 删除异常值

为了简化处理,我们可以直接删除这些异常值:

# 删除异常值Q1 = df['LotArea'].quantile(0.25)Q3 = df['LotArea'].quantile(0.75)IQR = Q3 - Q1df_cleaned = df[~((df['LotArea'] < (Q1 - 1.5 * IQR)) | (df['LotArea'] > (Q3 + 1.5 * IQR)))]# 再次绘制箱线图plt.figure(figsize=(10, 6))df_cleaned.boxplot(column=['LotArea'])plt.show()

6. 特征工程

除了基本的数据预处理外,特征工程还包括创建新的特征、组合现有特征等。例如,我们可以根据年份信息创建一个新的特征——房屋年龄:

# 创建新特征:房屋年龄df_cleaned['HouseAge'] = df_cleaned['YearBuilt'].apply(lambda x: 2023 - x)# 查看新特征print(df_cleaned[['YearBuilt', 'HouseAge']].head())

输出结果:

   YearBuilt  HouseAge0       2003        201       1976        472       2001        223       1915       1084       2000        23

7. 总结

本文介绍了如何使用Python进行数据预处理与特征工程。通过结合pandasnumpyscikit-learn等库,我们可以轻松地处理缺失值、异常值,编码分类变量,并创建新的特征。这些步骤为后续的模型训练打下了坚实的基础。

当然,实际项目中可能还需要根据具体情况进行更复杂的处理。希望这篇文章能为你提供一些有用的参考。

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第16930名访客 今日有24篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!