8种数值变量的特征工程技术:将数值转化为预测模型的有效特征

特征工程是机器学习流程中的关键步骤,在此过程中,原始数据被转换为更具意义的特征,以增强模型对数据关系的理解能力。

特征工程通常涉及对现有数据应用转换,以生成或修改数据,这些转换后的数据在机器学习和数据科学的语境下用于训练模型,从而提高模型性能。

本文主要介绍处理数值变量特征工程,将探讨使用Python的Scikit-Learn库、Numpy等工具处理数值的高级特征工程技术,旨在提升机器学习模型的效能。

特征优化是提升机器学习模型质量的核心要素,尤其在分析复杂数据集时。有针对性地应用特征工程技术可带来以下优势:

揭示数据中的潜在模式:此技术能够发现初步观察中不易察觉的隐藏关系和结构。

优化变量表示:此过程将原始数据转换为更适合机器学习的格式。

应对数据分布和内在特性相关的挑战:此方法解决了诸如偏度、异常值和变量可扩展性等问题。

精确实施这些特征优化技术可显著提升机器学习模型的性能。

这些改进体现在模型性能的多个方面,从预测能力到可解释性。高质量特征使模型能够捕捉到数据中可能被忽视的细微差别和复杂模式。

特征优化还有助于增强模型的稳健性和泛化能力,这对于实际应用至关重要,同时降低了过拟合的风险。

接下来,我们将介绍一些实用的特征工程技术。

1、归一化

归一化(也称为缩放)可能是数据科学家学习的第一个数值特征工程技术。这种方法通过减去平均值并除以标准差来调整变量。

执行此转换后,结果变量将具有0均值和1的标准差及方差。

在机器学习中,特别是深度学习领域,将变量限制在特定范围内(如仅在0和1之间)有助于模型更快地收敛到最优解。这是一种学习型转换-我们使用训练数据来推导正确的均值和标准差值,然后在应用于新数据时使用这些值进行转换。

需要注意的是,这种转换不会改变分布,而是重新缩放了值。

我们将使用Sklearn的葡萄酒数据集进行分类任务。我们将比较使用和不使用混淆矩阵归一化的性能,使用Sklearn实现。

__selectionimporttrain_test__matriximportnumpyasnpX,y=load_wine(return_X_y=True)定义训练模型并获取混淆矩阵的函数defget_confusion_matrix(X_train,X_test,y_train,y_test):model=KNeighborsClassifier(n_neighbors=5)(X_train,y_train)y_pred=(X_test)returnconfusion_matrix(y_test,y_pred)归一化数据scaler=StandardScaler()X_train_scaled=_transform(X_train)X_test_scaled=(X_test)创建两个并列的子图fig,(ax1,ax2)=(1,2,figsize=(20,8))绘制热图plot_heatmap(ax1,cm_without_norm,'ConfusionMatrix\nWithoutNormalization')plot_heatmap(ax2,cm_with_norm,'ConfusionMatrix\nWithNormalization')调整布局并显示图表_layout(rect=[0,0,0.9,1])()

性能提升约为30%-对某些算法而言,归一化的影响如此显著,以至于不正确地应用它可能导致数据科学家犯严重错误。

归一化还有一些变体。在Sklearn中,这些变体被称为RobustScaler和MinMaxScaler。

Sklearn示例中提供了一个更复杂的图表,展示了归一化和未归一化的KNNClassifier模型的分类边界对比

2、多项式特征

多项式特征是一种在线性模型中引入非线性的有效方法。Scikit-Learn的PolynomialFeatures类能够生成多项式特征和变量间的交互项。

常见的多项式特征包括:

x²(平方项)

x³(立方项)

x⁴(四次方项)

更高次项

对于具有多个特征的模型(x_1,x_2,…,x_n),还可以创建交互项:

_x__1×_x__2(一阶交互项)

_x__1²×_x__2(二阶交互项)

