首页/新闻资讯/正文详情

Python Machine Learning 第3章实战:使用 Scikit-Learn 完成分类算法全景巡礼

发布时间:2026/9/23 1:39:28 来源:云帆数科 栏目:资讯中心
Python Machine Learning 第3章实战:使用 Scikit-Learn 完成分类算法全景巡礼
Python Machine Learning 第3章实战使用 Scikit-Learn 完成分类算法全景巡礼【免费下载链接】python-machine-learning-bookThe Python Machine Learning (1st edition) book code repository and info resource项目地址: https://gitcode.com/gh_mirrors/py/python-machine-learning-book导读本文基于开源仓库python-machine-learning-book中第 3 章的代码与文档code/ch03/README.md、code/ch03/ch03.ipynb编写。本章围绕用 scikit-learn 训练机器学习分类器这一核心主题从感知机出发依次讲解逻辑回归、线性 SVM、核 SVM、决策树、随机森林与 K 近邻六类经典分类算法。读完本文你将掌握一套完整可复用的 Iris 分类实验流程数据加载、训练/测试集划分、特征标准化、决策区域可视化以及每种算法的核心参数调优与过拟合控制思路并能直接对照仓库中的 Jupyter Notebook 与可选 Python 脚本动手复现。本文所有代码均来源于 code/ch03/ch03.ipynb其可运行的合并脚本位于 code/optional-py-scripts/ch03.py决策树可视化产物见 code/ch03/tree.dot。1. 如何选择分类算法经验法则与本章路线图「Choosing a classification algorithm」是本章的起点不存在对所有问题都最优的万能分类器选择哪种算法取决于训练样本数量、特征维度、数据是否线性可分、对模型可解释性的要求以及训练/预测的时延预算。从源码结构看code/ch03/ch03.ipynb 的 91 个单元格54 个 Markdown 37 个代码单元格按以下路线循序渐进这也是本仓库第 3 章目录code/ch03/README.md给出的正式大纲算法核心思想适用场景感知机Perceptron线性决策边界 错误驱动学习线性可分数据的入门基线逻辑回归Logistic Regression用 sigmoid 建模类别概率需要概率输出、可解释性强的分类线性 SVM最大间隔超平面线性可分/近似可分数据核 SVM核技巧映射到高维空间非线性决策边界决策树递归划分、信息增益最大化可解释性优先、特征含义明确随机森林多棵决策树集成投票降低单树过拟合、提升鲁棒性K 近邻惰性学习、基于距离投票低维小样本、决策边界复杂本章全部实验统一使用Iris鸢尾花数据集它包含 3 个类别Iris-Setosa、Iris-Versicolor、Iris-Virginica与 4 个数值特征是 scikit-learn 内置的标准多分类基准数据便于不同算法在同一数据上横向对比。2. scikit-learn 第一步Iris 数据加载、划分与标准化本节对应源码中的 First steps with scikit-learn 部分是整个实验的公共数据管线后续所有算法都复用这套数据。2.1 加载数据集并选取特征仓库代码只取iris.data的第 3 列花瓣长度与第 4 列花瓣宽度作为特征X类别标签已由 scikit-learn 转换为整数0Iris-Setosa1Iris-Versicolor2Iris-Virginicafrom sklearn import datasets import numpy as np iris datasets.load_iris() X iris.data[:, [2, 3]] # petal length, petal width y iris.target print(Class labels:, np.unique(y)) # 输出: Class labels: [0 1 2]选取两个特征是为了能够在二维平面上可视化决策区域——这是本章贯穿始终的直观验证手段。2.2 划分训练集与测试集含 sklearn 0.18 兼容处理仓库代码用一个版本判断来兼容新旧版 scikit-learn0.18起train_test_split迁移到sklearn.model_selectionfrom distutils.version import LooseVersion as Version from sklearn import __version__ as sklearn_version if Version(sklearn_version) 0.18: from sklearn.cross_validation import train_test_split else: from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state0)test_size0.330% 的数据45 个样本见源码输出y_test.shape→(45,)留作测试集70% 用于训练random_state0固定随机种子保证每次运行得到相同划分便于复现书中结果。2.3 特征标准化为什么训练集和测试集必须用同一套参数标准化的目的是让不同量纲的特征统一到均值为 0、方差为 1 的尺度避免大数值特征在距离计算与梯度下降中主导学习。关键操作顺序是先用StandardScaler在训练集上fit仅计算均值与标准差再用同一套参数去transform训练集和测试集from sklearn.preprocessing import StandardScaler sc StandardScaler() sc.fit(X_train) # 只在训练集上估计 μ 和 σ X_train_std sc.transform(X_train) # 应用同一 μ、σ X_test_std sc.transform(X_test)从源码结构看后续感知机、逻辑回归、线性 SVM、核 SVM、KNN 全部使用标准化后的X_train_std / X_test_std而决策树与随机森林因为不依赖距离/梯度直接使用原始特征见 code/ch03/ch03.ipynb 的决策树、随机森林单元格。这一点提示了实用经验距离类与梯度类模型必须标准化树模型通常不必。3. 决策区域可视化辅助函数本章多次复用第二章定义的plot_decision_regions函数它把整个特征平面网格化后交给分类器预测用等高线填充色块表示决策区域同时叠加训练样本与测试样本from matplotlib.colors import ListedColormap import matplotlib.pyplot as plt import warnings def versiontuple(v): return tuple(map(int, (v.split(.)))) def plot_decision_regions(X, y, classifier, test_idxNone, resolution0.02): # setup marker generator and color map markers (s, x, o, ^, v) colors (red, blue, lightgreen, gray, cyan) cmap ListedColormap(colors[:len(np.unique(y))]) # plot the decision surface x1_min, x1_max X[:, 0].min() - 1, X[:, 0].max() 1 x2_min, x2_max X[:, 1].min() - 1, X[:, 1].max() 1 xx1, xx2 np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) Z classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) Z Z.reshape(xx1.shape) plt.contourf(xx1, xx2, Z, alpha0.4, cmapcmap) plt.xlim(xx1.min(), xx1.max()) plt.ylim(xx2.min(), xx2.max()) for idx, cl in enumerate(np.unique(y)): plt.scatter(xX[y cl, 0], yX[y cl, 1], alpha0.6, ccmap(idx), edgecolorblack, markermarkers[idx], labelcl) # highlight test samples if test_idx: if not versiontuple(np.__version__) versiontuple(1.9.0): X_test, y_test X[list(test_idx), :], y[list(test_idx)] warnings.warn(Please update to NumPy 1.9.0 or newer) else: X_test, y_test X[test_idx, :], y[test_idx] plt.scatter(X_test[:, 0], X_test[:, 1], c, alpha1.0, edgecolorblack, linewidths1, markero, s55, labeltest set)调用时通常先拼接训练与测试数据并用test_idxrange(105, 150)高亮测试样本X_combined_std np.vstack((X_train_std, X_test_std)) y_combined np.hstack((y_train, y_test))可视化函数是贯穿全章的仪表盘同一张图上决策区域的形状、边界的光滑程度、测试样本是否落入正确区域能直观反映每种算法的偏差-方差特性。4. 用 scikit-learn 训练感知机4.1 模型训练Perceptron是 scikit-learn 对第二章手写感知机的现成封装训练过程与手写版一致——逐样本错误驱动更新权重from sklearn.linear_model import Perceptron ppn Perceptron(n_iter40, eta00.1, random_state0) ppn.fit(X_train_std, y_train)n_iter40遍历训练集的轮数epochseta00.1学习率random_state0固定随机种子配合内部shuffleTrue保证可复现。4.2 评估仓库代码同时给出误分类样本数与准确率两种评估口径y_pred ppn.predict(X_test_std) print(Misclassified samples: %d % (y_test ! y_pred).sum()) # 输出: Misclassified samples: 4 from sklearn.metrics import accuracy_score print(Accuracy: %.2f % accuracy_score(y_test, y_pred)) # 输出: Accuracy: 0.91在 45 个测试样本上仅错 4 个准确率 91%对线性可分数据而言已经是不错的基线。绘制决策区域后可以看到感知机在 Iris 两个特征上的决策边界呈直线且收敛依赖数据严格线性可分——这是感知机的天然局限也自然引出下一节具备概率建模能力的逻辑回归。5. 用逻辑回归建模类别概率5.1 直觉与条件概率从净输入到 sigmoid逻辑回归的起点与 Adaline 相同对特征做加权求和得到净输入z w0 w1·x1 ... wm·xm但不再直接输出实数值而是将其送入sigmoid 函数φ(z) 1 / (1 e^(-z))把任意实数压缩到 (0, 1) 区间解释为类别 1 的条件概率 P(y1|x)import matplotlib.pyplot as plt import numpy as np def sigmoid(z): return 1.0 / (1.0 np.exp(-z)) z np.arange(-7, 7, 0.1) phi_z sigmoid(z) plt.plot(z, phi_z) plt.axvline(0.0, colork) plt.ylim(-0.1, 1.1) plt.xlabel(z) plt.ylabel($\phi (z)$) plt.yticks([0.0, 0.5, 1.0]) ax plt.gca() ax.yaxis.grid(True) plt.show()从源码结构看sigmoid 曲线是逻辑回归的原理基石当z0时φ(z)0.5对应决策边界z0时概率超过 0.5预测类别 1。上图中的 sigmoid 曲线即 code/ch03/ch03.ipynb 单元格 35 的运行结果与该章书籍配图03_03逻辑回归模型工作流程图净输入 → sigmoid 激活 → 量化器输出相互印证完整说明了逻辑回归将线性模型 概率输出结合的结构。5.2 逻辑代价函数为什么用对数似然而非平方误差逻辑回归不再使用平方误差而是采用基于最大似然估计的对数代价函数。仓库代码用两张代价曲线直观解释其动机def cost_1(z): return - np.log(sigmoid(z)) def cost_0(z): return - np.log(1 - sigmoid(z)) z np.arange(-10, 10, 0.1) phi_z sigmoid(z) c1 [cost_1(x) for x in z] plt.plot(phi_z, c1, labelJ(w) if y1) c0 [cost_0(x) for x in z] plt.plot(phi_z, c0, linestyle--, labelJ(w) if y0) plt.ylim(0.0, 5.1) plt.xlim([0, 1]) plt.xlabel($\phi$(z)) plt.ylabel(J(w)) plt.legend(locbest) plt.show()两张曲线都是凸的且单调当真实标签y1时若φ(z)→1预测正确且自信代价趋近 0若φ(z)→0严重误判代价趋近无穷从而对错误预测施加强烈惩罚。整个训练过程即通过梯度下降最小化这一代价函数来学习权重。5.3 用 scikit-learn 训练逻辑回归并预测概率from sklearn.linear_model import LogisticRegression lr LogisticRegression(C1000.0, random_state0) lr.fit(X_train_std, y_train) plot_decision_regions(X_combined_std, y_combined, classifierlr, test_idxrange(105, 150)) plt.xlabel(petal length [standardized]) plt.ylabel(petal width [standardized]) plt.legend(locupper left) plt.show()训练完成后可以用predict_proba查看每个测试样本的类别概率if Version(sklearn_version) 0.17: lr.predict_proba(X_test_std[0, :]) else: lr.predict_proba(X_test_std[0, :].reshape(1, -1))这段代码同样包含版本兼容分支旧版允许直接传入一维样本新版要求显式reshape(1, -1)成二维。C1000.0在这里取值较大意味着正则化强度较弱先观察几乎不约束的拟合效果为下一节的过拟合讨论做铺垫。5.4 用正则化缓解过拟合C 参数的权重路径实验过拟合的本质是模型对训练数据的噪声过度敏感、泛化能力下降。逻辑回归通过给代价函数添加 L2 惩罚项λ/2 · ‖w‖²来控制模型复杂度scikit-learn 用正则化强度的倒数C 1/λ暴露该控制旋钮C 越小正则化越强权重被压缩得越厉害。仓库代码用一个权重路径实验直观展示 C 的影响——遍历C 10^-5 ... 10^4记录每个 C 下类别 1Versicolor的两个特征系数weights, params [], [] for c in np.arange(-5., 5.): lr LogisticRegression(C10.**c, random_state0) lr.fit(X_train_std, y_train) weights.append(lr.coef_[1]) params.append(10**c) weights np.array(weights) plt.plot(params, weights[:, 0], labelpetal length) plt.plot(params, weights[:, 1], linestyle--, labelpetal width) plt.ylabel(weight coefficient) plt.xlabel(C) plt.legend(locupper left) plt.xscale(log) plt.show()实验结果对应书籍配图03_06的欠拟合 / 良好拟合 / 过拟合对比可以总结为C 值正则化强度权重幅值模型状态C 很小如 10⁻⁵极强趋近 0欠拟合高偏差边界过于简单C 适中如 10⁰适中适中良好拟合C 很大如 10³极弱较大过拟合高方差边界过度复杂调参经验C 是逻辑回归最重要的超参数实践中应结合交叉验证在10^-3 ~ 10^3的对数尺度上网格搜索而非直接取极值。本章在 code/ch06 的模型评估章节还会系统讲解交叉验证与网格搜索。6. 最大间隔分类支持向量机SVM6.1 最大间隔直觉不只要分对还要分得稳与逻辑回归关注概率不同SVM 的目标是找到一条离最近训练样本支持向量距离最大的决策边界最大间隔超平面。间隔越大边界对轻微扰动的鲁棒性越强泛化能力通常越好。仓库代码用SVC(kernellinear)在标准化 Iris 数据上训练线性 SVMfrom sklearn.svm import SVC svm SVC(kernellinear, C1.0, random_state0) svm.fit(X_train_std, y_train) plot_decision_regions(X_combined_std, y_combined, classifiersvm, test_idxrange(105, 150)) plt.xlabel(petal length [standardized]) plt.ylabel(petal width [standardized]) plt.legend(locupper left) plt.show()kernellinear表示使用线性核即原始特征空间中的直线/超平面决策边界。6.2 用松弛变量处理近似线性可分数据现实中数据往往并非严格线性可分。SVM 为此引入松弛变量slack variables, ξ允许少量样本落在间隔之内甚至错误一侧同时通过惩罚参数C在间隔最大化与误分类惩罚之间权衡C 大对误分类惩罚重间隔变窄倾向完美拟合训练集易过拟合C 小容忍更多误分类间隔更宽易欠拟合。从源码结构看C1.0是仓库示例的默认取值也是实践中最常用的起点。惩罚项的思想与上一节逻辑回归的 L2 正则化殊途同归——都是通过约束复杂度来平衡偏差与方差。6.3 scikit-learn 中的替代实现除SVC外scikit-learn 针对不同场景还提供线性 SVM 的替代实现例如LinearSVC线性核专用、对大数据集更快与SGDClassifier随机梯度下降、支持在线学习。仓库本章主体仍以SVC为主因为它的kernel参数可以无缝切换到下一节的非线性核。7. 用核 SVM 解决非线性问题7.1 为什么线性模型失效XOR 数据集线性分类器在线性不可分的数据上会彻底失效。仓库代码构造了一个经典的XOR 数据集来演示200 个随机二维样本类别由异或逻辑生成正负类呈交叉分布np.random.seed(0) X_xor np.random.randn(200, 2) y_xor np.logical_xor(X_xor[:, 0] 0, X_xor[:, 1] 0) y_xor np.where(y_xor, 1, -1) plt.scatter(X_xor[y_xor 1, 0], X_xor[y_xor 1, 1], cb, markerx, label1) plt.scatter(X_xor[y_xor -1, 0], X_xor[y_xor -1, 1], cr, markers, label-1) plt.xlim([-3, 3]); plt.ylim([-3, 3]) plt.legend(locbest) plt.show()没有任何一条直线能分开这类数据必须先做特征映射再分类。7.2 核技巧在隐式高维空间找超平面核技巧的精妙之处在于不必显式计算高维映射φ(x)只需用核函数在原始空间中计算样本对的高维内积。常用的RBF 径向基核为K(x, x) exp(-γ·‖x - x‖²)其中γgamma控制单个训练样本的影响半径。先在 XOR 数据上验证 RBF 核 SVM 能学出非线性边界svm SVC(kernelrbf, random_state0, gamma0.10, C10.0) svm.fit(X_xor, y_xor) plot_decision_regions(X_xor, y_xor, classifiersvm) plt.legend(locupper left) plt.show()再将 RBF 核应用到 Iris 数据仓库代码特意对比了两个 gamma 值的效果# gamma0.2决策边界较平滑 svm SVC(kernelrbf, random_state0, gamma0.2, C1.0) svm.fit(X_train_std, y_train) plot_decision_regions(X_combined_std, y_combined, classifiersvm, test_idxrange(105, 150)) plt.xlabel(petal length [standardized]) plt.ylabel(petal width [standardized]) plt.legend(locupper left) plt.show() # gamma100.0每个训练样本的影响范围极小边界剧烈扭曲 svm SVC(kernelrbf, random_state0, gamma100.0, C1.0) svm.fit(X_train_std, y_train) plot_decision_regions(X_combined_std, y_combined, classifiersvm, test_idxrange(105, 150)) plt.xlabel(petal length [standardized]) plt.ylabel(petal width [standardized]) plt.legend(locupper left) plt.show()gamma 与 C 是两个核心旋钮参数含义取值过大取值过小gamma单个样本的影响半径每个样本只影响极小邻域边界严重过拟合决策边界过于平滑近似线性C误分类惩罚过拟合训练噪声边界过宽、欠拟合gamma0.2得到平滑合理的非线性边界gamma100.0时每个训练点周围都圈出自己的小区域决策区域碎裂——这是过拟合的可视化典型样例也是理解高方差最直观的教材。8. 决策树学习递归划分与信息增益8.1 最大化信息增益熵、基尼不纯度与误分类率决策树通过递归二分特征空间构建每次分裂都试图最大化信息增益分裂前后不纯度的降低。仓库代码对比了三种常用的不纯度度量画出它们随类别概率p(i1)变化的曲线def gini(p): return p * (1 - p) (1 - p) * (1 - (1 - p)) def entropy(p): return - p * np.log2(p) - (1 - p) * np.log2((1 - p)) def error(p): return 1 - np.max([p, 1 - p]) x np.arange(0.0, 1.0, 0.01) ent [entropy(p) if p ! 0 else None for p in x] sc_ent [e * 0.5 if e else None for e in ent] err [error(i) for i in x] fig plt.figure() ax plt.subplot(111) for i, lab, ls, c, in zip([ent, sc_ent, gini(x), err], [Entropy, Entropy (scaled), Gini Impurity, Misclassification Error], [-, -, --, -.], [black, lightgray, red, green, cyan]): line ax.plot(x, i, labellab, linestylels, lw2, colorc) ax.legend(locupper center, bbox_to_anchor(0.5, 1.15), ncol3, fancyboxTrue, shadowFalse) ax.axhline(y0.5, linewidth1, colork, linestyle--) ax.axhline(y1.0, linewidth1, colork, linestyle--) plt.ylim([0, 1.1]) plt.xlabel(p(i1)) plt.ylabel(Impurity Index) plt.show()三种度量在p0.5最不纯时都取最大值、在p0或p1完全纯时归零因此在实践中选择哪一种对结果影响通常不大熵与基尼不纯度在类别极不平衡时比误分类率更敏感。8.2 构建决策树criterion 与 max_depthfrom sklearn.tree import DecisionTreeClassifier tree DecisionTreeClassifier(criterionentropy, max_depth3, random_state0) tree.fit(X_train, y_train) X_combined np.vstack((X_train, X_test)) y_combined np.hstack((y_train, y_test)) plot_decision_regions(X_combined, y_combined, classifiertree, test_idxrange(105, 150)) plt.xlabel(petal length [cm]) plt.ylabel(petal width [cm]) plt.legend(locupper left) plt.show()注意这里直接使用原始特征未标准化——决策树按特征值阈值分裂对特征尺度不敏感。criterionentropy用信息熵作为分裂度量max_depth3限制树的深度为 3是防止决策树无限生长、过拟合训练数据的最直接手段random_state0固定分裂评估的随机性。8.3 用 Graphviz 导出并可视化决策树仓库代码把训练好的树导出为 DOT 文件code/ch03/tree.dot这是决策树可解释性的直接体现from sklearn.tree import export_graphviz export_graphviz(tree, out_filetree.dot, feature_names[petal length, petal width])code/ch03/tree.dot 中保存了完整的树结构根节点即为petal width 0.75熵 1.5799、105 个样本、类别分布 [34, 32, 39]随后逐层分裂左子树在petal width 1.65处继续划分 Versicolor右子树在petal length 4.95处继续区分 Virginica最终得到熵为 0 的纯叶子节点。整棵树的每个节点都标注了分裂特征、阈值、熵、样本数与类别计数可以逐节点核对分类逻辑。如果安装了pydotpluspip install pydotplus且 scikit-learn 版本 ≥ 0.18还可以在 Notebook 内直接渲染带类别名、填充色与圆角样式的树图利用filledTrue, roundedTrue, class_names[setosa, versicolor, virginica]等新参数无需先生成 dot 文件未安装时仓库代码会打印pydotplus is not installed.的提示。8.4 随机森林从弱学习器到强学习器单棵决策树容易过拟合随机森林通过装袋 特征随机化把多棵弱树集成为强分类器每棵树在训练集的有放回抽样bootstrap子集上训练且每次分裂只考虑随机选取的部分特征最后以多数投票决定类别对应书籍配图03_20的多数投票示意。from sklearn.ensemble import RandomForestClassifier forest RandomForestClassifier(criterionentropy, n_estimators10, random_state1, n_jobs2) forest.fit(X_train, y_train) plot_decision_regions(X_combined, y_combined, classifierforest, test_idxrange(105, 150)) plt.xlabel(petal length [cm]) plt.ylabel(petal width [cm]) plt.legend(locupper left) plt.show()n_estimators10森林中的决策树数量越多通常越稳健代价是训练时间criterionentropy单棵树的熵分裂准则n_jobs2并行使用 2 个 CPU 核训练体现集成方法的计算开销与并行化收益与单棵树相同随机森林也直接使用原始特征。相比单棵决策树随机森林的决策边界明显更平滑、更稳健且对噪声与轻微过拟合有更强的抵抗力是从弱到强集成思想的经典示范。9. K 近邻一种惰性学习算法KNN 是本章收尾算法与前面所有急切学习训练阶段学出模型参数方法不同它属于惰性学习——训练阶段只是把样本记住真正的计算发生在预测时对新样本找出训练集中距离最近的 K 个邻居按多数投票决定类别。from sklearn.neighbors import KNeighborsClassifier knn KNeighborsClassifier(n_neighbors5, p2, metricminkowski) knn.fit(X_train_std, y_train) plot_decision_regions(X_combined_std, y_combined, classifierknn, test_idxrange(105, 150)) plt.xlabel(petal length [standardized]) plt.ylabel(petal width [standardized]) plt.legend(locupper left) plt.show()参数含义参数取值说明n_neighbors5投票邻居数 KK 越小边界越复杂易过拟合K 越大边界越平滑metricminkowski闵可夫斯基距离族是欧氏距离与曼哈顿距离的推广p2闵可夫斯基距离的阶数p2即欧氏距离p1为曼哈顿距离KNN 必须使用标准化后的特征X_train_std / X_test_std因为距离计算对特征量纲高度敏感这也是它与树模型在数据预处理上的关键差异。它的优势是实现简单、无需训练但预测时需要与全部训练样本计算距离样本量大时开销显著且高维空间下距离区分度会下降维度灾难。10. 本章小结第 3 章用同一份 Iris 数据串起了 scikit-learn 的六类经典分类算法形成了一条完整的实战主线数据管线先行加载 →train_test_split划分test_size0.3, random_state0→StandardScaler只在训练集上fit再统一transform线性模型三连感知机Perceptron91% 准确率基线→ 逻辑回归sigmoid 概率输出 C正则化权重路径实验→ 线性 SVM最大间隔 松弛变量非线性进阶核 SVM 用 RBF 核解决 XOR 等线性不可分问题gamma与C联合控制偏差-方差权衡树模型与集成决策树熵/基尼不纯度、max_depth防过拟合、Graphviz 导出→ 随机森林bootstrap 特征随机化 多数投票惰性学习收尾KNNn_neighbors、p、metric展示零训练的另一种建模范式。贯穿始终的方法论是偏差-方差权衡从逻辑回归的C、SVM 的gamma/C到决策树的max_depth、KNN 的K每个超参数都在拟合训练数据与保持泛化能力之间寻找平衡点而plot_decision_regions让这种权衡变得肉眼可见。本文所有代码均可直接在 code/ch03/ch03.ipynb 中逐单元格运行或运行合并脚本 code/optional-py-scripts/ch03.py 一次跑完决策树导出文件 code/ch03/tree.dot 可用 Graphviz 渲染成树形图。如果你需要先搭建 Python 与 Jupyter Notebook 环境可参考 code/ch01/README.md 中的环境搭建说明第 4、5 章数据预处理、降维与第 6 章模型评估与超参数优化会在此基础上继续深入把本文中提到的交叉验证、网格搜索等方法系统化。后续章节的进阶路线若想了解模型评估与超参数调优的系统方法交叉验证、网格搜索可继续学习 code/ch06/ch06.ipynb若关注特征工程与降维对分类器的影响可阅读 code/ch04/ch04.ipynb 与 code/ch05/ch05.ipynb。【免费下载链接】python-machine-learning-bookThe Python Machine Learning (1st edition) book code repository and info resource项目地址: https://gitcode.com/gh_mirrors/py/python-machine-learning-book创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Starlette TestClient 全解析:用 httpx2 驱动的 ASGI 测试客户端实战指南
Starlette TestClient 全解析:用 httpx2 驱动的 ASGI 测试客户端实战指南

