数据准备指南:10种基础特征工程方法的实战教程
数据派THU
共 14375字,需浏览 29分钟
·
2024-10-26 17:00
来源:Deephub Imba
本文约5000字,建议阅读9分钟 本文深入探讨Transformer模型中三种关键的注意力机制:自注意力、交叉注意力和因果自注意力。
import pandas as pd # 用于数据处理和操作
import numpy as np # 用于数值计算
import matplotlib.pyplot as plt # 用于数据可视化
import gensim.downloader as api # 用于下载gensim提供的语料库
from gensim.models import Word2Vec # 用于词嵌入
from sklearn.pipeline import Pipeline # 用于构建数据处理管道
from sklearn.decomposition import PCA # 用于主成分分析
from sklearn.datasets import load_iris # 用于加载iris数据集
from sklearn.impute import SimpleImputer # 用于数据插补
from sklearn.compose import ColumnTransformer # 用于对数据集应用转换
from sklearn.feature_extraction.text import TfidfVectorizer # 用于TF-IDF实现
from sklearn.preprocessing import MinMaxScaler, StandardScaler # 用于数据缩放
1、数据插补
-
删除包含缺失值的行或列 -
对缺失值进行插补
-
使用常数值填充(如0、1、2等) -
使用统计量填充(如均值或中位数) -
使用相邻数据值填充(如前值或后值) -
构建预测模型估计缺失值
data = pd.DataFrame({
'doors': [2, np.nan, 2, np.nan, 4],
'topspeed': [100, np.nan, 150, 200, np.nan],
'model': ['Daihatsu', 'Toyota', 'Suzuki', 'BYD','Wuling']
})
doors_imputer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value=4))
])
topspeed_imputer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median'))
])
pipeline = ColumnTransformer(
transformers=[
('doors_imputer', doors_imputer, ['doors']),
('topspeed_imputer', topspeed_imputer, ['topspeed'])
],
remainder='passthrough'
)
transformed = pipeline.fit_transform(data)
transformed_df = pd.DataFrame(transformed, columns=['doors', 'topspeed', 'model'])
2、数据分箱
-
简化数据,将连续值转换为离散类别 -
处理非线性关系 -
减少数据中的噪声和异常值
np.random.seed(42)
data = pd.DataFrame({'age' : np.random.randint(0, 100, 100)})
data['category'] = pd.cut(data['age'], [0, 2, 11, 18, 65, 101], labels=['infants', 'children', 'teenagers', 'adults', 'elders'])
print(data)
print(data['category'].value_counts())
data['category'].value_counts().plot(kind='bar')
3、对数变换
rskew_data = np.random.exponential(scale=2, size=100)
log_data = np.log(rskew_data)
plt.title('Right Skewed Data')
plt.hist(rskew_data, bins=10)
plt.show()
plt.title('Log Transformed Data')
plt.hist(log_data, bins=20)
plt.show()
4、数据缩放
-
最小-最大缩放:将数据调整到[0, 1]区间 -
标准化:将数据调整为均值为0,标准差为1的分布
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
scaler = MinMaxScaler()
minmax = scaler.fit_transform(data)
scaler = StandardScaler()
standard = scaler.fit_transform(data)
df = pd.DataFrame({'original':data.flatten(),'Min-Max Scaling':minmax.flatten(),'Standard Scaling':standard.flatten()})
df
5、One-Hot编码
-
对于分类特征中的每个唯一值,创建一个新的二进制列。 -
在新创建的列中,如果原始数据中出现了相应的分类值,则标记为1,否则为0。
data = pd.DataFrame({'models':['toyota','ferrari','byd','lamborghini','honda','tesla'],
'speed':['slow','fast','medium','fast','slow','medium']})
data = pd.concat([data, pd.get_dummies(data['speed'], prefix='speed')],axis=1)
data
6、目标编码
-
对于分类特征中的每个类别,计算对应的目标变量统计量(如均值)。 -
用计算得到的统计量替换原始的类别值。
fruits = ['banana','apple','durian','durian','apple','banana']
price = [120,100,110,150,140,160]
data = pd.DataFrame({
'fruit': fruits,
'price': price
})
data['encoded_fruits'] = data.groupby('fruit')['price'].transform('mean')
data
-
可能导致数据泄露,特别是在不做适当的交叉验证的情况下。 -
对异常值敏感,可能需要进行额外的异常值处理。 -
在测试集中遇到训练集中未出现的类别时,需要有合适的处理策略。
7、主成分分析(PCA)
-
数据标准化 -
计算协方差矩阵 -
计算协方差矩阵的特征值和特征向量 -
选择主成分 -
投影数据到新的特征空间
iris_data = load_iris()
features = iris_data.data
targets = iris_data.target
features.shape
# 输出: (150, 4)
pca = PCA(n_components=2)
pca_features = pca.fit_transform(features)
pca_features.shape
# 输出: (150, 2)
for point in set(targets):
plt.scatter(pca_features[targets == point, 0], pca_features[targets == point,1], label=iris_data.target_names[point])
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.title('PCA on Iris Dataset')
plt.legend()
plt.show()
-
减少数据的维度,降低计算复杂度。 -
去除噪声和冗余信息。 -
有助于数据可视化。
-
可能导致一定程度的信息损失。 -
转换后的特征难以解释,因为每个主成分都是原始特征的线性组合。 -
仅捕捉线性关系,对于非线性关系效果可能不佳。
8、 特征聚合
-
统计聚合:如平均值、中位数、最大值、最小值等。 -
时间聚合:如按天、周、月等时间单位聚合数据。 -
分组聚合:根据某些类别特征对数据进行分组,然后在每个组内进行聚合。
quarter = ['Q1','Q2','Q3','Q4']
car_sales = [10000,9850,13000,20000]
motorbike_sales = [14000,18000,9000,11000]
sparepart_sales = [5000, 7000,3000, 10000]
data = pd.DataFrame({'car':car_sales,
'motorbike':motorbike_sales,
'sparepart':sparepart_sales}, index=quarter)
data['avg_sales'] = data[['car','motorbike','sparepart']].mean(axis=1).astype(int)
data['total_sales'] = data[['car','motorbike','sparepart']].sum(axis=1).astype(int)
data
-
'avg_sales':每个季度不同产品的平均销售额。 -
'total_sales':每个季度所有产品的总销售额。
-
可以捕捉多个特征之间的关系。 -
减少特征的数量,有助于模型的解释和计算效率。 -
可能创造出更有预测力的特征。
-
聚合可能会导致一些细节信息的丢失。 -
需要领域知识来决定哪些聚合是有意义的。 -
过度聚合可能会导致过拟合。
9、TF-IDF(词频-逆文档频率)
-
词频(TF):衡量一个词在文档中出现的频率。计算公式为:TF(t,d) = (词t在文档d中出现的次数) / (文档d中的总词数) -
逆文档频率(IDF):衡量一个词在整个文档集中的普遍重要性。计算公式为:IDF(t) = log(总文档数 / 包含词t的文档数)
texts = ["I eat rice with eggs.",
"I also love to eat fried rice. Rice is the most delicious food in the world"]
vectorizer = TfidfVectorizer()
tfidfmatrix = vectorizer.fit_transform(texts)
features = vectorizer.get_feature_names_out()
data = pd.DataFrame(tfidfmatrix.toarray(), columns=features)
print("TF-IDF matrix")
data
-
第一行代表句子 "I eat rice with eggs." -
第二行代表句子 "I also love to eat fried rice. Rice is the most delicious food in the world"
-
能够反映词语在文档中的重要程度。 -
可以过滤掉常见词语,突出关键词。 -
计算简单,易于理解和实现。
-
没有考虑词序和语法结构。 -
对于极短文本可能效果不佳。 -
不能捕捉词语之间的语义关系。
10、文本嵌入
-
Word2Vec -
GloVe (Global Vectors for Word Representation) -
FastText -
BERT (Bidirectional Encoder Representations from Transformers)
corpus = api.load('text8')
model = Word2Vec(corpus)
dog = model.wv['dog']
print("Embedding vector for 'dog':\n", dog)
cat = model.wv['cat']
car = model.wv['car']
dogvscat = model.wv.similarity('dog','cat')
dogvscar = model.wv.similarity('dog','car')
print("Similarity:")
print("Dog vs Cat: ", dogvscat)
print("Dog vs Car: ", dogvscar)
-
能够捕捉词语之间的语义关系。 -
可以处理高维稀疏的文本数据,将其转换为低维稠密的向量表示。 -
通过迁移学习,可以在小规模数据集上也能获得良好的表现。
-
训练高质量的嵌入模型通常需要大量的文本数据和计算资源。 -
词语的多义性可能无法被单一的静态向量完全捕捉。 -
对于特定领域的任务,可能需要在领域特定的语料上重新训练或微调嵌入模型。
总结
关于我们
数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。
新浪微博:@数据派THU
微信视频号:数据派THU
今日头条:数据派THU
评论