_x__1×_x__2²(二阶交互项)

更高阶交互项

多项式特征的主要目标是使线性模型能够学习数据中的非线性关系,而无需改变底层算法。

多项式特征的主要优势在于显著增加了模型的灵活性,使线性模型能够捕捉数据中的非线性关系。具体表现为:

能够在特征空间中建模复杂的曲线和曲面

对本质上非线性的数据可能产生积极的性能贡献

模型在捕捉非线性关系的同时保持线性的基础结构。这允许使用熟悉的分析工具,并且比复杂的非线性模型更容易解释系数,尽管这种简单性随着多项式次数的增加而降低。

另一个关键优势是能够揭示变量之间隐藏的交互。在物理学或经济学等领域,关系通常是非线性的,这个特性尤为有价值。

但是多项式特征也存在一些缺点:

它迅速增加了数据集的维度,为每个输入特征创建额外的列

过度使用可能导致过拟合

由于需要处理更多的特征,计算资源需求增加

从实际角度来看,多项式特征的实现相对简单,这要归功于Python中的Sklearn库。下面我们将展示如何实现它。

PolynomialFeatures是Scikit-learn中用于生成多项式特征的类,位于模块中。

该类将一维输入数组转换为包含所有多项式项(直至指定次数)的新数组。例如,如果原始特征是[a,b],次数为2,则结果特征将是[1,a,b,a²,ab,b²]。

该类的主要参数如下:

degree(int,默认=2):多项式的次数。
确定生成的多项式项的最高次数。

interaction_only(bool,默认=False):如果为True,则仅生成交互项。不产生单个特征的幂。

include_bias(bool,默认=True):如果为True,包括一列1(偏置项)。在使用没有单独截距项的模型时有用。

order(C或F,默认=C):确定特征的输出顺序。C表示C风格顺序(最后的特征变化最快),'F'表示Fortran风格顺序。

以下是在Sklearn中实现该类的示例:

