ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

scikit-learn 0.19 版本发布说明深度解读:新特性、API 变更与源码实现

scikit-learn 0.19 版本发布说明深度解读:新特性、API 变更与源码实现 scikit-learn 0.19 版本发布说明深度解读新特性、API 变更与源码实现【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn本文基于 scikit-learn 官方仓库的 doc/whats_new/v0.19.rst 发布说明整理而成。0.19 是 scikit-learn 发展史上的一个重要版本它引入了LocalOutlierFactor、QuantileTransformer、ClassifierChain等至今仍在使用的核心组件为LogisticRegression带来了 L1 多分类能力并重构了交叉验证的多指标评估体系。读完本文你将掌握 0.19 版本引入的全部新 API 的用法、行为变更的影响范围以及这些特性在当前仓库源码中的实现位置与底层原理。版本总览0.19 的发布节奏0.19 系列共包含三个版本仓库中的 doc/whats_new/v0.19.rst 按时间倒序记录了它们的全部变更版本发布日期性质0.19.22018 年 7 月仅用于支持 Python 3.7 的维护版本0.19.12017 年 10 月 23 日Bug 修复版本附带少量文档改进0.19.02017 年 8 月 12 日主版本包含大量新特性与 API 变更0.19.2面向 Python 3.7 的兼容性发布0.19.2 的唯一目的是支持 Python 3.7。值得注意的是由于底层优化器的行为差异部分估计器的n_iter_属性取值可能与之前版本不同在 SciPy 1.0.0 环境下linear_model.LogisticRegression(solverlbfgs)与linear_model.HuberRegressor的优化器可能执行超过请求的最大迭代次数而 0.19.2 之后两个估计器都会如实报告至多max_iter次迭代。0.19.1关键回归修复0.19.1 修复了 0.19.0 引入的若干回归问题其中需要特别留意的行为变化包括从 0.19.0 误合并的metrics.ndcg_score与metrics.dcg_score被回退移除原因是实现存在缺陷且缺乏文档TSNE 输出可能有细微差异issue #9623当多个样本到某个样本的距离相等时Barnes-Hut 近似与精确算法的结果会与 0.19.0 不同return_train_score的默认值将在 0.21 从True改为Falseissue #9677因为计算训练得分在部分场景下会显著拖慢交叉验证官方建议用户显式设置该参数遗留高斯过程实现中的correlation_models与regression_models被正式弃用issue #9717。0.19.1 还修复了若干回归随机森林并行预测的线程安全问题issue #9830、cross_val_predict不接受 list 类型Xissue #9600、二分类methoddecision_function的处理issue #9593、Pipeline不再接受元组形式的stepsissue #9604、TSNE 不再支持除euclidean与precomputed之外的度量issue #9623等。0.19.0 五大核心新特性0.19.0 的官方 Highlights 提到了五类亮点异常检测新模型、基于分位数的特征变换、多标签链式分类、NMF 乘法更新求解器以及多指标交叉验证。LocalOutlierFactor基于近邻的异常检测:class:neighbors.LocalOutlierFactor 是 0.19 新增的无监督异常检测模型其思想是异常样本的局部密度显著低于其邻居。该组件至今仍是 scikit-learn 异常检测的主力工具源码位于 sklearn/neighbors/_lof.pyclass LocalOutlierFactor(KNeighborsMixin, OutlierMixin, NeighborsBase): Unsupervised Outlier Detection using the Local Outlier Factor (LOF).典型的离群点检测用法如下from sklearn.neighbors import LocalOutlierFactor lof LocalOutlierFactor(n_neighbors20, contamination0.1) # fit_predict 返回 -1异常点或 1正常点 y_pred lof.fit_predict(X) # 或者用 negative_outlier_factor_ 打分后自行截断 scores lof.negative_outlier_factor_该实现基于 KNeighborsMixin因此支持algorithm、metric等近邻参数可用noveltyTrue切换到新颖性检测模式。QuantileTransformer分位数归一化:class:preprocessing.QuantileTransformer 与配套函数preprocessing.quantile_transform源码见 sklearn/preprocessing/_data.py 与 sklearn/preprocessing/_data.py提供了比 StandardScaler/MinMaxScaler 更稳健的归一化方式它将每个特征映射到均匀分布output_distributionuniform或正态分布output_distributionnormal从而消除特征分布形态对后续模型的影响from sklearn.preprocessing import QuantileTransformer qt QuantileTransformer(n_quantiles1000, output_distributionuniform) X_trans qt.fit_transform(X)相比均值-方差归一化分位数变换对长尾分布与离群点不敏感且能强制输出分布近似均匀是许多机器学习流水线中处理偏态特征的常用选择。ClassifierChain多标签分类的链式建模:class:multioutput.ClassifierChain源码位于 sklearn/multioutput.py是一种多标签元估计器它将n_labels个二分类器按顺序链接第 k 个分类器除了原始特征外还把前 k-1 个分类器的预测结果作为额外输入从而显式建模标签间的依赖关系from sklearn.multioutput import ClassifierChain from sklearn.linear_model import LogisticRegression chain ClassifierChain(LogisticRegression(), orderrandom, random_state42) chain.fit(X, Y) # Y 为 (n_samples, n_labels) 的多标签矩阵 Y_pred chain.predict(X)链的顺序可以随机化orderrandom多次随机化取平均可以缓解顺序敏感性。此外0.19 还让multioutput.MultiOutputRegressor与multioutput.MultiOutputClassifier支持通过partial_fit在线学习。NMF 的 mu 求解器全 beta-divergence 支持0.19 为decomposition.NMF引入了乘法更新Multiplicative Update, mu求解器允许优化全部三种 beta-divergenceFrobenius 范数、广义 KL 散度与 Itakura-Saito 散度。当前仓库源码中beta_loss参数支持的可选值见 sklearn/decomposition/_nmf.py正是这三种from sklearn.decomposition import NMF model NMF(n_components10, solvermu, beta_losskullback-leibler) W model.fit_transform(X) H model.components_其中beta_lossfrobenius即 0时还做了专门加速。多指标交叉验证cross_validate 与 multimetric 网格搜索0.19 重构了模型评估体系核心是新的model_selection.cross_validate函数源码见 sklearn/model_selection/_validation.pyfrom sklearn.model_selection import cross_validate from sklearn.svm import SVC from sklearn.metrics import make_scorer, accuracy_score, f1_score scoring {accuracy: accuracy, f1: make_scorer(f1_score)} results cross_validate( SVC(), X, y, cv5, scoringscoring, return_train_scoreTrue, ) # results 是一个 dict包含 test_accuracy、test_f1、train_accuracy、 # train_f1、fit_time、score_time 等键cross_validate与旧版cross_val_score的关键区别在于它返回的是一个信息更丰富的字典测试集各指标得分、训练集得分、fit_time与score_time时间信息。签名中默认return_train_scoreFalse也印证了 0.19.1 发布说明中关于该参数默认值将改为False的预告。同时GridSearchCV与RandomizedSearchCV开始支持同时评估多个指标scoring传入 dict 后refit需指定用于最终拟合的指标名如refitf1搜索过程会为每个指标维护独立的排行榜。配合 0.19 新增的metrics.mean_squared_log_error对呈指数趋势的目标更合适、RepeatedKFold/RepeatedStratifiedKFold源码位于 sklearn/model_selection/_split.py 与 sklearn/model_selection/_split.py模型评估工具链在这一版本得到大幅补强。性能与预测速度优化Pipeline 变换缓存:class:pipeline.Pipeline 新增memory参数可在网格搜索中缓存中间变换结果避免对慢变换如PolynomialFeatures、SelectKBest重复计算。0.19.1 进一步放宽约束memory现在直接接受joblib.Memory实例底层由utils.validation.check_memory校验源码见 sklearn/utils/validation.py。当前 Pipeline 的文档sklearn/pipeline.py明确缓存目录可用字符串路径指定最后一个步骤永远不会被缓存且启用缓存会触发对 transformer 的 clonefrom joblib import Memory from sklearn.pipeline import make_pipeline from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import Ridge cachedir ./cache pipe make_pipeline( PolynomialFeatures(degree2), Ridge(), memoryMemory(locationcachedir, verbose0), )这样在GridSearchCV中遍历ridge__alpha时多项式特征只需计算一次。跳过有限性校验:func:config_context 新增能力以自担风险的方式关闭输入数据 NaN/inf 校验assume_finiteTrue显著减少预测阶段的运行开销。该函数至今仍位于 sklearn/_config.pyfrom sklearn import config_context from sklearn.svm import SVC clf SVC().fit(X, y) with config_context(assume_finiteTrue): # 预测时不再逐元素检查有限性速度更快但传入 NaN 将产生未定义行为 preds clf.predict(X_test)这一特性对已经保证数据干净的推理服务特别有用。其他性能增强linear_model.SGDClassifier、SGDRegressor、PassiveAggressiveClassifier、PassiveAggressiveRegressor、Perceptron改用max_itertol精确控制收敛拟合后通过n_iter_暴露实际迭代次数n_iter参数弃用gaussian_process.GaussianProcessRegressor.predict(return_stdTrue)大幅提速linear_model.ARDRegression与BayesianRidge的predict新增return_stdcluster.MiniBatchKMeans与cluster.KMeans在将样本分配到最近簇中心时显著降低内存占用decomposition.PCA、IncrementalPCA、TruncatedSVD暴露singular_values_属性PCA / MultiTaskElasticNet / LogisticRegression(newton-cg) / Ridge(多个求解器) 均避免了 float32 被隐式提升为 float64 的内存浪费树模型支持稀疏输入预测VotingClassifier支持set_params动态增删成员估计器设为None即移除并新增flatten_transform参数tree.export_graphviz可配置小数位数。重要行为变更Changed Models0.19 发布说明明确指出以下估计器用相同数据与参数重新拟合时可能产生与上一版本不同的模型原因多为 Bug 修复或随机采样逻辑变化升级后务必复跑模型cluster.KMeans稀疏 X 给定初始质心时的 Bug 修复issue #7872cross_decomposition.PLSRegressionscaleTrue时缩放不当issue #7819ensemble.GradientBoostingClassifier/Regressormin_impurity_split被忽略、浮点比较除零等梯度提升lossquantile负误差计算错误issue #8087ensemble.IsolationForest平均路径长度公式错误issue #8549feature_selection.SelectFdrBenjamini-Hochberg 过程实现不精确issue #7490linear_model.RANSACRegressor、LassoLars、LassoLarsICAIC/BIC 计算修复issue #9022manifold.TSNE多项实现修复详见下文neighbors.NearestCentroidshrinkage 实现修复issue #9219semi_supervised.LabelSpreading/LabelPropagation按论文修正实现issue #9239使用min_weight_fraction_leaf的树模型快速路径优化issue #7441model_selection.StratifiedKFold(shuffleTrue)issue #7823当时未在发布说明中提及重点 Bug 修复解析TSNE 的重构0.19 对manifold.TSNE做了大量修复是本次迭代的重点之一early_exaggeration参数此前不生效现在用于前 250 次优化迭代修复 Barnes-Hut 近似的AssertionError: Tree consistency failedissue #8992学习率调度改为对齐参考实现 lvdmaaten/bhtsne使结果更接近参考实现修复kl_divergence_存储错误issue #6507与梯度下降收敛问题issue #8768Barnes-Hut 方法的内存占用进一步优化。指标与模型评估修复metrics.average_precision_score不再对工作点做线性插值改为按最近工作点以来的 recall 变化加权精度PR 曲线下的实际面积此前用该函数报告的结果需要复核metrics.matthews_corrcoef修复整数溢出0.19.1并新增多分类支持metrics.cohen_kappa_score新增sample_weight参数并修复confusion_matrix的整数溢出cross_val_predict对所有method取值返回正确形状的输出修复GridSearchCV.inverse_transform误调用transform的 Bugissue #8344validation_curve不再为每个参数值复用同一个估计器对象issue #7365。数据处理与特征工程修复datasets.make_classification不再修改传入的weightsissue #9865并修复生成超过 30 个特征时的失败issue #8159datasets.make_moons修复n_samples为奇数时结果错误issue #8198feature_selection.mutual_info_regression正确使用n_neighborsissue #8181preprocessing.normalize对稀疏矩阵的return_normTrue行为规范化FeatureHasher不再强制施加稀疏随机投影使HashingVectorizer可以正常与TfidfTransformer组合进 Pipelineissue #7565各估计器的fit现在接受pandas.Series类型的sample_weightissue #7825。API 变更摘要弃用与移除路线图0.19 的 API 变更遵循弃用后保留一个版本再移除的规范节奏树与集成梯度提升的基础模型不再被视为估计器所有基于树的估计器以min_impurity_decrease取代min_impurity_split后者弃用。线性与核模型SGD 系估计器的n_iter参数弃用改用max_iter/tollinear_model.RandomizedLasso、RandomizedLogisticRegression弃用0.21 移除。其他预测器neighbors.LSHForest因性能不佳被弃用0.21 移除NearestCentroid不再支持metricprecomputed使用即报错LabelPropagation的alpha参数失效并弃用0.21 移除。分解、流形与聚类LatentDirichletAllocation的n_topics更名为n_components0.21 移除旧名perplexity的doc_topic_distr参数弃用SparsePCA.transform的ridge_alpha参数弃用改为类参数cluster.DBSCAN新增metric_params参数。特征选择与预处理feature_selection.SelectFromModel的partial_fit仅在底层估计器支持时才存在threshold在fit时校验并设置threshold_而非延迟到transformFeatureHasher的non_negative参数弃用替换为更规范的alternate_sign。模型评估与元估计器GridSearchCV/RandomizedSearchCV的fit_params构造参数弃用改为向fit方法传关键字参数以便与cross_val_predict等工具协同0.21 起仅指定train_size时test_size将取剩余样本OneVsRestClassifier仅在底层估计器支持时才暴露partial_fit、decision_function、predict_proba二分类decision_function输出形状统一为(n_samples,)MultiOutputClassifier.predict_proba由 3D 数组改为返回长度为n_outputs的 2D 数组列表Pipeline.named_steps由普通 dict 改为utils.Bunch支持交互环境中的 Tab 补全与 dict 属性冲突时优先 dict 行为。杂项transform/inverse_transform的y参数弃用最低依赖版本提升为 SciPy 0.13.3、NumPy 1.8.2sklearn.utils中相应的回填函数被移除或弃用QuadraticDiscriminantAnalysis的store_covariances/covariances_更名为store_covariance/covariance_0.21 移除旧名同时拥有decision_function与predict_proba的估计器必须保证二者单调一致utils.estimator_checks新增check_decision_proba_consistency检查utils.estimator_checks.check_estimator改为接受估计器实例估计器以_结尾的属性不得在构造函数中设置而只能在fit中产生ensemble.BaseEnsemble派生类仅fit后有estimators_。升级与回归测试建议综合三份发布说明从 0.18 升级到 0.19 时建议按以下清单核对复跑模型对照上文Changed Models列表凡涉及的估计器都要重新拟合并验证结果复核指标若曾使用metrics.average_precision_score报告结果需按 0.19 的新算法重新计算ndcg_score/dcg_score在 0.19.0 中被误合并后于 0.19.1 移除勿依赖API 迁移将n_iter迁移到max_iter/tol将min_impurity_split迁移到min_impurity_decrease将fit_params改为fit关键字参数将n_topics改为n_components显式声明return_train_score由于默认值即将在 0.21 变更建议在GridSearchCV、RandomizedSearchCV、cross_validate中显式传参关注 TSNE 输出差异若管道依赖 t-SNE 嵌入结果0.19 的修复会使嵌入与旧版不同。结语0.19 版本确立了 scikit-learn 后续多个版本的技术方向LocalOutlierFactor、QuantileTransformer、ClassifierChain、多指标评估与 Pipeline 缓存如今仍是生态中的基础能力弃用一个版本、次大版本移除的 API 演进纪律也从这一版本开始变得明确。对于阅读源码的开发者本仓库中 sklearn/neighbors/_lof.py、sklearn/preprocessing/_data.py、sklearn/multioutput.py、sklearn/model_selection/_validation.py 等文件即是理解这些特性的第一手资料。【免费下载链接】scikit-learnscikit-learn: machine learning in Python项目地址: https://gitcode.com/gh_mirrors/sc/scikit-learn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表