机器学习 - 特征选择



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

过滤方法

此方法通过计算统计量(例如,相关性、互信息、卡方检验等)来评估每个特征的相关性,并根据其分数对特征进行排序。然后,将得分低的特征从模型中移除。

要在 Python 中实现过滤方法,可以使用 `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`(递归特征消除)函数。下面是一个实现包装方法的简短代码片段。

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 回归、Ridge 回归或决策树之类的技术来完成。这些方法为每个特征分配权重,权重低的特征将从模型中移除。

要在 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)
广告