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:32 阅读更多 →
PaddleHub 安装指南:环境依赖、pip 安装与网络/离线使用说明

PaddleHub 安装指南:环境依赖、pip 安装与网络/离线使用说明

PaddleHub 安装指南:环境依赖、pip 安装与网络/离线使用说明 【免费下载链接】PaddleFormers PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFor…

2026/9/23 1:39:32 阅读更多 →
Perso-Arabic 脚本归一化实验复现:Sindhi→English NMTMediumV1 配方详解(OpenNMT-tf 实战)

Perso-Arabic 脚本归一化实验复现:Sindhi→English NMTMediumV1 配方详解(OpenNMT-tf 实战)

Perso-Arabic 脚本归一化实验复现:Sindhi→English NMTMediumV1 配方详解(OpenNMT-tf 实战) 【免费下载链接】google-research Google Research 项目地址: https://gitcode.com/gh_mirrors/go/google-research 本文面向需要复现 Graph…

2026/9/23 1:39:32 阅读更多 →

最新新闻

SPSS中VIF方差膨胀因子怎么看?一文搞定多重共线性诊断

SPSS中VIF方差膨胀因子怎么看?一文搞定多重共线性诊断

做回归分析时,我最常被同行问的问题之一就是:“SPSS到底在哪里看方差膨胀因子(VIF)?”找了半天,结果表里根本没有这一列。其实不是SPSS不给,而是它默认把这个功能藏起来了,需要在线性…

2026/9/23 22:09:59 阅读更多 →
Apache Pulsar 模块化负载管理器(Modular Load Manager)深入指南:启用、验证与实现原理

Apache Pulsar 模块化负载管理器(Modular Load Manager)深入指南:启用、验证与实现原理

Apache Pulsar 模块化负载管理器(Modular Load Manager)深入指南:启用、验证与实现原理 【免费下载链接】pulsar Apache Pulsar - distributed pub-sub messaging system 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar A…

2026/9/23 22:09:59 阅读更多 →
IronClaw 内存原生提供方(memory-native)深度解析:MemoryService 契约实现、双通道召回与提示写入安全

IronClaw 内存原生提供方(memory-native)深度解析:MemoryService 契约实现、双通道召回与提示写入安全

人工智能AI 应用交互助手AI Agent 【免费下载链接】ironclaw IronClaw is an Agent OS focused on privacy, security and extensibility 项目地址: https://gitcode.com/gh_mirrors/iro/ironclaw 点击查看 免费下载 IronClaw 将"持久化记忆"拆分为"…

2026/9/23 22:09:59 阅读更多 →
美赛特等奖论文的建模思维解剖与工程化复用

美赛特等奖论文的建模思维解剖与工程化复用

简介:本资源为2021年美国大学生数学建模竞赛(MCM)特等奖论文合辑,面向数学建模参赛者、高校理工科学生及科研入门者,提供高水准建模思路、跨学科方法融合与完整赛题解决方案的权威范本。合辑以一篇聚焦真菌分解过程的特…

2026/9/23 22:09:59 阅读更多 →
机械工程控制基础课件制作:从传递函数到仿真配图的完整路径

机械工程控制基础课件制作:从传递函数到仿真配图的完整路径

简介:这是一份面向机械工程及相关专业学生和初学者的《机械工程控制基础》课程PPT,源自三峡大学机械与材料学院方子帆教授的课堂讲义,聚焦控制理论的基本概念、系统工作原理与组成,并通过恒温箱温度控制、钢铁轧制等案例讲解自动控…

2026/9/23 22:09:59 阅读更多 →
药品板蓝根颗粒检测:110张VOC+YOLO数据集训练与避坑指南

药品板蓝根颗粒检测:110张VOC+YOLO数据集训练与避坑指南

简介:这份数据集面向计算机视觉开发者与药品检测场景,旨在解决板蓝根颗粒袋装产品的自动识别与定位问题。资源采用Pascal VOC与YOLO双格式标注,并保留原始JPG图片,能够直接用于YOLO系列、SSD、Faster R-CNN等主流目标检测模型的训…

2026/9/23 22:08:59 阅读更多 →

日新闻

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

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

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

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →