2025/10/31日 每日总结 机器学习综合实战:6大经典算法横向对比,揭秘Iris分类最优解

机器学习综合实战:6大经典算法横向对比,揭秘Iris分类最优解

经过前面五次单独算法实战(逻辑回归、C4.5决策树、SVM、BP神经网络等),这次终于迎来综合对比实验!我将所有训练过的模型放在同一基准下,通过五折交叉验证、多指标评估、可视化分析,全面对比它们在Iris数据集上的表现,最终找出最优模型。这篇笔记整理了完整的对比流程、关键结论和实战心得,适合想系统选择算法的小伙伴~

一、实验核心目标

  1. 横向对比6大经典分类算法:逻辑回归、C4.5决策树、随机森林、SVM(SMO)、K近邻、BP神经网络

  2. 统一评估标准:五折交叉验证+多指标(准确率、精度、召回率、F1值、AUC)

  3. 分析各算法的优缺点及适用场景

  4. 总结机器学习模型选择的通用思路

  5. 验证特征工程对不同算法的性能提升效果

二、参与对比的算法清单

算法名称 核心原理 关键优势 调优重点
逻辑回归 对数几率映射+线性分类 训练快、可解释性强、输出概率 正则化强度C、求解器solver
C4.5决策树 信息增益比分裂+剪枝 决策逻辑直观、无需特征缩放 树深度、剪枝参数、最小样本数
随机森林 集成多棵决策树+投票机制 泛化能力强、抗过拟合 树数量、树深度、特征采样比例
SVM(SMO) 最大间隔分类+核函数映射 小样本、高维数据表现优 核函数类型、正则化C、gamma参数
K近邻(KNN) 基于距离的惰性学习 无需训练、实现简单 近邻数k、距离度量方式
BP神经网络 反向传播+梯度下降 非线性拟合能力强 隐藏层结构、激活函数、学习率

三、统一实验基准

为了保证对比公平性,所有算法采用相同的实验设置:

  1. 数据集:Iris完整数据集(150样本,4个原始特征+6个构造特征)

  2. 数据预处理:特征标准化+递归特征消除(保留6个最优特征)

  3. 评估方法:五折交叉验证(shuffle=True,random_state=42)

  4. 评估指标:准确率、加权精确率、加权召回率、加权F1值、AUC(二分类转换)

  5. 超参数调优:每种算法均通过随机搜索优化关键参数(统一参数搜索空间)

四、核心实验流程

1. 数据预处理与特征工程

def preprocess_data():
"""统一数据预处理流程"""
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
feature_names = iris.feature_names

特征工程(与之前实验一致)

fe = IrisFeatureEngineering()
df = pd.DataFrame(X, columns=feature_names)
df_engineered = fe.construct_features(df) # 构造花瓣面积、比率等特征
X_engineered = df_engineered.select_dtypes(include=[np.number]).values
fe.feature_names = df_engineered.select_dtypes(include=[np.number]).columns.tolist()

特征选择(保留6个最优特征)

X_selected, selected_features = fe.select_features(X_engineered, y, k=6)

特征标准化

scaler = StandardScaler()
X_final = scaler.fit_transform(X_selected)

return X_final, y, selected_features, iris.target_names

### 2. 算法初始化与优化
```python
def init_models():
 """初始化所有对比算法(基础配置)"""
 models = {
 "逻辑回归": LogisticRegression(random_state=42, max_iter=1000),
 "C4.5决策树": DecisionTreeClassifier(criterion='entropy', random_state=42),
 "随机森林": RandomForestClassifier(n_estimators=100, random_state=42),
 "SMO(SVM)": SVC(kernel='rbf', probability=True, random_state=42),
 "K近邻": KNeighborsClassifier(),
 "BP神经网络": MLPClassifier(hidden_layer_sizes=(100,50), random_state=42, max_iter=500)
 }
 return models
def optimize_all_models(models, X, y):
 """统一超参数优化(随机搜索)"""
 optimized_models = {}
 optimizer = ModelOptimizer() # 自定义优化器类

for name, model in models.items():
 print(f"\n🔧 优化 {name}...")
 optimized_model = optimizer.optimize_model(model, name, X, y)
 optimized_models[name] = optimized_model
 print(f"✅ {name} 优化完成")

return optimized_models

3. 统一评估与对比

def comprehensive_evaluation(optimized_models, X, y, target_names):
 """统一评估所有模型,返回多指标结果"""
 evaluator = AdvancedEvaluator() # 自定义评估器类
 results = []

for name, model in optimized_models.items():
 print(f"\n" + "="*60)
 print(f"📊 评估 {name}")
 print("="*60)

# 五折交叉验证评估
 metrics, fold_details, auc_score = evaluator.evaluate_model_comprehensive(
 model, X, y, target_names, name
 )

# 存储结果
 results.append({
 "模型名称": name,
 "准确率": metrics['accuracy'],
 "精确率": metrics['precision'],
 "召回率": metrics['recall'],
 "F1值": metrics['f1'],
 "AUC": auc_score,
 "训练时间": fold_details['training_time'].mean() # 平均训练时间
 })

# 转换为DataFrame便于分析
 results_df = pd.DataFrame(results)
 return results_df.sort_values("准确率", ascending=False)

4. 可视化对比分析

def visualize_comparison(results_df):
 """可视化所有模型的性能对比"""
 # 设置中文字体
 plt.rcParams['font.sans-serif'] = ['SimHei']
 plt.rcParams['axes.unicode_minus'] = False

# 1. 多指标雷达图
 fig = plt.figure(figsize=(12, 8))
 ax = fig.add_subplot(111, projection='polar')

# 指标与角度
 metrics = ['准确率', '精确率', '召回率', 'F1值', 'AUC']
 angles = np.linspace(0, 2*np.pi, len(metrics), endpoint=False).tolist()
 angles += angles[:1] # 闭合雷达图

# 绘制每个模型
 colors = plt.cm.Set3(np.linspace(0, 1, len(results_df)))
 for idx, row in results_df.iterrows():
 values = [row[metric] for metric in metrics]
 values += values[:1] # 闭合数据
 ax.plot(angles, values, 'o-', linewidth=2, label=row['模型名称'], color=colors[idx])
 ax.fill(angles, values, alpha=0.1, color=colors[idx])

ax.set_xticks(angles[:-1])
 ax.set_xticklabels(metrics)
 ax.set_ylim(0.85, 1.0)
 ax.set_title('6大算法多指标对比雷达图', fontsize=16, pad=20)
 ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))
 ax.grid(True)
 plt.tight_layout()
 plt.savefig('algorithm_radar_chart.png', dpi=300, bbox_inches='tight')
 plt.show()

# 2. 准确率与训练时间对比
 fig, ax1 = plt.subplots(figsize=(10, 6))

# 准确率柱状图
 x = range(len(results_df))
 bars = ax1.bar(x, results_df['准确率'], alpha=0.7, color='skyblue', label='准确率')
 ax1.set_xlabel('模型')
 ax1.set_ylabel('准确率', color='blue')
 ax1.tick_params(axis='y', labelcolor='blue')
 ax1.set_xticks(x)
 ax1.set_xticklabels(results_df['模型名称'], rotation=45, ha='right')
 ax1.set_ylim(0.94, 0.99)

# 训练时间折线图
 ax2 = ax1.twinx()
 ax2.plot(x, results_df['训练时间'], 'ro-', linewidth=2, label='平均训练时间(秒)')
 ax2.set_ylabel('训练时间(秒)', color='red')
 ax2.tick_params(axis='y', labelcolor='red')

# 添加数值标签
 for i, bar in enumerate(bars):
 height = bar.get_height()
 ax1.text(bar.get_x() + bar.get_width()/2., height + 0.001,
 f'{height:.4f}', ha='center', va='bottom', fontsize=9)

fig.tight_layout()
 plt.title('准确率与训练时间对比', fontsize=14)
 plt.savefig('accuracy_time_comparison.png', dpi=300, bbox_inches='tight')
 plt.show()

五、实验关键结果

1. 算法性能排名(按准确率排序)

模型名称 准确率 精确率 召回率 F1值 AUC 平均训练时间(秒)
K近邻 0.9800 0.9801 0.9800 0.9800 0.9985 0.02
逻辑回归 0.9733 0.9738 0.9733 0.9733 0.9989 0.05
SMO(SVM) 0.9733 0.9738 0.9733 0.9733 0.9984 0.03
随机森林 0.9667 0.9668 0.9667 0.9667 0.9973 0.80
BP神经网络 0.9600 0.9625 0.9600 0.9600 0.9960 1.20
C4.5决策树 0.9533 0.9587 0.9533 0.9532 0.9700 0.02

2. 关键发现

  • K近邻意外夺冠:准确率98%,训练时间仅0.02秒,因Iris数据集样本分布均匀、特征区分度高,K近邻的距离度量能完美捕捉类别边界

  • 逻辑回归与SVM并列第二:准确率97.33%,逻辑回归训练更快,SVM泛化能力更强

  • 随机森林表现稳健:虽未夺冠,但各指标均衡,抗过拟合能力突出

  • BP神经网络未达预期:在简单数据集上优势不明显,且训练时间最长(1.2秒),体现了"大材小用"的特点

  • C4.5决策树表现最差:单一决策树泛化能力有限,集成后的随机森林性能明显提升

    3. 特征工程影响

    所有算法在"原始特征+构造特征"的组合下,性能比仅用原始特征提升3%-5%,其中逻辑回归和SVM的提升最显著,验证了特征工程的通用性价值。

    六、算法优缺点与适用场景总结

    1. 各算法核心对比

    算法 优点 缺点 适用场景
    K近邻 无需训练、实现简单、速度快 对高维数据敏感、距离度量依赖特征缩放 小样本、低维、类别边界清晰的数据
    逻辑回归 训练快、可解释性强、输出概率 仅适用于线性可分数据 二分类/多分类基线模型、需要概率输出的场景
    SMO(SVM) 小样本/高维数据表现优、泛化能力强 训练慢、参数调优复杂、可解释性差 文本分类、小样本高维数据
    随机森林 抗过拟合、鲁棒性强、无需特征缩放 训练时间较长、决策逻辑不透明 复杂数据、工业级应用、需要高稳定性的场景
    BP神经网络 非线性拟合能力强、自适应特征 训练慢、易过拟合、调参复杂 图像识别、语音处理、复杂非线性数据
    C4.5决策树 可解释性强、决策逻辑直观 易过拟合、稳定性差 规则提取、需要解释决策过程的场景(如医疗、风控)

    2. 模型选择通用思路

  1. 先简单后复杂:优先尝试逻辑回归、K近邻等简单模型作为基线,再根据性能提升需求选择复杂模型

  2. 看数据特性

  • 线性可分、低维数据:逻辑回归
  • 小样本、高维数据:SVM
  • 复杂非线性数据:随机森林/BP神经网络
  • 需要解释性:决策树/逻辑回归
  1. 平衡性能与成本:K近邻虽在Iris上表现最优,但在高维数据上性能会下降;随机森林虽训练慢,但稳定性更适合实际应用

七、综合实战心得

  1. 没有绝对最优的算法,只有最适配的数据:K近邻在Iris上夺冠不代表它是"万能算法",换个高维或类别不平衡数据集,结果可能完全不同

  2. 基线模型很重要:逻辑回归作为基线,能快速判断数据的线性可分程度,为后续算法选择提供参考

  3. 特征工程比算法选择更重要:所有算法在优化特征后性能均有提升,良好的特征能让简单算法达到复杂算法的效果

  4. 超参数调优不能少:同一算法在不同参数下性能差异可达5%-10%,合理调优是发挥算法潜力的关键

  5. 多指标评估更全面:单一准确率可能误导判断,结合精确率、召回率、AUC才能全面评估模型性能
    经过这次综合对比,我对6大经典算法的适用场景有了更清晰的认知。后续在实际项目中,我会先通过简单模型快速搭建基线,再根据数据特性和业务需求(如是否需要可解释性、实时性)选择合适的算法,最后通过特征工程和超参数调优进一步提升性能~

posted @ 2025-12-29 14:46  Moonbeamsc  阅读(3)  评论(0)    收藏  举报
返回顶端