后端Web框架 【免费下载链接】starlette The little ASGI framework that shines. 🌟 项目地址: https://gitcode.com/gh_mirrors/st/starlette 点击查看 免费下载 TestClient 是 Starlette 内置的 ASGI 测试客户端,它让你无需启动真实服务器… · 2026/9/23 1:39:28

电竞行业开发入门到精通:避开教程陷阱,3天搞定实战
电竞行业开发入门到精通:避开教程陷阱,3天搞定实战

电竞行业开发入门到精通:避开教程陷阱,3天搞定实战 看了一堆视频,代码敲得滚瓜烂熟,一上手做项目就脑子空白?这其实是典型的“眼高手低”。在电竞行业,无论是做赛事直播平台、选手数据大屏,还是后端高并发匹配系统,光懂语法不够,得懂业务场景下的工… · 2026/9/23 1:39:22

屏幕点击助手源码拆解:从入门到精通的避坑指南
屏幕点击助手源码拆解:从入门到精通的避坑指南

屏幕点击助手源码拆解:从入门到精通的避坑指南 看了一堆教程还是不会写项目?很多学员卡在“屏幕点击助手”这类自动化工具上,觉得代码能跑但不知其所以然,导致一旦环境变化或目标应用更新就彻底失效。想真正从入门到精通,不能只抄代码,必须拆解底层逻辑… · 2026/9/23 1:39:22

