什么是特征工程
1、什么是特征工程对原始的特征进行过滤筛选通过对原始数据的处理、转换和构造生成新的特征或选择有效的特征从而提高模型的性能。特征工程是将原始数据转换为可以更好地表示问题的特征形式帮助模型更好地理解和学习数据中的规律。2、特征工程的内容2.1、特征选择删减从原始特征中挑选出与目标变量关系最密切的特征剔除冗余、无关或噪声特征。这样可以减少模型的复杂度、加速训练过程、并减少过拟合的风险。1过滤法。基于统计测试如卡方检验、相关系数、信息增益等来评估特征与目标变量之间的关系选择最相关的特征。2包裹法。使用模型如递归特征消除 RFE来评估特征的重要性并根据模型的表现进行特征选择。3嵌入法。使用模型本身的特征选择机制如决策树的特征重要性L1正则化的特征选择来选择最重要的特征。2.2、特征转换修改对数据进行数学或统计处理使其变得更加适合模型的输入要求。特征不增加也不减少。1归一化。将特征缩放到特定的范围通常是0到1之间。适用于对尺度敏感的模型如KNN、SVM。2标准化。通过减去均值并除以标准差使特征的分布具有均值0标准差1。3对数变换。对于有偏态的分布如收入、价格等对数变换可以将其转化为更接近正态分布的形式。4类别变换。对于有些特征不好输入模型所以要转换特征表现形式。独热编码One-Hot Encoding将类别型变量转换为二进制列常用于无序类别特征。标签编码Label Encoding将类别型变量映射为整数常用于有序类别特征。目标编码Target Encoding将类别变量的每个类别替换为其对应目标变量的平均值或其他统计量。频率编码Frequency Encoding将类别变量的每个类别替换为该类别在数据集中的出现频率。2.3、特征构造增加特征构造是基于现有的特征创造出新的、更有代表性的特征。通过组合、转换、或者聚合现有的特征形成能够更好反映数据规律的特征。1交互特征。将两个特征组合起来形成新的特征。例如两个特征的乘积、和或差等。2统计特征。从原始特征中提取统计值例如求某个时间窗口的平均值、最大值、最小值、标准差等。例如在时间序列数据中你可以从原始数据中提取每个小时、每日的平均值。3日期和时间特征。从日期时间数据中提取如星期几、月份、年份、季度等特征。例如将“2000-01-01”转换为“星期几”、“是否节假日”、“月初或月末”等特征。2.4、特征降维删减需要机器学习算法当数据集的特征数量非常大时特征降维可以帮助减少计算复杂度并避免过拟合。通过降维方法可以在保持数据本质的情况下减少特征的数量。1主成分分析PCA。通过线性变换将原始特征映射到一个新的空间使得新的特征主成分尽可能地保留数据的方差。2线性判别分析LDA。一种监督学习的降维方法通过最大化类间距离与类内距离的比率来降维。3t-SNE。一种非线性的降维技术特别适合可视化高维数据。4自编码器。一种神经网络模型通过压缩编码器来实现数据的降维。3、常用方法以上中特征选择在特征工程中是最基本、也最常见的操作。另外在训练模型时有时也会遇到维度灾难即特征数量过多。我们希望能在确保不丢失重要特征的前提下减少维度的数量来降低训练模型的难度。所以在特征工程中也经常会用到特征降维方法。3.1、低方差过滤法方差越小说明数据越平稳大家都一样很有可能是一个噪声。低方差的特征意味着该特征的所有样本值几乎相同对预测影响极小可以将其去掉。import numpy as np a np.random.randn(100) # 生成标准正态分布随机数 print(a.shape) # 维度 print(np.var(a)) # 方差 # b np.random.randn(100) * 0.1 # 生成标准正态分布随机数每个数×0.1方差就是0.01 b np.random.normal(5, 0.1, size100) # 均值为5标准差0.1 print(b.shape) print(np.var(b)) # 构建数据样本 X np.vstack((a, b)).T # 垂直堆叠再转置 print(X.shape) from sklearn.feature_selection import VarianceThreshold # 低方差过滤0.01 vt VarianceThreshold(0.01) # 设定阈值方差≤0.01的特征将被删除 X_new vt.fit_transform(X) # 计算方差并筛选返回保留的特征矩阵 print(X_new) print(X_new.shape)3.2、相关系数法通过计算特征与目标变量或特征之间的相关性筛选出高相关性特征与目标相关或剔除冗余特征特征间高度相关。1皮尔逊相关系数皮尔逊相关系数Pearson Correlation用于衡量两个变量的线性相关性取值范围[-1, 1]。正相关值接近1说明特征随目标变量增加而增加。负相关值接近-1说明特征随目标变量增加而减少。无关值接近0说明特征和目标变量无明显关系。import pandas as pd # 读取数据 advertising pd.read_csv(../../data/advertising.csv) print(advertising.head()) print(advertising.shape) # 去掉第一列 advertising.drop(advertising.columns[0], axis1, inplaceTrue) print(advertising.shape) print(advertising.head()) # 去掉空值 advertising.dropna(inplaceTrue) print(advertising.head()) # 构建 X 和 y X advertising.drop(columnsSales,axis1) # X是三个特征构成的矩阵 print(X.head()) y advertising[Sales] # 计算pearson相关系数 print(X.corrwith(y, methodpearson)) # 相关系数矩阵 corr_matrix advertising.corr(methodpearson) # 所有列都进行相关系数的判断 print(corr_matrix) import matplotlib.pyplot as plt import seaborn as sns sns.heatmap(corr_matrix, annotTrue, cmapcoolwarm, fmt.2f) plt.title(Pearson Correlation) plt.show()2斯皮尔曼相关系数斯皮尔曼相关系数Spearman’s Rank Correlation Coefficient的定义是等级变量之间的皮尔逊相关系数。用于衡量两个变量之间的单调关系即当一个变量增加时另一个变量是否总是增加或减少不要求是线性关系。适用于非线性关系或数据不符合正态分布的情况。是两个变量的等级之差是样本数完全正相关一个变量增加另一个变量也总是增加。完全负相关一个变量增加另一个变量总是减少。无相关性。3.3、主成分分析PCA主成分分析Principal Component AnalysisPCA是一种常用的降维技术通过线性变换将高维数据投影到低维空间同时保留数据的主要变化模式。实际应用中我们并不知道有多少个主成分。但是我们可以设定需要多少个主成分通过计算选取方差较大的特征。import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA # 引入PCA from sklearn.preprocessing import StandardScaler # 定义数据 n_samples 1000 # 首先定义数据2个本质的主成分 component1 np.random.normal(0, 1, sizen_samples) component2 np.random.normal(0, 0.2, sizen_samples) # 再定义噪声 noise np.random.normal(0, 0.1, sizen_samples) # 构造3维数据有三个特征的数据 X np.vstack((component1 - component2, component1 component2, component2 noise)).T print(X.shape) print(X) # 标准化 scaler StandardScaler() # 标准化缩放器 X_stand scaler.fit_transform(X) # 进行标准化 print(X) # 应用PCA将3维数据提取主成分并降到2维 pca PCA(n_components2) X_pca pca.fit_transform(X_stand) print(X_pca.shape) print(X_pca) # 可视化 fig plt.figure(figsize(12, 4)) # 画出原始数据的3D分布图 ax1 fig.add_subplot(121, projection3d) ax1.scatter(X[:, 0], X[:, 1], X[:, 2], cg) ax1.set_title(Before PCA(3D)) ax1.set_xlabel(Feature1) ax1.set_ylabel(Feature2) ax1.set_zlabel(Feature3) # 画出降维之后的2D分布图 ax2 fig.add_subplot(122) ax2.scatter(X_pca[:, 0], X_pca[:, 1], cg) ax2.set_title(After PCA(2D)) ax2.set_xlabel(Principal Component1) ax2.set_ylabel(Principal Component2) plt.show()