十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从Iris数据集入门:LibSVM与决策树分类模型实战对比

从Iris数据集入门:LibSVM与决策树分类模型实战对比 1. 项目概述从经典数据集到实战模型如果你刚开始接触机器学习或者想找一个既经典又全面的练手项目那么“LibSVM与鸢尾花Iris数据集”的组合绝对是一个绕不开的起点。这个项目听起来可能有些“老生常谈”但恰恰是这种经典性让它成为了检验一个算法库是否易用、一个模型原理是否扎实的绝佳试金石。我最初接触机器学习时也是从这个项目入手它帮我理清了从数据加载、预处理、模型训练到评估的完整流程更重要的是它让我直观地理解了像决策树这类模型是如何“看”数据的。简单来说这个项目的核心就是我们有一个著名的鸢尾花Iris数据集里面包含了三种鸢尾花山鸢尾、变色鸢尾、维吉尼亚鸢尾的150个样本每个样本有4个特征萼片长度、萼片宽度、花瓣长度、花瓣宽度。我们的任务是利用LibSVM这个强大的支持向量机库或者决策树算法来构建一个分类模型让机器学会根据这4个特征来区分这三种花。你可能会问为什么用LibSVM还要提决策树这里其实点出了机器学习实践中的一个关键工具与算法的分离与结合。LibSVM是一个实现SVM支持向量机算法的工具库而决策树是另一种算法。在实际项目中我们常常会用同一个数据集去测试、对比不同算法的表现。因此这个标题可以理解为使用Iris数据集来分别实践和对比LibSVMSVM算法和决策树这两种分类模型。Iris数据集之所以经典是因为它数据量适中、特征维度低、类别清晰非常适合可视化理解。而LibSVM则是台湾大学林智仁教授开发的一个简单、快速且有效的SVM模式识别与回归的软件包它的接口清晰文档丰富是学习SVM原理和应用的“标准装备”。通过这个项目你不仅能学会如何使用一个专业的机器学习库更能深入理解分类任务的基本范式以及不同模型如线性的SVM与树状的决策树在处理数据时的内在逻辑差异。无论你是学生、算法工程师还是业务分析师这个项目都能为你打下坚实的实践基础。2. 核心思路与工具选型背后的考量当我们决定用Iris数据集来跑模型时首先面临的就是工具和算法的选择。标题中提到了LibSVM和决策树这并非随意组合背后有一套完整的实践逻辑。2.1 为什么是鸢尾花Iris数据集Iris数据集之于机器学习就像“Hello World”之于编程。它的价值在于“纯粹”和“直观”。150条样本4个数值特征3个类别数据干净几乎没有缺失值和异常值。这意味着我们可以将几乎全部精力集中在模型原理和实现过程上而不必在复杂的数据清洗环节耗费过多时间。对于初学者你可以轻松地用散点图将任意两个特征组合起来直观地看到不同类别花朵的分布情况甚至能肉眼看出一些线性可分或聚集的规律。这种直观性对于理解模型如何做决策至关重要。例如你会发现花瓣长度和宽度这两个特征几乎就能很好地区分三种花这暗示了特征选择的重要性。2.2 为什么选择LibSVMLibSVM在SVM领域有着里程碑式的地位。选择它主要基于以下几点考量权威与稳定由学术大牛开发并维护算法实现经过千锤百炼结果可靠常被作为基准工具在论文中使用。接口简单它提供了命令行、Python、Java、Matlab等多种接口。尤其是其Python接口通常通过sklearn的SVC类背后调用或直接使用libsvm的封装包几行代码就能完成核心训练和预测让初学者快速上手感受SVM的魅力。功能完整支持分类C-SVC, nu-SVC和回归epsilon-SVR, nu-SVR内核函数线性、多项式、径向基RBF、Sigmoid一应俱全。这让我们可以方便地对比线性核与多项式核标题热词中提到了“线性”和“多项式”在同一个数据集上的效果差异。清晰的输出训练后会输出模型文件里面包含了支持向量、系数等重要信息有助于理解SVM模型的内部构成。2.3 为什么同时提及决策树决策树是另一种完全不同的“白盒”模型。与SVM这种依赖于核函数和优化目标的“黑盒”尽管原理可解释但决策过程不易直观呈现相比决策树生成的规则如同一系列“if...else...”语句非常容易理解和可视化。将决策树与LibSVM/SVM放在一起实践形成了一个完美的对比学习场景模型原理对比SVM试图找到一个最优超平面来最大化类别间隔决策树则通过递归地选择最佳特征进行数据划分。复杂度对比SVM的模型复杂度受支持向量影响决策树的复杂度则体现在树的深度和节点数。结果可解释性对比决策树规则一目了然SVM特别是使用非线性核时的决策边界则更抽象。通过在同一数据集上运行两者你可以切身感受到对于Iris这种线性可分性较好的数据线性SVM和决策树可能都能达到很高的准确率但它们的决策方式、对数据分布的假设、以及对噪声的敏感度都截然不同。这种对比的实践价值远大于单独实现任何一个模型。注意在实际操作中我们通常不会直接用原始的LibSVM Python包而是使用Scikit-learnsklearn。因为sklearn.svm.SVC默认就是基于LibSVM的并且sklearn提供了完全一致的API能更好地与数据预处理、评估、决策树等其他模块集成。所以我们的“使用LibSVM”在代码层面往往等同于“使用sklearn的SVM模块”。3. 环境准备与数据初探工欲善其事必先利其器。在开始写第一行模型代码之前搭建一个清晰、可复现的环境是专业实践的第一步。3.1 基础环境搭建我强烈推荐使用Anaconda来管理Python环境它能很好地解决包依赖问题。创建一个专用于本项目的环境是个好习惯。# 创建一个新的conda环境命名为ml_basics conda create -n ml_basics python3.9 conda activate ml_basics # 安装核心科学计算和机器学习库 conda install numpy pandas matplotlib scipy # 安装scikit-learn它包含了我们需要的SVM基于LibSVM和决策树实现 conda install scikit-learn # 安装jupyter notebook或lab用于交互式编程和可视化可选但推荐 conda install jupyterlab如果你习惯用pip在激活环境后使用pip install numpy pandas matplotlib scikit-learn即可。确保你的sklearn版本在1.0以上以获得更稳定的API和功能。3.2 加载与审视Iris数据集sklearn内置了Iris数据集加载非常方便。但第一步永远不是直接丢给模型而是先“认识”你的数据。import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split # 加载数据集 iris datasets.load_iris() # 数据部分是一个numpy数组形状为(150, 4) X iris.data # 标签部分形状为(150,)取值0,1,2分别对应三种花 y iris.target # 特征名称 feature_names iris.feature_names # 类别名称 target_names iris.target_names print(f数据形状: {X.shape}) # 输出(150, 4) print(f特征名: {feature_names}) print(f类别名: {target_names}) print(f标签分布:\n{pd.Series(y).value_counts().to_dict()}) # 通常输出{0: 50, 1: 50, 2: 50}说明数据是平衡的3.3 数据可视化与直觉判断可视化是产生假设的关键。让我们画几个散点图看看。# 将数据转换为DataFrame便于查看 iris_df pd.DataFrame(X, columnsfeature_names) iris_df[species] y iris_df[species_name] [target_names[i] for i in y] # 绘制特征对之间的散点图矩阵 pd.plotting.scatter_matrix(iris_df.iloc[:, :4], figsize(12, 12), cy, markero, hist_kwds{bins: 20}, s60, alpha0.8) plt.suptitle(Iris Dataset Feature Scatter Matrix, y1.02, size16) plt.show()运行这段代码你会得到一个4x4的网格图。对角线是每个特征的直方图非对角线是两两特征的散点图。你的注意力应该立刻被“花瓣长度 (petal length)”和“花瓣宽度 (petal width)”这两个特征所吸引。在它们的散点图petal length (cm)vspetal width (cm)上三类花朵清晰地分成了三个簇。其中一类通常是setosa标签0完全与其他两类分离而另外两类versicolor和virginica标签1和2则有部分重叠。这个简单的观察告诉我们几个重要信息线性可分性setosa与其他两类很可能是线性可分的存在一条直线可以分开。而versicolor和virginica之间可能是线性不可分的或者需要一个非线性的边界。特征重要性花瓣相关的特征比萼片特征可能具有更强的判别能力。这暗示我们在做决策树时花瓣特征很可能出现在树的上层节点。模型选择预期对于这样的数据一个线性核的SVM可能已经能取得不错的效果但对于versicolor和virginica的区分多项式核或RBF核或许能带来提升。决策树则能自动地利用花瓣特征进行首要分割。实操心得在正式建模前花15分钟做数据可视化是性价比最高的投入。它不仅能帮你发现潜在的数据问题如异常点更能让你对模型的可能表现和挑战有一个直觉上的预判。这个预判会成为你后续调参和结果分析时的重要参照。4. 核心环节一使用LibSVMsklearn SVM进行建模现在我们开始进入核心的建模环节。我们将使用sklearn中的SVC类它是对LibSVM的封装。我们会尝试线性核与多项式核并与热词对应。4.1 数据分割与标准化首先我们需要将数据分为训练集和测试集以评估模型的泛化能力。对于SVM特别是使用基于距离的核函数如RBF、多项式时对特征进行标准化Standardization是一个好习惯这能使所有特征处于同一量纲避免某个大数值特征主导模型。from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # 分割数据集80%训练20%测试设置随机种子确保结果可复现 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42, stratifyy) # 初始化标准化器分别拟合训练集并转换训练集和测试集 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) # fit_transform: 计算训练集的均值和标准差然后应用转换 X_test_scaled scaler.transform(X_test) # transform: 使用训练集计算出的均值和标准差来转换测试集 print(f训练集大小: {X_train_scaled.shape}) print(f测试集大小: {X_test_scaled.shape})4.2 线性核SVM模型训练与评估我们先从最简单的线性核开始。线性核的SVM试图找到一个超平面来分割数据它对应于原始特征空间中的线性决策边界。from sklearn.svm import SVC from sklearn.metrics import classification_report, confusion_matrix, accuracy_score # 创建线性SVM分类器C是正则化参数这里先使用默认值1.0 linear_svm SVC(kernellinear, C1.0, random_state42) # 在标准化后的训练数据上训练模型 linear_svm.fit(X_train_scaled, y_train) # 在测试集上进行预测 y_pred_linear linear_svm.predict(X_test_scaled) # 评估模型性能 accuracy_linear accuracy_score(y_test, y_pred_linear) print(f线性SVM测试集准确率: {accuracy_linear:.4f}) print(\n分类报告:) print(classification_report(y_test, y_pred_linear, target_namestarget_names)) print(\n混淆矩阵:) print(confusion_matrix(y_test, y_pred_linear))对于Iris数据集线性SVM通常能取得很高的准确率常在0.95以上。分类报告会展示每个类别的精确率precision、召回率recall和F1-score混淆矩阵则能直观地看到哪些类别被错误分类。如果versicolor和virginica有误判是符合我们之前可视化观察的预期的。4.3 多项式核SVM模型训练与评估接下来我们尝试多项式核。多项式核能将数据映射到更高维的特征空间从而拟合更复杂的非线性决策边界。它有两个主要参数degree多项式次数和coef0独立项系数。# 创建多项式核SVM分类器这里尝试2次多项式 poly_svm SVC(kernelpoly, degree2, C1.0, coef01, random_state42) poly_svm.fit(X_train_scaled, y_train) y_pred_poly poly_svm.predict(X_test_scaled) accuracy_poly accuracy_score(y_test, y_pred_poly) print(f多项式核(degree2) SVM测试集准确率: {accuracy_poly:.4f}) print(\n分类报告:) print(classification_report(y_test, y_pred_poly, target_namestarget_names))你可以尝试调整degree例如34和coef0观察模型性能的变化。对于Iris数据由于本身维度低且线性可分性较好多项式核可能不会比线性核有显著提升甚至可能因为模型过于复杂特别是高次多项式在少量数据上产生过拟合。但这正是实践的意义亲自验证一个直觉——并非更复杂的模型一定带来更好的效果。4.4 关键参数解析与调优思路SVM有几个核心参数需要理解C (正则化参数): 惩罚系数即对误分类的容忍度。C值越大模型越倾向于尽可能正确分类所有训练样本可能导致过拟合决策边界变得复杂C值越小则允许更多的误分类决策边界更平滑可能欠拟合。通常通过网格搜索GridSearchCV来寻找最优值。kernel (核函数): 除了linear和poly还有rbf径向基函数最常用和sigmoid。rbf核通过高斯函数将样本映射到无限维空间能力很强是默认选项。gamma (仅用于rbf,poly,sigmoid): 定义了单个训练样本的影响范围。gamma值越大影响范围越小决策边界越曲折容易过拟合gamma值越小影响范围越大决策边界越平滑。通常设为scale默认1/(n_features * X.var())或auto1/n_features。一个简单的调优示例使用网格搜索from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid { C: [0.1, 1, 10, 100], gamma: [scale, auto, 0.1, 1], kernel: [rbf, poly, linear] } # 创建网格搜索对象使用5折交叉验证 grid_search GridSearchCV(SVC(random_state42), param_grid, cv5, scoringaccuracy, n_jobs-1) grid_search.fit(X_train_scaled, y_train) print(f最佳参数: {grid_search.best_params_}) print(f最佳交叉验证分数: {grid_search.best_score_:.4f}) # 用最佳模型在测试集上评估 best_svm grid_search.best_estimator_ y_pred_best best_svm.predict(X_test_scaled) print(f测试集准确率: {accuracy_score(y_test, y_pred_best):.4f})注意事项对于小数据集如Iris交叉验证CV是必不可少的评估手段可以更稳健地估计模型性能避免因单次数据分割的偶然性导致结论偏差。网格搜索虽然能自动寻找较优参数但计算成本随参数组合数增加而指数增长。在Iris上可以快速完成但在大数据集上需要谨慎设计参数范围。5. 核心环节二决策树模型构建与深度解析现在我们把目光转向决策树。决策树的魅力在于其直观性。我们将使用sklearn.tree.DecisionTreeClassifier。5.1 决策树模型训练与基础评估决策树不需要对数据进行标准化因为它是基于特征阈值做划分不受量纲影响但为了与SVM对比公平我们依然使用相同的训练集和测试集分割。from sklearn.tree import DecisionTreeClassifier, plot_tree # 创建决策树分类器设置随机种子确保可复现性并限制树的最大深度便于可视化 tree_clf DecisionTreeClassifier(max_depth3, random_state42) tree_clf.fit(X_train, y_train) # 注意这里使用未标准化的原始数据X_train y_pred_tree tree_clf.predict(X_test) accuracy_tree accuracy_score(y_test, y_pred_tree) print(f决策树(最大深度3)测试集准确率: {accuracy_tree:.4f}) print(\n分类报告:) print(classification_report(y_test, y_pred_tree, target_namestarget_names))即使限制了最大深度为3决策树在Iris数据集上通常也能达到与SVM相媲美的准确率。这验证了我们之前的直觉花瓣特征具有极强的判别力。5.2 决策树可视化与规则解读决策树最大的优势是可解释性。我们可以将训练好的树可视化出来。plt.figure(figsize(16, 10)) # 绘制决策树 plot_tree(tree_clf, feature_namesfeature_names, class_namestarget_names, filledTrue, # 填充颜色表示类别 roundedTrue, fontsize12) plt.title(Decision Tree for Iris Classification (max_depth3), size16) plt.show()生成的树形图会清晰地展示决策路径。根节点第一个判断极有可能是基于“花瓣长度 (petal length)”或“花瓣宽度 (petal width)”的某个阈值。例如规则可能是“如果花瓣长度 2.45厘米则归类为山鸢尾setosa”。这个阈值2.45就是模型从数据中学到的。然后在剩下的样本中树会继续选择其他特征可能是花瓣宽度或其他进行划分直到达到最大深度或满足其他停止条件。通过查看feature_importances_属性我们可以量化每个特征的重要性。importances tree_clf.feature_importances_ indices np.argsort(importances)[::-1] # 按重要性降序排列 print(特征重要性排序:) for i in indices: print(f{feature_names[i]}: {importances[i]:.4f})不出意外的话“花瓣长度”和“花瓣宽度”会占据最重要的前两位而萼片特征的重要性较低。这与我们散点图观察到的结论一致。5.3 决策树的关键参数与剪枝决策树容易过拟合即生成一棵非常深、节点非常多的树完美记忆训练数据但对新数据预测很差。控制过拟合的关键是剪枝在sklearn中主要通过以下参数实现max_depth: 树的最大深度。这是最常用的预剪枝参数限制树的生长。min_samples_split: 一个节点至少需要多少个样本才能继续分裂。增大此值可以防止树对局部小样本过拟合。min_samples_leaf: 一个叶节点至少需要多少个样本。同样增大此值有平滑模型的效果。max_features: 寻找最佳分割时考虑的最大特征数。可以设置为sqrt(n_features)或log2这是随机森林的思想能增加树的多样性。我们可以通过网格搜索来优化这些参数tree_param_grid { max_depth: [2, 3, 4, 5, None], # None表示不限制深度 min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4], criterion: [gini, entropy] # 分裂标准基尼不纯度或信息增益 } tree_grid_search GridSearchCV(DecisionTreeClassifier(random_state42), tree_param_grid, cv5, scoringaccuracy, n_jobs-1) tree_grid_search.fit(X_train, y_train) print(f决策树最佳参数: {tree_grid_search.best_params_}) print(f决策树最佳交叉验证分数: {tree_grid_search.best_score_:.4f})实操心得对于决策树我个人的习惯是先设置一个合理的max_depth比如3-5来快速得到一个可解释的模型观察其规则是否符合业务直觉。然后再进行更细致的网格搜索调优。永远不要盲目使用不加限制的决策树max_depthNone那几乎必然导致过拟合尤其是在特征不多但样本量不大的情况下。6. 模型对比与决策边界可视化我们已经训练了线性SVM、多项式SVM和决策树。是时候将它们放在一起对比并从几何视角直观感受它们的决策边界了。6.1 性能指标对比我们可以用一个简单的表格来汇总模型在测试集上的表现模型核函数/参数测试集准确率备注支持向量机 (SVM)线性核 (linear)~0.97简单高效决策边界是超平面支持向量机 (SVM)多项式核 (poly, degree2)~0.97可能略优或持平于线性核支持向量机 (SVM)网格搜索最优参数 (如rbf)~1.00通过调参可能达到完美分类决策树 (Decision Tree)max_depth3~0.97规则清晰易于解释决策树 (Decision Tree)网格搜索最优参数~0.97-1.00通过剪枝优化泛化能力6.2 决策边界可视化由于我们的数据是四维的无法直接绘制完整的决策边界。但我们可以选取两个最重要的特征如花瓣长度和花瓣宽度来绘制在二维平面上的决策区域这能给我们一个直观的印象。def plot_decision_boundary(clf, X, y, title, feature_idx(2, 3)): 绘制分类器的决策边界基于两个特征 clf: 训练好的分类器 X: 原始特征数据 y: 标签 title: 图表标题 feature_idx: 用于绘制的两个特征的索引默认为(2,3)即花瓣长度和宽度 # 创建网格点 x0s np.linspace(X[:, feature_idx[0]].min()-0.5, X[:, feature_idx[0]].max()0.5, 200) x1s np.linspace(X[:, feature_idx[1]].min()-0.5, X[:, feature_idx[1]].max()0.5, 200) x0, x1 np.meshgrid(x0s, x1s) # 构造用于预测的“假”数据只有我们选中的两个特征有值其他特征用训练集均值填充 X_fake np.array([X.mean(axis0)] * (200*200)) # 形状 (40000, 4) X_fake[:, feature_idx[0]] x0.ravel() X_fake[:, feature_idx[1]] x1.ravel() # 预测网格上每一点的类别 y_pred clf.predict(X_fake).reshape(x0.shape) # 绘制决策区域 plt.figure(figsize(10, 8)) from matplotlib.colors import ListedColormap custom_cmap ListedColormap([#FFAAAA, #AAFFAA, #AAAAFF]) plt.contourf(x0, x1, y_pred, alpha0.3, cmapcustom_cmap) # 绘制原始数据点 for i, target_name in enumerate(target_names): plt.scatter(X[yi, feature_idx[0]], X[yi, feature_idx[1]], labeltarget_name, edgecolork, s60) plt.xlabel(feature_names[feature_idx[0]]) plt.ylabel(feature_names[feature_idx[1]]) plt.title(title) plt.legend() plt.show() # 为线性SVM绘制决策边界注意需要传入未标准化的数据因为绘图基于原始特征空间 # 但我们的线性SVM是在标准化数据上训练的所以我们需要一个“适配”的管道或使用标准化后的数据绘图更复杂。 # 为了简化我们重新训练一个在原始数据上或仅对绘图特征标准化的线性SVM或者直接使用之前训练的模型并调整绘图函数。 # 这里我们采用一个更清晰的方案使用未标准化的数据重新训练一个用于可视化的模型仅用于演示边界形状。 linear_svm_for_plot SVC(kernellinear, C1.0, random_state42).fit(X_train[:, [2,3]], y_train) plot_decision_boundary(linear_svm_for_plot, X_train[:, [2,3]], y_train, Linear SVM Decision Boundary (on Petal Features)) # 为决策树绘制决策边界决策树不需要标准化直接用原始数据 tree_for_plot DecisionTreeClassifier(max_depth3, random_state42).fit(X_train[:, [2,3]], y_train) plot_decision_boundary(tree_for_plot, X_train[:, [2,3]], y_train, Decision Tree Decision Boundary (max_depth3, on Petal Features))观察生成的图像你会发现线性SVM的决策边界是直线在二维平面是直线高维是超平面它试图在两类之间划出一条最宽的“街道”。决策树的决策边界是由一系列平行于坐标轴的直线组成的阶梯状区域这是因为它的每次划分都是基于单个特征的阈值。当max_depth较小时边界是矩形的深度越大矩形区域划分得越细碎。这种可视化能让你深刻理解“线性模型”和“基于树的分段常数模型”在几何上的根本区别。7. 常见问题、排查技巧与经验实录在实际操作中你可能会遇到一些典型问题。下面是我在多次实践中总结的一些排查思路和技巧。7.1 模型准确率始终为1.0或极高是否过拟合在Iris这种简单数据集上模型在测试集上达到100%准确率是可能的尤其是经过调优后。但为了诊断过拟合必须使用交叉验证。如果训练集的交叉验证分数比如5折交叉验证的平均分也接近1.0且与测试集分数相差无几例如CV分数0.98测试集0.97那么过拟合风险较低。如果训练集分数远高于测试集分数例如训练集1.0测试集0.85那就是明显的过拟合。对于决策树可以通过观察max_depthNone时的表现来验证不加限制的树在训练集上通常能到1.0但在测试集上可能会下降。7.2 SVM模型训练速度慢怎么办对于大数据集SVM的训练复杂度可能很高。可以尝试以下方法缩放数据务必进行标准化这对基于距离的核函数如RBF至关重要。调整核函数线性核kernellinear通常比RBF核快得多。如果数据近似线性可分优先尝试线性核。调整参数增大C值会使训练变慢因为模型更倾向于使用更多支持向量。可以尝试较小的C。使用线性SVM专用类sklearn提供了LinearSVC类它针对线性核进行了优化通常比SVC(kernellinear)更快尤其是在大数据集上。减少训练数据如果数据量极大可以考虑使用随机子采样但会损失信息。7.3 决策树的可视化图太混乱看不清怎么办如果树太深太大图形会变得无法阅读。限制深度在训练时设置max_depth如3,4,5。导出文本规则使用sklearn.tree.export_text函数将树以文本形式导出更适合深度较大的树。from sklearn.tree import export_text tree_rules export_text(tree_clf, feature_namesfeature_names.tolist()) print(tree_rules)使用图形化工具对于更复杂的树可以考虑使用graphviz库生成更清晰的矢量图并可以手动调整布局。7.4 如何为SVM选择核函数这是一个经验与实验结合的过程优先尝试RBF核它是万能核适用于大多数情况尤其是当你对数据分布没有先验知识时。从kernelrbf开始调参C和gamma。数据维度高、样本量大时尝试线性核如果特征数量成千上万远大于样本数量线性核往往效果不错且速度快。文本分类是典型场景。有明显多项式关系时尝试多项式核如果你有先验知识认为特征间存在多项式关系如物理公式可以尝试。但通常RBF核更灵活。一个实用的流程先用线性核和RBF核跑一个基线如果线性核效果接近RBF就选择更简单、更快的线性模型。如果RBF核明显更好就继续优化它的参数。7.5 特征重要性显示某个特征为0是不是可以删除在决策树中如果某个特征的feature_importance_为0意味着在当前参数设置下该特征没有被选中用于任何节点的分裂。这可能意味着该特征在当前数据集中提供的区分信息与其他特征高度冗余或者其单独的分辨能力很弱。但是不能仅凭此就武断删除因为特征重要性依赖于模型和参数。换一个max_depth或者用随机森林重要性可能会变。该特征可能与目标变量存在复杂的非线性关系而单棵决策树未能捕捉。在业务上该特征可能具有特殊意义。正确的做法是将其作为一个线索结合领域知识并通过模型对比实验比如去掉该特征后重新训练看模型性能是否下降来最终决定。7.6 随机种子random_state的作用在sklearn中很多算法如train_test_split,SVC当probabilityTrue时,DecisionTreeClassifier都有random_state参数。设置一个固定的值如42可以确保每次运行代码时数据分割的顺序、算法内部的随机初始化如决策树寻找最优分裂时的特征子集抽样是相同的从而得到完全可复现的结果。这在分享代码、调试和对比实验时至关重要。但在生产环境或最终报告时可能需要多次运行取平均以消除随机性的影响。踩过几次坑之后我最大的体会是机器学习项目成功的关键往往不在于使用最炫酷的模型而在于对数据的深刻理解、严谨的实验流程训练/验证/测试集划分、交叉验证以及合理解读模型结果的能力。Iris项目虽小却完整地包含了所有这些要素。当你能够清晰地向别人解释为什么在这个数据集上线性SVM和深度为3的决策树表现差不多以及它们各自的决策边界长什么样时你就已经迈出了从“调包侠”到“明白人”的关键一步。这个项目就像一个罗塞塔石碑帮你打通了工具使用、算法原理和结果分析之间的语言障碍。下次遇到更复杂的数据时你会自然而然地沿用这套“数据探索-基线模型-对比实验-调优评估”的流程这才是本项目带给你的最大价值。
返回列表