CoPaw Skill机制解析:为Agent封装可控的数据库查询能力
CoPaw Skill机制解析:为Agent封装可控的数据库查询能力

最近在给一个内部项目搭 AI Agent 能力时,我把注意力重点放在了 CoPaw 的 Skill 机制上。说白了,CoPaw Skill 就是给 Agent 装上的“技能插件”,让原本只会聊天的模型能真正执行一些具体任务。我们团队第一个落地的场景,就是开发一… · 2026/9/23 4:19:05

Apache Pulsar 非持久化消息(Non-persistent Topics)完全指南:内存级 Topic 的配置、管理与源码解析
Apache Pulsar 非持久化消息(Non-persistent Topics)完全指南:内存级 Topic 的配置、管理与源码解析

Apache Pulsar 非持久化消息(Non-persistent Topics)完全指南:内存级 Topic 的配置、管理与源码解析 【免费下载链接】pulsar Apache Pulsar - distributed pub-sub messaging system 项目地址: https://gitcode.com/gh_mirrors/pulsar28/p… · 2026/9/23 4:18:59

gbrain Daily Task Manager 技能全解析:基于 `ops/tasks.md` 脑页的确定性任务生命周期管理
gbrain Daily Task Manager 技能全解析:基于 `ops/tasks.md` 脑页的确定性任务生命周期管理

