特征选择与降维实战5种算法在鸢尾花数据集上的性能对比鸢尾花数据集作为机器学习领域的经典案例为我们提供了研究特征工程技术的理想实验平台。本文将深入探讨五种主流特征处理方法MIC、mRMR、PCA、LDA、t-SNE在该数据集上的实际表现通过完整的代码实现和量化指标对比帮助读者理解不同技术路径的适用场景与性能差异。1. 实验设计与环境准备在开始技术对比前我们需要建立统一的实验框架。本次实验采用Scikit-learn提供的鸢尾花数据集包含150个样本每个样本有4个原始特征萼片长度、萼片宽度、花瓣长度、花瓣宽度和1个类别标签Setosa、Versicolor、Virginica。1.1 实验环境配置# 基础库导入 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 特征选择与降维算法 from minepy import MINE # MIC计算 from sklearn.feature_selection import mutual_info_classif, SelectKBest from sklearn.decomposition import PCA from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA from sklearn.manifold import TSNE # 设置随机种子保证可复现性 np.random.seed(42)1.2 数据加载与预处理# 加载数据集并转换为DataFrame iris load_iris() X pd.DataFrame(iris.data, columnsiris.feature_names) y pd.Series(iris.target, nametarget) # 数据标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X_scaled, y, test_size0.3, stratifyy)提示标准化处理对PCA、LDA等基于距离的算法至关重要但对MIC、mRMR等基于排序的方法影响较小。2. 特征选择方法实战特征选择的核心是从原始特征中筛选出最具判别力的子集不改变特征本身的物理含义。我们首先实现两种经典的特征选择算法。2.1 最大互信息系数(MIC)MIC能够捕捉线性与非线性关系适合探索特征与目标之间的复杂关联def calculate_mic(X, y): 计算各特征与目标的MIC值 mine MINE(alpha0.6, c15) mic_scores [] for i in range(X.shape[1]): mine.compute_score(X[:, i], y) mic_scores.append(mine.mic()) return np.array(mic_scores) # 计算MIC并可视化 mic_scores calculate_mic(X_train, y_train) plt.bar(iris.feature_names, mic_scores) plt.title(MIC Scores for Iris Features) plt.ylabel(MIC Value) plt.show()MIC得分分析花瓣长度0.92花瓣宽度0.89萼片长度0.76萼片宽度0.622.2 最大相关最小冗余(mRMR)mRMR算法通过平衡特征与目标的相关性以及特征间的冗余性选择最优特征子集def mrmr_selector(X, y, k2): 实现mRMR特征选择 # 计算特征-目标互信息 mi_fc mutual_info_classif(X, y) # 计算特征间互信息矩阵 mi_ff np.zeros((X.shape[1], X.shape[1])) for i in range(X.shape[1]): for j in range(i1, X.shape[1]): mi_ff[i,j] mutual_info_classif(X[:, i].reshape(-1,1), X[:, j])[0] mi_ff[j,i] mi_ff[i,j] # 贪心算法选择特征 selected [] remaining list(range(X.shape[1])) # 选择第一个特征 first np.argmax(mi_fc) selected.append(first) remaining.remove(first) # 迭代选择后续特征 for _ in range(1, k): scores [] for f in remaining: rel mi_fc[f] red np.mean([mi_ff[f, s] for s in selected]) scores.append(rel - red) best remaining[np.argmax(scores)] selected.append(best) remaining.remove(best) return selected # 应用mRMR选择2个特征 mrmr_features mrmr_selector(X_train, y_train) print(mRMR选择特征:, [iris.feature_names[i] for i in mrmr_features])典型输出结果mRMR选择特征: [petal length (cm), petal width (cm)]3. 特征降维方法实战与特征选择不同降维技术通过数学变换将原始特征映射到新的空间。我们实现三种主流降维算法并分析其特性。3.1 主成分分析(PCA)PCA通过正交变换将数据投影到方差最大的方向上# PCA降维 pca PCA(n_components2) X_pca pca.fit_transform(X_train) # 可视化 plt.scatter(X_pca[:,0], X_pca[:,1], cy_train) plt.xlabel(PC1 (Var: %.2f%%) % (pca.explained_variance_ratio_[0]*100)) plt.ylabel(PC2 (Var: %.2f%%) % (pca.explained_variance_ratio_[1]*100)) plt.title(PCA Projection of Iris Dataset) plt.colorbar() plt.show()PCA关键参数解释方差比PC1(72.96%) PC2(22.85%) 95.81%成分载荷矩阵特征PC1PC2萼片长度0.52-0.37萼片宽度-0.26-0.92花瓣长度0.58-0.02花瓣宽度0.56-0.073.2 线性判别分析(LDA)LDA作为有监督降维方法最大化类间离散度与类内离散度的比值# LDA降维 lda LDA(n_components2) X_lda lda.fit_transform(X_train, y_train) # 可视化 plt.scatter(X_lda[:,0], X_lda[:,1], cy_train) plt.xlabel(LD1) plt.ylabel(LD2) plt.title(LDA Projection of Iris Dataset) plt.colorbar() plt.show()LDA特性分析判别效率LD1解释99.1%的方差LD2解释0.9%投影向量LD1 0.91*萼片长度 1.79*花瓣长度 - 2.15*花瓣宽度 - 2.04*萼片宽度 LD2 0.64*萼片长度 - 0.38*花瓣长度 - 0.55*花瓣宽度 0.27*萼片宽度3.3 t-SNE可视化t-SNE擅长在低维空间保持高维数据的局部结构# t-SNE降维 tsne TSNE(n_components2, perplexity30, learning_rate200) X_tsne tsne.fit_transform(X_train) # 可视化 plt.scatter(X_tsne[:,0], X_tsne[:,1], cy_train) plt.title(t-SNE Projection of Iris Dataset) plt.colorbar() plt.show()注意t-SNE的超参数perplexity对结果影响显著通常建议尝试5-50之间的值。不同于PCA和LDAt-SNE的坐标轴没有明确的数学含义。4. 性能对比与结果分析为量化比较各方法的有效性我们使用SVM分类器在测试集上评估不同特征处理后的模型性能。4.1 评估指标设计def evaluate_method(method, X_train, X_test, y_train, y_test): 评估特征处理方法 # 训练SVM分类器 svm SVC(kernellinear, C1) svm.fit(X_train, y_train) # 计算准确率和训练时间 start time.time() y_pred svm.predict(X_test) elapsed time.time() - start return { accuracy: accuracy_score(y_test, y_pred), time: elapsed, dim: X_train.shape[1] }4.2 综合对比结果我们构建如下对比实验results [] # 原始特征 results.append({ method: Original, **evaluate_method(original, X_train, X_test, y_train, y_test) }) # MIC特征选择 mic_mask mic_scores np.median(mic_scores) X_mic_train X_train[:, mic_mask] X_mic_test X_test[:, mic_mask] results.append({ method: MIC, **evaluate_method(mic, X_mic_train, X_mic_test, y_train, y_test) }) # mRMR特征选择 X_mrmr_train X_train[:, mrmr_features] X_mrmr_test X_test[:, mrmr_features] results.append({ method: mRMR, **evaluate_method(mrmr, X_mrmr_train, X_mrmr_test, y_train, y_test) }) # PCA降维 results.append({ method: PCA, **evaluate_method(pca, X_pca, pca.transform(X_test), y_train, y_test) }) # LDA降维 results.append({ method: LDA, **evaluate_method(lda, X_lda, lda.transform(X_test), y_train, y_test) })性能对比表格方法准确率训练时间(ms)特征维度原始特征97.8%2.14MIC选择95.6%1.82mRMR选择97.8%1.72PCA降维93.3%1.52LDA降维100%1.624.3 技术选型建议根据实验结果我们可以得出以下实践建议分类任务优先考虑LDA在标签信息可靠的情况下LDA能最大化类别区分度本实验中LDA将准确率提升至100%同时减少一半特征量无监督场景使用PCA当缺乏标签或探索数据结构时PCA是最安全的默认选择虽然准确率略低但保留了95.8%的原始信息特征选择适用场景需要保持特征可解释性时选择mRMR计算资源极度受限时MIC提供快速筛选方案t-SNE的特殊价值不适合直接用于建模但可视化效果最佳能揭示PCA/LDA未能发现的局部数据结构5. 进阶技巧与优化方向在基础实验之外这些方法还有更多值得探索的优化空间5.1 参数调优策略# PCA维度选择 pca PCA(n_components0.95) # 保留95%方差 # t-SNE参数优化 tsne TSNE( n_components2, perplexity30, # 适合中等规模数据集 early_exaggeration12, learning_rateauto ) # mRMR特征数确定 from sklearn.feature_selection import RFECV selector RFECV(SVC(kernellinear), step1, cv5) selector.fit(X, y) optimal_num_features selector.n_features_5.2 方法组合实践# PCA 特征选择组合 pca PCA(n_components4) X_pca_full pca.fit_transform(X_train) mic_scores_pca calculate_mic(X_pca_full, y_train) pca_mic_mask mic_scores_pca np.median(mic_scores_pca) # LDA t-SNE可视化 X_lda_3d LDA(n_components3).fit_transform(X_train, y_train) X_tsne_lda TSNE().fit_transform(X_lda_3d)5.3 其他评估指标除准确率外还可考虑特征稳定性通过bootstrap采样评估选择结果的鲁棒性模型复杂度如SVM的支撑向量数量业务指标如医疗场景中的敏感度/特异度在真实项目中我发现特征工程的选择往往需要平衡技术指标与业务需求。例如在医疗影像分析中即使LDA性能略优有时也会选择PCA以保持结果的可解释性。
特征选择与降维实战:5种算法在鸢尾花数据集上的性能对比
发布时间:2026/7/11 4:59:08
特征选择与降维实战5种算法在鸢尾花数据集上的性能对比鸢尾花数据集作为机器学习领域的经典案例为我们提供了研究特征工程技术的理想实验平台。本文将深入探讨五种主流特征处理方法MIC、mRMR、PCA、LDA、t-SNE在该数据集上的实际表现通过完整的代码实现和量化指标对比帮助读者理解不同技术路径的适用场景与性能差异。1. 实验设计与环境准备在开始技术对比前我们需要建立统一的实验框架。本次实验采用Scikit-learn提供的鸢尾花数据集包含150个样本每个样本有4个原始特征萼片长度、萼片宽度、花瓣长度、花瓣宽度和1个类别标签Setosa、Versicolor、Virginica。1.1 实验环境配置# 基础库导入 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 特征选择与降维算法 from minepy import MINE # MIC计算 from sklearn.feature_selection import mutual_info_classif, SelectKBest from sklearn.decomposition import PCA from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA from sklearn.manifold import TSNE # 设置随机种子保证可复现性 np.random.seed(42)1.2 数据加载与预处理# 加载数据集并转换为DataFrame iris load_iris() X pd.DataFrame(iris.data, columnsiris.feature_names) y pd.Series(iris.target, nametarget) # 数据标准化 scaler StandardScaler() X_scaled scaler.fit_transform(X) # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X_scaled, y, test_size0.3, stratifyy)提示标准化处理对PCA、LDA等基于距离的算法至关重要但对MIC、mRMR等基于排序的方法影响较小。2. 特征选择方法实战特征选择的核心是从原始特征中筛选出最具判别力的子集不改变特征本身的物理含义。我们首先实现两种经典的特征选择算法。2.1 最大互信息系数(MIC)MIC能够捕捉线性与非线性关系适合探索特征与目标之间的复杂关联def calculate_mic(X, y): 计算各特征与目标的MIC值 mine MINE(alpha0.6, c15) mic_scores [] for i in range(X.shape[1]): mine.compute_score(X[:, i], y) mic_scores.append(mine.mic()) return np.array(mic_scores) # 计算MIC并可视化 mic_scores calculate_mic(X_train, y_train) plt.bar(iris.feature_names, mic_scores) plt.title(MIC Scores for Iris Features) plt.ylabel(MIC Value) plt.show()MIC得分分析花瓣长度0.92花瓣宽度0.89萼片长度0.76萼片宽度0.622.2 最大相关最小冗余(mRMR)mRMR算法通过平衡特征与目标的相关性以及特征间的冗余性选择最优特征子集def mrmr_selector(X, y, k2): 实现mRMR特征选择 # 计算特征-目标互信息 mi_fc mutual_info_classif(X, y) # 计算特征间互信息矩阵 mi_ff np.zeros((X.shape[1], X.shape[1])) for i in range(X.shape[1]): for j in range(i1, X.shape[1]): mi_ff[i,j] mutual_info_classif(X[:, i].reshape(-1,1), X[:, j])[0] mi_ff[j,i] mi_ff[i,j] # 贪心算法选择特征 selected [] remaining list(range(X.shape[1])) # 选择第一个特征 first np.argmax(mi_fc) selected.append(first) remaining.remove(first) # 迭代选择后续特征 for _ in range(1, k): scores [] for f in remaining: rel mi_fc[f] red np.mean([mi_ff[f, s] for s in selected]) scores.append(rel - red) best remaining[np.argmax(scores)] selected.append(best) remaining.remove(best) return selected # 应用mRMR选择2个特征 mrmr_features mrmr_selector(X_train, y_train) print(mRMR选择特征:, [iris.feature_names[i] for i in mrmr_features])典型输出结果mRMR选择特征: [petal length (cm), petal width (cm)]3. 特征降维方法实战与特征选择不同降维技术通过数学变换将原始特征映射到新的空间。我们实现三种主流降维算法并分析其特性。3.1 主成分分析(PCA)PCA通过正交变换将数据投影到方差最大的方向上# PCA降维 pca PCA(n_components2) X_pca pca.fit_transform(X_train) # 可视化 plt.scatter(X_pca[:,0], X_pca[:,1], cy_train) plt.xlabel(PC1 (Var: %.2f%%) % (pca.explained_variance_ratio_[0]*100)) plt.ylabel(PC2 (Var: %.2f%%) % (pca.explained_variance_ratio_[1]*100)) plt.title(PCA Projection of Iris Dataset) plt.colorbar() plt.show()PCA关键参数解释方差比PC1(72.96%) PC2(22.85%) 95.81%成分载荷矩阵特征PC1PC2萼片长度0.52-0.37萼片宽度-0.26-0.92花瓣长度0.58-0.02花瓣宽度0.56-0.073.2 线性判别分析(LDA)LDA作为有监督降维方法最大化类间离散度与类内离散度的比值# LDA降维 lda LDA(n_components2) X_lda lda.fit_transform(X_train, y_train) # 可视化 plt.scatter(X_lda[:,0], X_lda[:,1], cy_train) plt.xlabel(LD1) plt.ylabel(LD2) plt.title(LDA Projection of Iris Dataset) plt.colorbar() plt.show()LDA特性分析判别效率LD1解释99.1%的方差LD2解释0.9%投影向量LD1 0.91*萼片长度 1.79*花瓣长度 - 2.15*花瓣宽度 - 2.04*萼片宽度 LD2 0.64*萼片长度 - 0.38*花瓣长度 - 0.55*花瓣宽度 0.27*萼片宽度3.3 t-SNE可视化t-SNE擅长在低维空间保持高维数据的局部结构# t-SNE降维 tsne TSNE(n_components2, perplexity30, learning_rate200) X_tsne tsne.fit_transform(X_train) # 可视化 plt.scatter(X_tsne[:,0], X_tsne[:,1], cy_train) plt.title(t-SNE Projection of Iris Dataset) plt.colorbar() plt.show()注意t-SNE的超参数perplexity对结果影响显著通常建议尝试5-50之间的值。不同于PCA和LDAt-SNE的坐标轴没有明确的数学含义。4. 性能对比与结果分析为量化比较各方法的有效性我们使用SVM分类器在测试集上评估不同特征处理后的模型性能。4.1 评估指标设计def evaluate_method(method, X_train, X_test, y_train, y_test): 评估特征处理方法 # 训练SVM分类器 svm SVC(kernellinear, C1) svm.fit(X_train, y_train) # 计算准确率和训练时间 start time.time() y_pred svm.predict(X_test) elapsed time.time() - start return { accuracy: accuracy_score(y_test, y_pred), time: elapsed, dim: X_train.shape[1] }4.2 综合对比结果我们构建如下对比实验results [] # 原始特征 results.append({ method: Original, **evaluate_method(original, X_train, X_test, y_train, y_test) }) # MIC特征选择 mic_mask mic_scores np.median(mic_scores) X_mic_train X_train[:, mic_mask] X_mic_test X_test[:, mic_mask] results.append({ method: MIC, **evaluate_method(mic, X_mic_train, X_mic_test, y_train, y_test) }) # mRMR特征选择 X_mrmr_train X_train[:, mrmr_features] X_mrmr_test X_test[:, mrmr_features] results.append({ method: mRMR, **evaluate_method(mrmr, X_mrmr_train, X_mrmr_test, y_train, y_test) }) # PCA降维 results.append({ method: PCA, **evaluate_method(pca, X_pca, pca.transform(X_test), y_train, y_test) }) # LDA降维 results.append({ method: LDA, **evaluate_method(lda, X_lda, lda.transform(X_test), y_train, y_test) })性能对比表格方法准确率训练时间(ms)特征维度原始特征97.8%2.14MIC选择95.6%1.82mRMR选择97.8%1.72PCA降维93.3%1.52LDA降维100%1.624.3 技术选型建议根据实验结果我们可以得出以下实践建议分类任务优先考虑LDA在标签信息可靠的情况下LDA能最大化类别区分度本实验中LDA将准确率提升至100%同时减少一半特征量无监督场景使用PCA当缺乏标签或探索数据结构时PCA是最安全的默认选择虽然准确率略低但保留了95.8%的原始信息特征选择适用场景需要保持特征可解释性时选择mRMR计算资源极度受限时MIC提供快速筛选方案t-SNE的特殊价值不适合直接用于建模但可视化效果最佳能揭示PCA/LDA未能发现的局部数据结构5. 进阶技巧与优化方向在基础实验之外这些方法还有更多值得探索的优化空间5.1 参数调优策略# PCA维度选择 pca PCA(n_components0.95) # 保留95%方差 # t-SNE参数优化 tsne TSNE( n_components2, perplexity30, # 适合中等规模数据集 early_exaggeration12, learning_rateauto ) # mRMR特征数确定 from sklearn.feature_selection import RFECV selector RFECV(SVC(kernellinear), step1, cv5) selector.fit(X, y) optimal_num_features selector.n_features_5.2 方法组合实践# PCA 特征选择组合 pca PCA(n_components4) X_pca_full pca.fit_transform(X_train) mic_scores_pca calculate_mic(X_pca_full, y_train) pca_mic_mask mic_scores_pca np.median(mic_scores_pca) # LDA t-SNE可视化 X_lda_3d LDA(n_components3).fit_transform(X_train, y_train) X_tsne_lda TSNE().fit_transform(X_lda_3d)5.3 其他评估指标除准确率外还可考虑特征稳定性通过bootstrap采样评估选择结果的鲁棒性模型复杂度如SVM的支撑向量数量业务指标如医疗场景中的敏感度/特异度在真实项目中我发现特征工程的选择往往需要平衡技术指标与业务需求。例如在医疗影像分析中即使LDA性能略优有时也会选择PCA以保持结果的可解释性。