Python代码之特征工程基础

1. 什么是特征工程

特征工程是指从原始数据中提取、转换和创建适合于模型训练的数据特征的过程。它是机器学习和深度学习中非常重要的一步,因为好的特征工程可以显著提高模型的性能。特征工程涉及从数据中提取有意义的信息,并将其转换为模型可以理解和使用的格式。常见的特征工程步骤包括数据清洗、特征选择、特征提取和特征变换。

2. 为什么特征工程很重要

特征工程的重要性在于它直接影响模型的性能。通过合适的特征工程,可以:

  • 提高模型的准确性:好的特征可以显著提高模型的预测能力,因为它们能够捕捉数据中有意义的模式和关系。
  • 缩短训练时间:通过减少数据的维度和复杂性,特征工程可以加快模型的训练速度。
  • 提高模型的可解释性:特征工程可以帮助识别和使用更直观和解释性强的特征,使得模型的输出更容易理解。
3. 特征工程的步骤

数据收集:收集与问题相关的数据。这可能涉及从多个来源获取数据,如数据库、文件或在线API。

import pandas as pd

data = pd.read_csv('data.csv')  # 从CSV文件中读取数据

数据清洗:处理缺失值、异常值和重复数据,确保数据的质量和一致性。 

# 处理缺失值
data = data.dropna()  # 删除包含缺失值的行
# 或
data = data.fillna(data.mean())  # 使用均值填充缺失值

特征选择:选择对模型性能有显著影响的特征,删除冗余或不相关的特征。

from sklearn.feature_selection import SelectKBest, f_classif

X = data.drop('target', axis=1)
y = data['target']
selector = SelectKBest(score_func=f_classif, k=10)  # 选择10个最佳特征
X_new = selector.fit_transform(X, y)

特征提取:从原始数据中提取新的特征。这可以包括从日期时间数据中提取年月日,或从文本数据中提取关键词等。

# 从日期时间数据中提取特征
data['year'] = pd.to_datetime(data['date']).dt.year
data['month'] = pd.to_datetime(data['date']).dt.month

特征变换:对特征进行转换,如标准化、归一化、编码等,以使其适合模型训练。

from sklearn.preprocessing import StandardScaler, OneHotEncoder

# 数值特征标准化
scaler = StandardScaler()
data[['feature1', 'feature2']] = scaler.fit_transform(data[['feature1', 'feature2']])

# 类别特征编码
encoder = OneHotEncoder()
encoded_features = encoder.fit_transform(data[['categorical_feature']]).toarray()
data = pd.concat([data, pd.DataFrame(encoded_features)], axis=1)
4. 特征工程案例

结合以上步骤,下面是一个完整的特征工程流程示例:

import pandas as pd
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.preprocessing import StandardScaler, OneHotEncoder

# Sample data to simulate the process
data = pd.DataFrame({
    'date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'],
    'feature1': [1.0, 2.0, 3.0, 4.0],
    'feature2': [10.0, 20.0, 30.0, 40.0],
    'categorical_feature': ['A', 'B', 'A', 'B'],
    'target': [0, 1, 0, 1]
})

# 数据清洗
data = data.dropna()

# 特征选择
X = data.drop('target', axis=1)
y = data['target']
selector = SelectKBest(score_func=f_classif, k='all')  # Selecting all features to demonstrate
X_new = selector.fit_transform(X.select_dtypes(include=[float, int]), y)

# 特征提取
data['year'] = pd.to_datetime(data['date']).dt.year
data['month'] = pd.to_datetime(data['date']).dt.month

# 特征变换
scaler = StandardScaler()
data[['feature1', 'feature2']] = scaler.fit_transform(data[['feature1', 'feature2']])

encoder = OneHotEncoder(sparse=False)
encoded_features = encoder.fit_transform(data[['categorical_feature']])
encoded_features_df = pd.DataFrame(encoded_features, columns=encoder.get_feature_names_out(['categorical_feature']))

data = pd.concat([data, encoded_features_df], axis=1)

# 准备最终的特征集和标签
X_final = data.drop(['target', 'date', 'categorical_feature'], axis=1)
y_final = data['target']

import ace_tools as tools; tools.display_dataframe_to_user(name="Final Data after Feature Engineering", dataframe=X_final)

X_final.head(), y_final.head()

运行结果

Result
(   feature1  feature2  year  month  categorical_feature_A  \
 0 -1.341641 -1.341641  2023      1                    1.0   
 1 -0.447214 -0.447214  2023      1                    0.0   
 2  0.447214  0.447214  2023      1                    1.0   
 3  1.341641  1.341641  2023      1                    0.0   
 
    categorical_feature_B  
 0                    0.0  
 1                    1.0  
 2                    0.0  
 3                    1.0  ,
 0    0
 1    1
 2    0
 3    1
 Name: target, dtype: int64)

Final Data after Feature Engineering

最终的特征集和标签如下:

数据经过特征工程处理后,特征包括标准化后的数值特征、提取的年份和月份、以及独热编码后的类别特征。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值