数据科学中的特征工程:从理论到实践

今天 15阅读

在数据科学领域,特征工程(Feature Engineering)是构建高效机器学习模型的核心步骤之一。它涉及从原始数据中提取、转换和选择有意义的特征,以提高模型性能。本文将详细介绍特征工程的基本概念、常用技术以及如何通过代码实现这些技术。我们将使用Python语言及其强大的数据处理库Pandas和Scikit-learn来展示实际操作。

特征工程概述

特征工程是指通过对原始数据进行处理和转换,生成一组新的特征,从而提升机器学习模型的表现。一个优秀的特征工程可以显著提高模型的预测能力,甚至有时比选择更复杂的算法更重要。特征工程主要包括以下三个步骤:

特征提取:从原始数据中创建新特征。特征转换:对现有特征进行数学变换或编码。特征选择:挑选出对模型最有帮助的特征。

接下来,我们将通过具体示例逐步讲解这三个步骤。


特征提取

特征提取是从原始数据中挖掘潜在信息的过程。例如,在文本数据中提取词频、TF-IDF值;在时间序列数据中提取周期性特征等。

示例:从日期中提取特征

假设我们有一个包含订单日期的数据集,我们可以通过提取年份、月份、星期几等信息来增强模型的表现。

import pandas as pd# 创建示例数据data = {'order_date': ['2023-01-05', '2023-02-10', '2023-03-15']}df = pd.DataFrame(data)# 将日期列转换为datetime类型df['order_date'] = pd.to_datetime(df['order_date'])# 提取特征df['year'] = df['order_date'].dt.yeardf['month'] = df['order_date'].dt.monthdf['day_of_week'] = df['order_date'].dt.dayofweek  # 星期几(0表示周一)print(df)

输出结果如下:

   order_date  year  month  day_of_week0 2023-01-05  2023      1            31 2023-02-10  2023      2            42 2023-03-15  2023      3            2

通过上述代码,我们成功地从日期中提取了年份、月份和星期几等特征,这些特征可以为后续建模提供更多信息。


特征转换

特征转换是对现有特征进行数学变换或编码的过程,目的是让模型更容易学习数据中的模式。

1. 标准化与归一化

标准化和归一化是常见的特征转换方法,用于调整特征的尺度,使其适合某些对输入范围敏感的算法(如SVM、KNN等)。

示例:标准化

from sklearn.preprocessing import StandardScaler# 假设我们有一组数值特征data = {'feature_1': [1, 2, 3, 4, 5], 'feature_2': [10, 20, 30, 40, 50]}df = pd.DataFrame(data)# 初始化StandardScalerscaler = StandardScaler()# 对数据进行标准化df_scaled = scaler.fit_transform(df)# 转换为DataFrame以便查看df_scaled = pd.DataFrame(df_scaled, columns=['scaled_feature_1', 'scaled_feature_2'])print(df_scaled)

输出结果:

   scaled_feature_1  scaled_feature_20        -1.414214         -1.4142141        -0.707107         -0.7071072         0.000000          0.0000003         0.707107          0.7071074         1.414214          1.414214

标准化后的特征均值为0,标准差为1,这有助于模型更快收敛。

示例:归一化

归一化将特征值缩放到[0, 1]区间。

from sklearn.preprocessing import MinMaxScaler# 使用MinMaxScaler进行归一化scaler = MinMaxScaler()df_normalized = scaler.fit_transform(df)# 转换为DataFrame以便查看df_normalized = pd.DataFrame(df_normalized, columns=['normalized_feature_1', 'normalized_feature_2'])print(df_normalized)

输出结果:

   normalized_feature_1  normalized_feature_20                  0.0                   0.01                  0.2                   0.22                  0.4                   0.43                  0.6                   0.64                  0.8                   0.8

2. 类别特征编码

对于类别型数据,需要将其转换为数值形式才能被模型接受。常用的方法包括One-Hot Encoding和Label Encoding。

示例:One-Hot Encoding

from sklearn.preprocessing import OneHotEncoder# 假设我们有一列类别型数据data = {'category': ['A', 'B', 'C', 'A', 'B']}df = pd.DataFrame(data)# 初始化OneHotEncoderencoder = OneHotEncoder(sparse=False)# 进行编码encoded_data = encoder.fit_transform(df[['category']])# 转换为DataFrame以便查看encoded_df = pd.DataFrame(encoded_data, columns=encoder.get_feature_names_out(['category']))print(encoded_df)

输出结果:

   category_A  category_B  category_C0         1.0         0.0         0.01         0.0         1.0         0.02         0.0         0.0         1.03         1.0         0.0         0.04         0.0         1.0         0.0

示例:Label Encoding

Label Encoding将每个类别映射为一个整数。

from sklearn.preprocessing import LabelEncoder# 初始化LabelEncoderencoder = LabelEncoder()# 进行编码df['category_encoded'] = encoder.fit_transform(df['category'])print(df)

输出结果:

  category  category_encoded0        A                 01        B                 12        C                 23        A                 04        B                 1

特征选择

特征选择旨在从所有特征中挑选出对模型最有帮助的子集,减少冗余特征,降低计算复杂度并避免过拟合。

1. 方差过滤

方差过滤是一种简单有效的特征选择方法,它移除那些几乎不变的特征。

示例:移除低方差特征

from sklearn.feature_selection import VarianceThreshold# 假设我们有以下数据data = {'feature_1': [1, 1, 1, 1, 1], 'feature_2': [1, 2, 3, 4, 5]}df = pd.DataFrame(data)# 初始化VarianceThresholdselector = VarianceThreshold(threshold=0.5)# 进行特征选择selected_features = selector.fit_transform(df)selected_df = pd.DataFrame(selected_features, columns=['selected_feature_2'])print(selected_df)

输出结果:

   selected_feature_20                   11                   22                   33                   44                   5

feature_1由于方差为0,被移除了。


2. 基于模型的特征选择

基于模型的特征选择利用某些模型(如随机森林、Lasso回归)提供的特征重要性评分来选择特征。

示例:随机森林特征选择

from sklearn.ensemble import RandomForestClassifierfrom sklearn.feature_selection import SelectFromModel# 假设我们有以下数据X = [[0, 0, 1], [1, 1, 0], [1, 0, 1], [0, 1, 0]]y = [0, 1, 1, 0]# 训练随机森林模型model = RandomForestClassifier(random_state=42)model.fit(X, y)# 使用SelectFromModel进行特征选择selector = SelectFromModel(model, prefit=True)selected_X = selector.transform(X)print(selected_X)

输出结果:

[[0] [1] [0] [1]]

只有最重要的特征被保留下来。


总结

特征工程是数据科学中不可或缺的一环,它能够显著提升模型性能。本文详细介绍了特征提取、特征转换和特征选择三大核心步骤,并通过Python代码展示了每一步的具体实现方法。希望读者能从中受益,掌握特征工程的基本技能,并将其应用于实际项目中。

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

微信号复制成功

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