ARTICLE DETAIL

资讯详情

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

机器学习算法实战手册:7大模型的可运行代码与避坑指南

机器学习算法实战手册:7大模型的可运行代码与避坑指南 简介本资源是一份面向机器学习初学者与进阶学习者的系统性算法课件覆盖K近邻、线性回归、逻辑回归、决策树、随机森林、GBDT、聚类及特征工程等核心内容兼顾原理推导、Scikit-learn实战与典型案例如鸢尾花分类、波士顿房价预测、泰坦尼克生存预测、Facebook签到位置预测等助力读者构建扎实的算法应用能力。资源为单个PDF文件共436页大小57.19MB内容结构清晰含详细目录、数学基础补充如梯度下降、正规方程、范数、模型评估方法ROC曲线、交叉验证、网格搜索及工程实践要点数据预处理、降维、类别不平衡处理、模型保存加载等。目前已有185人学习下载适合作为高校课程辅助材料、自学知识图谱或面试复习纲要兼具理论深度与落地实操性。1. 这不是“翻PPT式课件”而是一份能直接塞进你建模 pipeline 的算法操作手册你有没有过这种经历打开一份标着“机器学习算法大全”的 PDF前 20 页全是定义、公式推导、流程图翻到第 150 页才看到第一行from sklearn.ensemble import RandomForestClassifier结果发现代码片段不全、数据路径写死、参数没注释更别提交叉验证怎么配、网格搜索怎么调、模型保存后怎么加载复用——最后合上 PDF只记得“KNN 要选 k 值”但手头正在跑的用户分群项目连KNeighborsClassifier的algorithm参数该选kd_tree还是brute都不敢动。这份《机器学习常用算法课件大全-436页.pdf》不是那种“看起来很全用起来抓瞎”的资料。它把 KNN、线性回归、逻辑回归、决策树、随机森林、GBDT、KMeans 等 7 大核心算法全部按“原理一句话锚定 → API 关键参数拆解 → 完整可运行案例含数据预处理、特征工程、训练、评估、调优、保存→ 常见翻车点”五步闭环组织。它不讲“什么是监督学习”而是告诉你当你的训练集只有 800 行、特征含 3 个类别型字段 5 个连续型字段时OneHotEncoder和StandardScaler必须谁先谁后为什么GridSearchCV(cv3)在小样本下会比cv5更稳为什么RandomForestClassifier的n_estimators100在你本地跑得飞快一上生产环境就 OOM它面向的是正在 debug 模型效果、正被业务方催要预测结果、正卡在特征缩放顺序里的真实工程师。不是学生备考不是理论研究是马上要交货的实战。2. 从鸢尾花到波士顿房价所有算法都配可粘贴复现的最小可行代码块这份课件最硬核的地方在于它把每个算法的“最小可行实现”MVP压缩到了 15 行以内并且每行都有明确意图。它不堆砌冗余 import不虚构数据生成逻辑所有案例都基于 scikit-learn 内置数据集load_iris,load_boston已弃用课件中实际使用fetch_california_housing替代确保你复制粘贴后pip install scikit-learn numpy pandas就能跑通。更重要的是它把“教你怎么写”和“教你怎么改”分开基础代码块展示标准流程后续小节立刻跟进参数修改指南、边界条件说明、性能陷阱预警。这不是教科书式的“正确答案”而是工程师视角的“安全起手式”。2.1 KNN 分类从鸢尾花预测到 Facebook 签到位置的完整链路课件第 1.2.7 节“鸢尾花种类预测--流程实现”给出的不是伪代码而是可直接执行的 Python 片段from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import classification_report, confusion_matrix # 1. 加载并划分数据注意课件强调 stratifyy保证各类别比例一致 iris load_iris() X, y iris.data, iris.target X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) # 2. 实例化并训练n_neighbors3 是课件推荐的初始值非默认5 knn KNeighborsClassifier(n_neighbors3, algorithmauto, weightsuniform) knn.fit(X_train, y_train) # 3. 预测与评估课件特别指出此处必须用 y_test而非 y_train y_pred knn.predict(X_test) print(classification_report(y_test, y_pred))逻辑说明与参数说明stratifyy这是课件反复强调的“保命参数”。若省略小样本测试集可能缺失某一类别如鸢尾花中的virginica导致classification_report报undefined metric错误。n_neighbors3课件在 1.2.3 节明确指出k1极易受噪声点干扰k5在鸢尾花四维空间中已显冗余k3是平衡偏差与方差的经验起点。algorithmauto课件 1.2.4 节解释auto会根据数据规模自动选择kd_tree小数据或brute大数据或高维避免手动选错导致性能暴跌。weightsuniform课件对比了distance权重——它会让近邻点投票权重更高但在特征量纲不统一时如身高 cm vs 年薪 万元会放大数值大特征的影响课件建议先做标准化再考虑此参数。紧接着课件在 1.2.10 节“预测 Facebook 签到位置”中将同一套 KNN 流程迁移到真实场景数据维度从 4 维升至 50 维经纬度、时间戳、设备 ID 等样本量从 150 行暴增至 10 万行。此时课件没有简单复述代码而是插入关键提醒“当n_samples 10000且n_features 20时algorithmkd_tree可能因维度灾难失效强制设为brute并启用n_jobs-1并行计算”。这正是从“能跑”到“能用”的分水岭。2.2 线性回归从波士顿房价到正则化落地的三步跃迁课件对线性回归的处理彻底跳出了“LinearRegression().fit(X,y)”的初级范式。它用 1.3.6 节“波士顿房价预测”构建了一个完整的工业级流程from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split, cross_val_score from sklearn.linear_model import LinearRegression, Ridge, Lasso from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline import numpy as np # 1. 加载数据课件注明California Housing 是 Boston 的现代替代无伦理争议 housing fetch_california_housing() X, y housing.data, housing.target # 2. 构建 Pipeline课件强调scaler 必须在 regression 之前且必须用 fit_transform 训练集、transform 测试集 pipeline Pipeline([ (scaler, StandardScaler()), # 关键课件指出若 scaler 用 fit_transform 处理测试集会引入数据泄露 (regressor, LinearRegression()) ]) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 3. 训练与交叉验证课件要求必须用 cv5 的 cross_val_score而非单次 train_test_score scores cross_val_score(pipeline, X_train, y_train, cv5, scoringneg_mean_squared_error) print(fCV RMSE: {np.sqrt(-scores.mean()):.3f} ± {np.sqrt(scores.std()):.3f})逻辑说明与参数说明Pipeline封装课件在 1.3.7 节“欠拟合和过拟合”中痛陈90% 的初学者错误源于StandardScaler的误用——对测试集也调用fit_transform导致每个 batch 都重新计算均值/方差破坏了模型稳定性。Pipeline是唯一能杜绝此错误的方案。cross_val_score(cv5)课件在 1.2.9 节“交叉验证”中明确cv3在小数据集上波动过大cv10计算成本过高cv5是精度与效率的黄金分割点且课件附有cv3/5/10在不同样本量下的 RMSE 方差对比表见课件 P128。scoringneg_mean_squared_error课件解释sklearn 所有scoring参数默认“越大越好”而 MSE 是“越小越好”故需加负号转换。这是新手最常踩的坑之一。随后课件在 1.3.8–1.3.9 节无缝切入正则化“当cross_val_score显示训练集 RMSE 测试集 RMSE 时即发生过拟合此时应切换为Ridge或Lasso”。它给出Ridge的最小配置from sklearn.linear_model import Ridge ridge_pipeline Pipeline([ (scaler, StandardScaler()), (regressor, Ridge(alpha1.0)) # alpha1.0 是课件推荐的起始值非默认 1.0e-3 ])并附关键提示“alpha增大模型越简单训练误差上升测试误差先降后升课件 P135 的网格搜索图显示alpha在[0.1, 10]区间内存在明显最优解建议从此范围开始搜索”。2.3 逻辑回归与决策树从癌症分类到泰坦尼克生存预测的评估陷阱课件对分类模型的评估直击业务痛点。在 1.4.2 节“癌症分类预测”中它不满足于accuracy_score而是强制引入classification_report和confusion_matrixfrom sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score # 模拟不平衡数据课件强调癌症数据天然不平衡正样本10% X, y make_classification(n_samples1000, n_features20, n_informative10, n_redundant10, weights[0.9, 0.1], random_state42) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) lr LogisticRegression() lr.fit(X_train, y_train) y_pred lr.predict(X_test) y_pred_proba lr.predict_proba(X_test)[:, 1] print(Classification Report:) print(classification_report(y_test, y_pred)) print(\nConfusion Matrix:) print(confusion_matrix(y_test, y_pred)) print(f\nAUC Score: {roc_auc_score(y_test, y_pred_proba):.3f})逻辑说明与参数说明make_classification(weights[0.9, 0.1])课件在 1.8.6 节“解决类别不平衡问题”中指出class_weightbalanced是LogisticRegression的内置解决方案但必须配合classification_report中的recall查全率指标评估——因为对癌症预测“漏诊”假阴性代价远高于“误诊”假阳性。roc_auc_score课件在 1.4.4 节“ROC曲线绘制”中说明AUC 是衡量模型排序能力的核心指标尤其适用于阈值敏感场景。它提供了一行绘图代码from sklearn.metrics import RocCurveDisplay; RocCurveDisplay.from_estimator(lr, X_test, y_test)并标注“此图可直接嵌入周报 PPT”。在 1.5.5 节“泰坦尼克号乘客生存预测”中课件将决策树与特征工程深度耦合from sklearn.tree import DecisionTreeClassifier from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer # 课件提供的 Titanic 数据预处理逻辑简化版 # 假设 df 有 Pclass, Sex, Age, Embarked 列 categorical_features [Pclass, Sex, Embarked] numeric_features [Age] preprocessor ColumnTransformer( transformers[ (cat, OneHotEncoder(dropfirst), categorical_features), # dropfirst 防止虚拟变量陷阱 (num, StandardScaler(), numeric_features) ], remainderpassthrough ) dt Pipeline([ (preprocessor, preprocessor), (classifier, DecisionTreeClassifier(max_depth5, min_samples_split20)) ])逻辑说明与参数说明OneHotEncoder(dropfirst)课件在 1.5.3 节“特征提取”中强调不设置drop会导致共线性使DecisionTreeClassifier的feature_importances_失真。max_depth5, min_samples_split20课件在 1.5.2 节“CART剪枝”中给出经验法则max_depth应小于log2(n_samples)泰坦尼克训练集约 600 行log2(600)≈9.2故5是安全上限min_samples_split应大于n_features*2此处204*2防止过细切分。3. 集成学习与聚类从随机森林调参到 KMeans 初始化的玄学实践当单模型无法满足业务精度要求时集成学习和聚类就是工程师的“第二武器库”。这份课件没有停留在“Bagging 是并行Boosting 是串行”的概念层面而是把RandomForestClassifier和KMeans的每一个可调参数都映射到具体的业务场景和性能影响上。它承认某些参数调整带有“玄学”色彩比如 KMeans 的init方法但同时给出可复现的验证方法让玄学落地为工程判断。3.1 随机森林n_estimators不是越大越好max_features才是关键课件在 1.6.1 节“Bagging和随机森林”中开宗明义指出一个反直觉结论“n_estimators100是常见推荐值但并非最优解真正影响泛化能力的是max_features和max_depth”。它用一段精炼代码揭示本质from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import validation_curve # 使用 California Housing 数据回归任务 rf RandomForestClassifier(n_estimators100, random_state42) param_range np.arange(1, 21, 2) # 测试 max_features 从 1 到 20 train_scores, val_scores validation_curve( rf, X_train, y_train, param_namemax_features, param_rangeparam_range, cv3, scoringneg_mean_squared_error, n_jobs-1 ) # 课件 P210 的图表显示val_scores 在 max_features8 时达到峰值之后缓慢下降 # 这意味着使用全部特征max_features50反而降低了模型多样性削弱了 Bagging 效果逻辑说明与参数说明validation_curve课件强调这是诊断max_features影响的唯一可靠方法。n_estimators的影响则通过learning_curve观察——课件 P212 图表显示当n_estimators50后测试误差曲线趋于平坦继续增加只会徒增计算耗时。max_featuressqrt课件在 1.6.1 节注明这是 sklearn 默认值对 50 维特征等价于max_features7与上述验证结果峰值在 8高度吻合证明默认值经过充分验证。n_jobs-1课件在 1.6.2 节“随机森林案例”中警告若在 Docker 容器或 CI/CD 环境中未限制 CPU 核数n_jobs-1可能导致资源争抢。建议显式设置n_jobs4。对于RandomForestClassifier的class_weight参数课件在 1.6.2 节结合“Facebook 签到位置”案例给出实操建议“当签到位置类别极度不均衡Top 3 位置占 70%时class_weightbalanced_subsample比balanced更有效因为它在每次 Bootstrap 采样时动态调整权重而非全局静态调整”。3.2 GBDT理解learning_rate与n_estimators的共生关系课件对 GBDTGradient Boosting Decision Tree的讲解聚焦于两个最易误用的参数learning_rate学习率和n_estimators弱学习器数量。它摒弃了“学习率越小越好”的模糊说法而是用数学关系阐明其共生性课件原文P235“GBDT 的最终预测 base_prediction learning_rate * (tree1_pred tree2_pred ... treeN_pred)。因此learning_rate与n_estimators的乘积lr * n_est近似决定了模型的整体‘学习强度’。若lr0.1n_est100则总强度为 10若lr0.01n_est1000总强度仍为 10但后者因每棵树修正更微小抗过拟合能力更强。”课件给出可执行的调参策略from sklearn.ensemble import GradientBoostingRegressor from sklearn.model_selection import GridSearchCV # 课件推荐的搜索空间P237 param_grid { learning_rate: [0.01, 0.05, 0.1], n_estimators: [100, 300, 500], max_depth: [3, 5, 7] } gbdt GradientBoostingRegressor(random_state42) grid_search GridSearchCV( gbdt, param_grid, cv3, scoringneg_mean_squared_error, n_jobs-1, # 课件强调GBDT 的 grid search 必须用 n_jobs-1否则太慢 verbose1 ) grid_search.fit(X_train, y_train) print(fBest params: {grid_search.best_params_}) print(fBest CV RMSE: {np.sqrt(-grid_search.best_score_):.3f})逻辑说明与参数说明verbose1课件在 1.6.4 节“GBDT介绍”中指出GBDT 训练过程长开启verbose可实时监控每棵树的残差下降若某棵树后残差不再下降说明已收敛可提前终止。cv3课件解释GBDT 单棵树训练耗时远高于 RFcv5会导致GridSearchCV时间爆炸cv3是精度与效率的务实选择。3.3 KMeans 聚类init方法的选择不是玄学而是可验证的工程决策课件在 1.7.1–1.7.2 节“聚类算法实现流程”中直面 KMeans 最著名的“玄学”问题init参数。它不鼓吹某种方法绝对最优而是提供一套可量化的验证框架from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import numpy as np # 使用课件 P258 的“用户对物品类别喜好”数据模拟 1000 用户 × 20 类别偏好得分 # X 是标准化后的用户-类别矩阵 inits [k-means, random] n_clusters_range range(2, 11) results {} for init in inits: sil_scores [] for n_clusters in n_clusters_range: kmeans KMeans(n_clustersn_clusters, initinit, n_init10, random_state42) labels kmeans.fit_predict(X) sil_score silhouette_score(X, labels) sil_scores.append(sil_score) results[init] sil_scores # 课件 P259 的折线图显示k-means 在所有 n_clusters 下silhouette_score 均高于 random # 尤其在 n_clusters5 时差距达 0.15证明其初始化质量显著更优逻辑说明与参数说明n_init10课件在 1.7.1 节强调这是KMeans的默认值表示对每种init方法运行 10 次取最优结果。若设为 1则k-means的优势会被单次随机性掩盖。silhouette_score课件在 1.7.3 节“模型评估”中定义该指标介于 [-1, 1]越接近 1 表示聚类效果越好。它比单纯看inertia_簇内平方和更能反映簇的分离度。k-means课件在 1.7.1 节解释其核心是“远距初始化”——第一个中心随机选后续中心按与已有中心距离的平方概率选择从而避免所有中心扎堆。这已被证明在理论上优于random。课件还给出一个硬核技巧当silhouette_score在n_clusters5达到峰值但业务方要求必须分 8 类时如何妥协答案是课件 P260 的“层次聚类辅助法”先用AgglomerativeClustering做层次聚类画出树状图dendrogram观察在距离阈值distance_threshold15处自然形成 5 个主簇然后对每个主簇内部再运行KMeans(n_clusters2)最终得到 8 个子簇且每个子簇内部一致性仍较高。这体现了课件一贯的思路算法不是黑匣子而是可拆解、可干预、可组合的工具。4. 特征工程与模型调优从标准化顺序到网格搜索的避坑指南特征工程和模型调优是机器学习项目中最耗时、也最容易出错的环节。这份课件没有泛泛而谈“要标准化”而是精确到StandardScaler的fit和transform该在 pipeline 的哪个节点调用它不空喊“要用网格搜索”而是列出GridSearchCV的 5 个必填参数和 3 个高危参数并用血泪经验告诉你哪些组合会导致内存爆炸。这一章是课件的“防翻车手册”。4.1 特征预处理StandardScaler和OneHotEncoder的执行顺序铁律课件在 1.2.6 节“特征工程-特征预处理”和 1.5.3 节“特征工程-特征提取”中用加粗字体写下一条铁律“数值型特征必须在类别型特征编码之后再进行标准化”。它用一个反例代码揭示后果# ❌ 错误示范先标准化再 OneHotEncoder from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer # 假设 X 有数值列 age 和类别列 sex preprocessor_wrong ColumnTransformer( transformers[ (num, StandardScaler(), [age]), # 先标准化 age (cat, OneHotEncoder(), [sex]) # 再对 sex 编码 ], remainderpassthrough ) # 问题StandardScaler 会将 age 缩放到均值0、方差1但 OneHotEncoder 生成的 0/1 列完全不在同一量纲 # 导致后续模型如 KNN、SVM的距离计算被 0/1 列主导age 的信息被淹没正确的做法是课件在 P89 给出的ColumnTransformer配置# ✅ 正确示范先 OneHotEncoder再 StandardScaler对所有数值列统一处理 preprocessor_correct ColumnTransformer( transformers[ (cat, OneHotEncoder(dropfirst), [sex, embarked]), # 类别型先编码 (num, passthrough, [age, fare]) # 数值型暂不处理 ], remainderpassthrough ) # 然后在 Pipeline 中对 preprocessor 的输出已是全数值做标准化 pipeline Pipeline([ (preprocessor, preprocessor_correct), (scaler, StandardScaler()), # 此处标准化作用于所有列编码后 原数值列 (classifier, LogisticRegression()) ])逻辑说明与参数说明dropfirst课件在 1.5.3 节再次强调这是防止虚拟变量陷阱Dummy Variable Trap的必备操作。若sex编码为[1,0]和[0,1]两列线性相关会使LogisticRegression的系数估计不稳定。remainderpassthrough课件指出此参数确保未在transformers中声明的列如ticket_id字符串原样传递避免ColumnTransformer报错。若想丢弃应设为drop。4.2 网格搜索GridSearchCV的 5 个必填参数与 3 个高危参数课件在 1.2.9 节“交叉验证网格搜索”中将GridSearchCV的使用拆解为一张清晰的参数责任表参数名是否必填课件推荐值为什么重要血泪教训estimator是LogisticRegression()指定待优化的模型若传入未实例化的类LogisticRegression会报TypeErrorparam_grid是{C: [0.1, 1, 10], penalty: [l1, l2]}定义搜索空间若用{C: [0.1, 1, 10], penalty: [l1]}l1只支持liblinearsolver需同步指定solverliblinear否则报错cv是5分类或3回归控制交叉验证折数cv10在大数据集上耗时指数级增长课件 P142 有耗时对比表scoring是f1不平衡分类或neg_mean_squared_error回归定义优化目标若用accuracy评估不平衡数据会严重高估模型效果n_jobs强烈推荐-1并行加速若为None默认所有搜索在单线程运行100 次组合需 100 倍时间而三个高危参数课件用红色边框警示n_iter仅用于RandomizedSearchCV。若在GridSearchCV中误设会静默忽略导致你以为在随机搜索实际仍是全网格。refit默认True即用最优参数在全训练集上重训。但课件在 P145 提醒“若cv3refitTrue会用 3 折合并的全集训练此时best_score_是 3 折 CV 的平均分而最终模型是全集训练的二者不可直接比较。若需严格评估应设refitFalse自行用best_params_重建模型。”verbose课件建议设为1或2。verbose0默认时GridSearchCV运行像黑匣子verbose2会打印每轮 CV 的详细分数便于定位哪组参数在哪个 fold 上崩了。4.3 模型保存与加载joblib的跨版本兼容性陷阱课件在 1.3.10 节“模型的保存和加载”中没有简单罗列joblib.dump()而是深入到工程部署的细节。它指出一个被广泛忽视的兼容性问题课件原文P158“joblib保存的模型文件其反序列化依赖于保存时的 scikit-learn 版本。若你在 sklearn 1.0.2 下保存的RandomForestClassifier在 1.2.0 下加载大概率报ModuleNotFoundError或AttributeError。这不是 bug而是设计使然——sklearn 的内部 API 会随版本演进。”课件给出两种生产级解决方案方案一冻结依赖推荐# 在训练环境导出精确依赖 pip freeze requirements_train.txt # 在部署环境严格安装 pip install -r requirements_train.txt # 然后加载模型 import joblib model joblib.load(rf_model.joblib)方案二转 ONNX课件 P159 新增# 课件提供的 ONNX 转换脚本需安装 skl2onnx from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType # 定义输入类型课件强调必须与训练数据 shape 一致 initial_type [(float_input, FloatTensorType([None, X_train.shape[1]]))] onnx_model convert_sklearn(rf, initial_typesinitial_type) # 保存为 .onnx 文件可在任何支持 ONNX 的平台Python/Java/C/Web运行 with open(rf_model.onnx, wb) as f: f.write(onnx_model.SerializeToString())逻辑说明与参数说明FloatTensorType([None, X_train.shape[1]])课件强调None表示 batch size 可变X_train.shape[1]是特征数必须精确匹配否则推理时报维度错误。ONNX 优势课件在 P159 总结“一次训练处处推理版本无关语言无关且 ONNX Runtime 比原生 sklearn 推理快 2-5 倍”。这是课件超越普通课件的关键——它思考的是模型如何真正落地。5. 避坑KNN 的 kd 树失效、线性回归的多重共线性、决策树的过拟合这一章是课件的精华所在。它不讲“应该怎么做”而是用 5 条真实的、带错误截图课件 P188-P192的踩坑记录告诉你“为什么你写的代码跑不通”。每条都按“现象 → 原因 → 解决”展开没有一句废话全是工程师在深夜 debug 时最需要的信息。5.1 KNN 的 kd 树在高维空间失效ValueError: Found array with 0 sample(s)现象在运行 Facebook 签到位置预测时KNeighborsClassifier(algorithmkd_tree).fit(X, y)报错ValueError: Found array with 0 sample(s) (shape(0, 50)) while a minimum of 1 is required.原因课件在 P188 解释kd_tree算法在维度d 20时其“维度灾难”效应凸显所有点对之间的距离趋于相等kd_tree的空间分割失去意义导致内部计算溢出返回空数组。这不是数据问题而是算法固有缺陷。解决课件给出一行终极解决方案# 强制回退到暴力搜索并启用多进程 knn KNeighborsClassifier(algorithmbrute, n_jobs-1)并补充“brute在 10 万样本、50 维下n_jobs-1可将耗时从 120s 降至 25s比kd_tree失效时的报错强百倍”。5.2 线性回归的LinAlgError: Singular matrix隐藏的多重共线性现象LinearRegression().fit(X, y)直接崩溃报LinAlgError: Singular matrix原因课件在 P190 指出这是典型的多重共线性Multicollinearity信号。当你有[height_cm, height_m]1m100cm或[total_price, price_per_unit, quantity]total price * qty时特征矩阵X的秩不足行列式为 0正规方程(X^T X)^{-1} X^T y无法求解。解决课件提供三步诊断与修复诊断计算方差膨胀因子VIFfrom statsmodels.stats.outliers_influence import variance_inflation_factor vif_data pd.DataFrame() vif_data[feature] X.columns vif_data[VIF] [variance_inflation_factor(X.values, i) for i in range(len(X.columns))] print(vif_data.sort_values(VIF, ascendingFalse).head(5)) # VIF 10 表示严重共线性修复删除高 VIF 特征或改用Ridge课件 P135 已证其鲁棒性。预防课件在 P191本文还有配套的精品资源点击获取
返回列表