(3

您所在的位置:网站首页 数据特征提取与选择实验报告 (3

(3

2024-07-03 02:11| 来源: 网络整理| 查看: 265

3.3  特征选择

特征选择是从原始特征集中选择出最相关或最有信息量的特征子集,以提高机器学习模型的性能和泛化能力,同时降低计算复杂度。

3.3.1  特征选择的必要性

以下是特征选择在处理高维数据时的必要性:

降低维度:特征选择可以帮助降低维度,从而减少维度灾难的影响,提高计算效率,降低过拟合的风险。消除冗余:通过选择相关性较高的特征,可以减少冗余信息,使模型更关注真正重要的特征。提高泛化能力:特征选择可以提高模型的泛化能力,因为减少了模型对噪声和无关信息的敏感性。改善解释性:精心选择的特征可以提供更好的解释性,帮助我们理解模型做出的决策。加速训练:在选择了少数重要特征后,模型的训练时间会显著减少,从而加速了整个开发过程。

特征选择方法包括基于统计的方法、基于模型的方法、正则化方法等。选择适当的特征选择方法取决于数据的性质、任务需求和所使用的算法。在高维数据情况下,合理的特征选择可以显著改善模型的性能,并帮助避免高维数据引入的挑战。

3.3.2   特征选择的方法

在下面列出了实现特征选择的常见方法:

过滤方法(Filter Methods):这些方法在特征选择和模型训练之间独立进行。常见的过滤方法包括卡方检验、互信息、相关系数等,用于度量特征与目标变量之间的关联程度,然后根据阈值或排名选择特征。包装方法(Wrapper Methods):这些方法将特征选择视为一个搜索问题,根据模型的性能来评估特征的贡献。典型的包装方法是递归特征消除(Recursive Feature Elimination,RFE),它通过反复训练模型并逐步去除对模型影响较小的特征。嵌入方法(Embedded Methods):这些方法结合了特征选择和模型训练过程,例如在模型训练中使用正则化项,使得模型倾向于选择较少的特征。Lasso回归就是一种使用L1正则化的嵌入方法。稳定性选择(Stability Selection):这是一种基于随机重抽样的方法,通过多次在不同的数据子集上运行模型来估计特征的重要性。这可以帮助稳定地选择重要的特征,减少因数据变化引起的不稳定性。主成分分析(Principal Component Analysis,PCA):对于高维数据,PCA可以将特征投影到一个新的低维空间中,保留大部分数据方差。这有助于去除冗余特征和降低维度。基于树模型的特征选择:使用决策树或随机森林等树模型可以计算特征的重要性得分。树模型中,特征的分裂点和重要性可以作为特征的选择依据。特征选择库:许多机器学习库和工具包提供了内置的特征选择方法,如scikit-learn(Python库)、caret(R库)等。

在选择特征选择方法时,需要考虑数据集的性质、任务的需求、模型的类型以及计算资源等因素。特征选择可能需要结合实验和交叉验证来确定最适合的特征子集。同时,特征选择也不是一成不变的,随着数据集和任务的变化,可能需要不断优化和调整特征选择的策略。

例如下面是一个使用PyTorch实现特征选择的例子,其中我们将使用过滤方法中的相关系数来实现选择特征。在实际应用中,可能需要根据数据和任务的特点进行适当的调整。

实例3-1:PyTorch使用特征选择方法制作神经网络模型(源码路径:daima\3\te.py)

实例文件te.py的具体实现代码如下所示。

# 加载数据 data = load_iris() X = data.data y = data.target # 数据预处理 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 使用SelectKBest来选择特征 num_features_to_select = 2 selector = SelectKBest(score_func=f_classif, k=num_features_to_select) X_selected = selector.fit_transform(X_scaled, y) # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X_selected, y, test_size=0.2, random_state=42) # 定义简单的神经网络模型 class SimpleModel(nn.Module): def __init__(self, input_dim, output_dim): super(SimpleModel, self).__init__() self.fc = nn.Linear(input_dim, output_dim) def forward(self, x): return self.fc(x) # 设置模型参数 input_dim = num_features_to_select output_dim = 3 # 由于数据集是三分类问题 learning_rate = 0.01 num_epochs = 100 # 初始化模型、损失函数和优化器 model = SimpleModel(input_dim, output_dim) criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate) # 训练模型 for epoch in range(num_epochs): inputs = torch.tensor(X_train, dtype=torch.float32) labels = torch.tensor(y_train, dtype=torch.long) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() if (epoch+1) % 10 == 0: print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}') # 在测试集上评估模型性能 with torch.no_grad(): inputs = torch.tensor(X_test, dtype=torch.float32) labels = torch.tensor(y_test, dtype=torch.long) outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) accuracy = (predicted == labels).sum().item() / labels.size(0) print(f'Accuracy on test set: {accuracy:.2f}')

在上述代码中,首先加载了Iris数据集,然后使用SelectKBest选择了2个最相关的特征。然后我们定义了一个简单的神经网络模型,使用交叉熵损失函数进行训练,并在测试集上评估了模型的性能。执行后会输出:

Epoch [10/100], Loss: 1.9596 Epoch [20/100], Loss: 1.8222 Epoch [30/100], Loss: 1.6954 Epoch [40/100], Loss: 1.5791 Epoch [50/100], Loss: 1.4731 Epoch [60/100], Loss: 1.3769 Epoch [70/100], Loss: 1.2900 Epoch [80/100], Loss: 1.2118 Epoch [90/100], Loss: 1.1418 Epoch [100/100], Loss: 1.0793 Accuracy on test set: 0.53

例如下面是一个使用TensorFlow实现特征选择的例子,使用卷积神经网络(CNN)模型对MNIST数据集进行分类,并在训练前使用SelectKBest方法选择部分特征。

实例3-2:TensorFlow使用特征选择方法制作神经网络模型(源码路径:daima\3\tte.py)

实例文件tte.py的具体实现代码如下所示。

import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense from tensorflow.keras.models import Model from sklearn.feature_selection import SelectKBest, f_classif # 加载数据集 (X_train, y_train), (X_test, y_test) = mnist.load_data() X_train, X_test = X_train / 255.0, X_test / 255.0 # 归一化 # 将图像数据转换为向量形式 X_train = X_train.reshape(-1, 28 * 28) X_test = X_test.reshape(-1, 28 * 28) # 使用SelectKBest选择特征 num_features_to_select = 200 selector = SelectKBest(score_func=f_classif, k=num_features_to_select) X_train_selected = selector.fit_transform(X_train, y_train) X_test_selected = selector.transform(X_test) # 构建CNN模型 input_layer = Input(shape=(num_features_to_select,)) x = Dense(128, activation='relu')(input_layer) output_layer = Dense(10, activation='softmax')(x) model = Model(inputs=input_layer, outputs=output_layer) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 训练模型 batch_size = 64 epochs = 10 model.fit(X_train_selected, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1) # 在测试集上评估模型性能 test_loss, test_accuracy = model.evaluate(X_test_selected, y_test, verbose=0) print(f'Test accuracy: {test_accuracy:.4f}')

在上述代码中,首先加载了MNIST数据集并进行了数据预处理。然后使用SelectKBest方法选择了200个最相关的特征。接着,构建了一个简单的CNN模型,将选择的特征作为输入。模型通过编译后,使用选择的特征进行训练。最后,在测试集上评估了模型的性能。执行后会输出:

Epoch 1/10 844/844 [==============================] - 5s 5ms/step - loss: 0.4450 - accuracy: 0.8686 - val_loss: 0.2119 - val_accuracy: 0.9398 Epoch 2/10 844/844 [==============================] - 4s 5ms/step - loss: 0.2197 - accuracy: 0.9347 - val_loss: 0.1540 - val_accuracy: 0.9570 Epoch 3/10 844/844 [==============================] - 6s 7ms/step - loss: 0.1645 - accuracy: 0.9505 - val_loss: 0.1271 - val_accuracy: 0.9643 Epoch 4/10 844/844 [==============================] - 5s 6ms/step - loss: 0.1332 - accuracy: 0.9604 - val_loss: 0.1142 - val_accuracy: 0.9682 Epoch 5/10 844/844 [==============================] - 4s 5ms/step - loss: 0.1150 - accuracy: 0.9659 - val_loss: 0.1054 - val_accuracy: 0.9712 Epoch 6/10 844/844 [==============================] - 6s 7ms/step - loss: 0.1002 - accuracy: 0.9705 - val_loss: 0.1030 - val_accuracy: 0.9712 Epoch 7/10 844/844 [==============================] - 5s 5ms/step - loss: 0.0886 - accuracy: 0.9737 - val_loss: 0.0992 - val_accuracy: 0.9717 Epoch 8/10 844/844 [==============================] - 6s 7ms/step - loss: 0.0794 - accuracy: 0.9760 - val_loss: 0.0926 - val_accuracy: 0.9733 Epoch 9/10 844/844 [==============================] - 3s 4ms/step - loss: 0.0717 - accuracy: 0.9786 - val_loss: 0.0909 - val_accuracy: 0.9748 Epoch 10/10 844/844 [==============================] - 3s 4ms/step - loss: 0.0652 - accuracy: 0.9807 - val_loss: 0.0929 - val_accuracy: 0.9740 Test accuracy: 0.9692 未完待续



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3