数据准备指南:10种基础特征工程方法的实战教程
共 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.datatargets = iris_data.targetfeatures.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
评论