人工智能RAGAgent 记忆MCP 服务知识管理 【免费下载链接】gbrain Garrys Opinionated OpenClaw/Hermes Agent Brain 项目地址: https://gitcode.com/gh_mirrors/gb/gbrain 点击查看 免费下载 gbrain 的 daily-task-manager 技能(v2.0.0)把个… · 2026/9/23 4:18:59

Ace Data Cloud接入OpenAI Embeddings,RAG与语义搜索落地实践
Ace Data Cloud接入OpenAI Embeddings,RAG与语义搜索落地实践

做 RAG 最折腾的从来不是调 prompt,也不是选模型,而是从“能跑通”到“能上线”中间那段看不见的脏活。我最早接 OpenAI Embeddings 的时候,以为就是把文本丢进接口拿个向量回来,存储、检索、上线,三天搞定。实际上第一… · 2026/9/23 4:18:59

3步搞定乐乐课堂免费下安装,最佳实践避坑指南
3步搞定乐乐课堂免费下安装,最佳实践避坑指南

3步搞定乐乐课堂免费下安装,最佳实践避坑指南 版本升级后 API 全变了?别慌,老手教你用最佳实践快速落地。 很多刚接触移动开发或者想搞点副业资源的开发者,盯着【乐乐课堂免费下安装】这个需求发愁。表面看是个下载工具,底层其实是 HTTP… · 2026/9/23 4:18:59

GitHub日榜深度解析:从热榜项目到本地部署的避坑指南
GitHub日榜深度解析:从热榜项目到本地部署的避坑指南

先说结论:就算你不是天天泡开源社区的人,只要你的工作里有一丁点和开发、自动化、AI工具相关,每天花十分钟过一遍 GitHub 日榜,比刷两小时信息流有价值得多。今天(2026年9月19日)我又把日榜完整翻了一遍&am… · 2026/9/23 4:18:41

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码