您的当前位置:首页正文

机器学习中常见特征选择方法介绍:特征过滤、特征组合、嵌入式方法、主成分分析、递归消除

2024-11-11 来源:个人技术集锦

《博主简介》

《------往期经典推荐------》

一、

项目名称项目名称
1.【】2.【】
3.【】4.【】
5.【】6.【】
7.【】8.【】
9.【】10.【】
11.【】12.【】
13.【】14.【】
15.【】16.【】
17.【】18.【】
19.【】20.【】
21.【】22.【】
23.【】24.【】
25.【】26.【】
27.【】28.【】
29.【】30.【】
31.【】32.【】
33.【】34.【】
35.【】36.【】
37.【】38.【】
39.【】40.【】
41.【】42.【】
43.【】44.【】
45.【】46.【】
47.【】48.【】
49.【】50.【】
51.【】52.【】
53.【】54.【】
55.【】56.【】
57.【】58.【】
59.【】60.【】
61.【】62.【】
63.【】64.【】
65.【】66.【】
67.【】68.【】
69.【】

二、,已更新31期,欢迎关注,持续更新中~~
三、
四、
持续更新中~~
,持续更新中~

《------正文------》

特征选择是机器学习中的一个重要步骤,涉及选择可用特征的子集以提高模型的性能。以下是一些常用的特征选择技术:

过滤方法

该方法涉及通过计算统计测量(例如,相关性、互信息、卡方等)以及基于特征的分数对特征进行排名。然后从模型中删除具有低分数的特征。

要在Python中实现filter方法,可以使用sklearn.feature_selection模块中的SelectKBest或SelectPercentile函数。下面是一个小的代码片段来实现功能选择。

from sklearn.feature_selection import SelectPercentile, chi2
selector = SelectPercentile(chi2, percentile=10)
X_new = selector.fit_transform(X, y)

包装方法

该方法包括通过添加或删除特征并选择产生最佳性能的特征子集来评估模型的性能。这种方法在计算上是昂贵的,但它比滤波器方法更准确。

要在Python中实现包装器方法,可以使用sklearn.feature_selection模块中的RFE(递归特征消除)函数。下面是实现Wrapper方法的一个小代码片段。

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

estimator = LogisticRegression()
selector = RFE(estimator, n_features_to_select=5)
selector = selector.fit(X, y)
X_new = selector.transform(X)

嵌入式方法

这种方法包括将特征选择纳入模型构建过程本身。这可以使用Lasso回归、岭回归或决策树等技术来完成。这些方法为每个特征分配权重,并从模型中删除权重较低的特征。

要在Python中实现嵌入式方法,可以使用sklearn.linear_model模块中的Lasso或Ridge回归函数。下面是实现嵌入式方法的一小段代码:

from sklearn.linear_model import Lasso

lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
coef = pd.Series(lasso.coef_, index = X.columns)
important_features = coef[coef != 0]

主成分分析(PCA)

这是一种无监督学习方法,涉及将原始特征转换为一组不相关的主成分,这些主成分解释了数据中的最大方差。主成分的数量可以基于阈值来选择,这可以降低数据集的维度。

要在Python中实现PCA,可以使用sklearn.decomposition模块中的PCA函数。例如,为了减少特征的数量,您可以使用PCA,如以下代码所示:

from sklearn.decomposition import PCA
pca = PCA(n_components=3)
X_new = pca.fit_transform(X)

递归特征消除(RFE)

该方法包括递归地消除最不重要的特征,直到识别出最重要特征的子集。它使用基于模型的方法,计算成本可能很高,但它可以在高维数据集中产生良好的结果。

要在Python中实现RFE,可以使用sklearn.feature_selection模块中的RFECV(带有交叉验证的递归特征消除)函数。例如,下面是一个小的代码片段,在它的帮助下,我们可以实现使用递归特征消除:

from sklearn.feature_selection import RFECV
from sklearn.tree import DecisionTreeClassifier
estimator = DecisionTreeClassifier()
selector = RFECV(estimator, step=1, cv=5)
selector = selector.fit(X, y)
X_new = selector.transform(X)

这些特征选择技术可以单独使用或组合使用,以提高机器学习模型的性能。根据数据集的大小、特征的性质和所使用的模型类型选择适当的技术非常重要。

例如

在下面的例子中,我们将实现三种特征选择方法-使用卡方检验的单变量特征选择,交叉验证递归特征消除(RFECV)和主成分分析(PCA)。

我们将使用scikit-learn中包含的乳腺癌威斯康星州(诊断)数据集。该数据集包含569个样本,具有30个特征,任务是根据这些特征对肿瘤是恶性还是良性进行分类。

以下是在乳腺癌威斯康星州(诊断)数据集上实现这些特征选择方法的Python代码:

# Import necessary libraries and dataset
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

# Load the dataset
diabetes = pd.read_csv(r'C:\Users\Leekha\Desktop\diabetes.csv')

# Split the dataset into features and target variable
X = diabetes.drop('Outcome', axis=1)
y = diabetes['Outcome']

# Apply univariate feature selection using the chi-square test
selector = SelectKBest(chi2, k=4)
X_new = selector.fit_transform(X, y)

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X_new, y, test_size=0.3, random_state=42)

# Fit a logistic regression model on the selected features
clf = LogisticRegression()
clf.fit(X_train, y_train)

# Evaluate the model on the test set
accuracy = clf.score(X_test, y_test)
print("Accuracy using univariate feature selection: {:.2f}".format(accuracy))

# Recursive feature elimination with cross-validation (RFECV)
estimator = LogisticRegression()
selector = RFECV(estimator, step=1, cv=5)
selector.fit(X, y)
X_new = selector.transform(X)
scores = cross_val_score(LogisticRegression(), X_new, y, cv=5)
print("Accuracy using RFECV feature selection: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

# PCA implementation
pca = PCA(n_components=5)
X_new = pca.fit_transform(X)
scores = cross_val_score(LogisticRegression(), X_new, y, cv=5)
print("Accuracy using PCA feature selection: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

输出

当您执行此代码时,它将在终端上生成以下输出:

Accuracy using univariate feature selection: 0.74
Accuracy using RFECV feature selection: 0.77 (+/- 0.03)
Accuracy using PCA feature selection: 0.75 (+/- 0.07)

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

Top