=([[1,2],[3,4]])poly=PolynomialFeatures(degree=2,include_bias=False)X_poly=_transform(X)print(X_poly)[3.4.9.12.16.]]print(_feature_names(['x1','x2']))设置随机数生成器以确保可重复性rnd=(42)在-3和3之间的100个点y=(X)+(size=len(X))/3重塑为sklearn所需的正确格式准备可视化fig,(ax1,ax2)=(ncols=2,sharey=True,figsize=(12,5))line=(-3,3,1000).reshape(-1,1)训练和绘制模型的函数deftrain_and_plot(X_train,X_plot,ax,title):决策树tree_reg=DecisionTreeRegressor(min_samples_split=3,random_state=0).fit(X_train,y)(line,tree_(X_plot),linewidth=2,color="red",label="DecisionTree")绘制原始数据的图train_and_plot(X,line,ax1,"ResultsBeforeDiscretization")_ylabel("RegressionOutput")创建一个具有正偏度值的示例数据集(42)data={'Income':(scale=50000,size=1000)创建一个具有两个并排子图的图形fig,axes=(1,2,figsize=(15,5))应用对数变换df['Log_Income']=(df['Income'])变换后分布的图axes[1].hist(df['Log_Income'],bins=50,color='green',alpha=0.7)axes[1].set_title('Log-transformedIncomeDistribution')axes[1].set_xlabel('Log_Income')axes[1].set_ylabel('Frequency')生成包含正值和负值的数据(42)data_positive=(scale=2,size=1000)负值data=([data_positive,data_negative])创建两个PowerTransformer实例:一个用于Yeo-Johnson,一个用于Box-Cox进行比较pt_yj=PowerTransformer(method='yeo-johnson',standardize=False)Box-Cox变换应用Yeo-Johnson变换偏移量以确保所有值为正data_bc=pt__transform(data_(-1,1))可视化结果fig,(ax1,ax2,ax3)=(1,3,figsize=(18,5))Yeo-Johnson变换后数据的直方图(data_yj,bins=50,edgecolor='black')_title("Yeo-Johnson")_xlabel("Value")创建一个具有偏斜分布的样本数据集(0)data=(scale=2,size=(1000,1))初始化QuantileTransformerquantile_transformer=QuantileTransformer(n_quantiles=100,output_distribution='normal')可视化原始和变换后的数据(figsize=(12,6))变换后数据的直方图(1,2,2)(data_transformed,bins=50,color='green',edgecolor='black')("TransformedData(Normal)")()

变换示例:从特定分布到正态分布

下面是一个图形可视化,比较了不同的非正态分布及其相对变换,通过我们探讨的一些技术。

我使用Sklearn文档中的图像作为参考,修改了图表的排序以便于阅读。

这张图突出显示了某些变换的局限性,但是它们并不总是成功。例如对于双峰分布,除了分位数变换外,所有尝试转换为正态曲线的努力都失败了。

8、主成分分析PCA

主成分分析(PCA)将一组可能相关的变量转换为一组线性不相关的变量,称为主成分。这些主成分按顺序排列,使得前几个包含原始变量中存在的大部分方差。

在特征工程的背景下,PCA可以用于减少特征数量,同时保留大部分信息。这可能会减少数据中的噪声和可能混淆模型的低级相关性。

作为一种降维技术,PCA应该用于压缩数据集而不是扩展它。PCA可以提取一些潜在特征,这些特征是影响您的数据的隐藏或潜在因素。例如有一个图像数据集,可以使用PCA来找到代表图像中对象的形状、颜色或纹理的特征。这些潜在特征可以帮助您更好地理解数据并改进机器学习模型。

PCA不仅可以应用在表格类数据,它还可以作为特征工程应用是在处理图像中。

让我们取Sklearnlfw_people数据集中存在的随机人脸,可以使用TruncatedSVD(一种与PCA非常相似的压缩技术)来提取关键图像特征,如边缘、阴影和主要对象的位置,为机器学习模型提供相关信息进行建模。

这种方法的一个典型应用是规范化图像,使系统对光照或其他条件的变化更加稳健——这使得减少的人脸成为最终面部识别的基础。

从Sklearn的开放LFW数据集中随机选取的图像。

创建此可视化的Python代码:

_lfw_用于降维的组件数n_components=50重构图像的函数defreconstruct_image(svd,X_transformed):(X_transformed,_)显示原始和降维人脸的函数defplot_transposed_original_and_reduced(X_original,X_reduced,n_faces=5):fig,axes=(2,n_faces,figsize=(3*n_faces,6))random_indices=(X_[0],n_faces,replace=False)fori,idxinenumerate(random_indices):降维人脸axes[1,i].imshow(X_reduced[idx].reshape(h,w),cmap='gray')axes[1,i].set_title(f'Reduced\n({n_components}comp.)')axes[1,i].axis('off')_layout()()计算并打印平均重构误差mse=((X-X_reconstructed)**2)print(f"\n平均重构误差(MSE):{mse:.4f}")显示前几个组件n_components_show=min(10,n_components)components=_[:n_components_show].reshape((n_components_show,h,w))fig,axes=(2,5,figsize=(15,6))fori,axinenumerate():ifin_components_show:(components[i],cmap='gray')_title(f'Component{i+1}')('off')_layout()()
结论

本文探讨了几种用于数值数据的高级特征工程技术,强调了它们在提高机器学习模型性能方面的关键作用。讨论的方法包括:

归一化

多项式特征

FunctionTransformer

KBinsDiscretizer

对数变换

PowerTransformer(Box-Cox和Yeo-Johnson)

QuantileTransformer

PCA

每种技术都提供了特定的优势,适用于特定类型的数据和问题。最合适的变换选择取决于数据的性质、要解决的问题以及选择的模型。没有一种通用的解决方案,这使得实验和验证变得至关重要。

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