ARTICLE DETAIL

资讯详情

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

sklearn机器学习实战:从数据预处理到AdaBoost调参

sklearn机器学习实战:从数据预处理到AdaBoost调参 1. 先搞明白sklearn到底帮你解决了什么问题如果你是刚接触机器学习不久或者已经在用Python写数据分析脚本但还没系统用过sklearn那我建议你先停下来想一想建模这件事真正耗时耗力的地方到底在哪很多人以为机器学习难在算法本身其实恰恰相反。等你真正上手一个实际项目就会发现80%的时间都花在数据清洗、特征处理、模型对比、参数调整和结果验证这些环节上。你需要的不是自己从零手写一个逻辑回归或随机森林而是一套统一、稳定、经过大规模验证的工具接口让你可以把“数据变成模型”这件事做得又快又规范。sklearn就是Python生态里最主流的这套工具库全称scikit-learn。它解决的是从“干净表格数据”到“可用模型”之间的全部标准流程。具体来说它提供了三类核心能力一是数据预处理和特征构建的工具比如缺失值填充、标准化、编码、特征选择二是大量经典机器学习算法的统一实现包括线性模型、支持向量机、树模型、集成学习、聚类、降维等三是模型评估和选择的标准流程比如交叉验证、各种评分指标、网格搜索调参。换句话说只要你的数据能表达成二维表格行是样本列是特征sklearn基本都能帮你跑完整个建模流程。而且它最值得称赞的一点是API设计高度统一。你学会了一个模型的fit和predict就等于学会了所有模型的fit和predict。这种一致性让学习成本极低也让代码的可维护性非常高。哪怕你后续转到深度学习、用PyTorch或者TensorFlowsklearn里养成的“数据预处理 → 训练 → 评估 → 调参”这套流程思维依然通用。所以这篇内容不是去抄官方文档而是按我做项目时实际会走的路径把sklearn从安装、数据预处理、特征构建到建模评估、调参优化再到一个完整的AdaBoost实战串一遍。适合三类人看刚学完Python基础想入门机器学习的新手、已经在用pandas做分析想进一步建模的读者、以及有建模经验但想系统梳理一遍sklearn流程的从业者。2. 环境准备sklearn安装与版本选择的几个坑2.1 安装其实很简单但别装错环境sklearn的安装基本就一条命令的事。大多数情况下你只需要确保自己已经安装了Python和pip然后在命令行执行pip install scikit-learn如果你用的是Anaconda或者Miniconda管理Python环境那更推荐用conda安装因为conda会自动帮你处理numpy、scipy这些底层依赖的版本兼容问题conda install scikit-learn这里要特别提醒一句很多初学者最容易踩的坑是在系统自带的Python环境里装了包然后在虚拟环境里运行代码结果报ModuleNotFoundError。建议从第一天起就养成用虚拟环境管理项目的习惯创建环境后确认一下当前用的是哪个Python解释器再安装依赖。安装完成后可以用一行代码确认版本python -c import sklearn; print(sklearn.__version__)正常会输出类似1.3.0这样的版本号。看到版本号说明安装成功了。2.2 版本背后藏着不少兼容性问题如果你的环境比较老比如Python还是3.7那就需要注意了。sklearn从1.1版本开始逐渐放弃对旧版Python的支持1.3版本要求Python至少3.81.4版本要求3.9到1.5版本以后则要求Python 3.10以上。如果你因为某些历史项目还在用旧Python那可能需要固定安装某个旧版本pip install scikit-learn1.0.2反过来如果你用的sklearn版本太老很多新功能是没有的比如1.2版本才引入的fit_predict统一接口、1.3版本才默认启用的新配色等。我个人的建议是新项目直接上最新稳定版旧项目尽量保持原版本别乱升因为sklearn的大版本更新偶尔会改变某些参数的默认值升级后可能导致线上结果变化。还有一个容易忽略的点sklearn依赖numpy、scipy和joblib。如果你手动安装了最新的numpy而sklearn版本较旧可能会出现类似“ValueError: numpy.ndarray size changed”的报错。这种情况通常就是numpy和sklearn版本不匹配造成的最简单的处理方式是用conda统一安装让依赖解析器帮你搞定或者降低numpy版本对齐。离线环境下安装也常见。如果你在内网工作没法直接连pip源可以先在一台能联网的机器上执行pip download scikit-learn -d ./packages然后把packages目录拷贝到内网机器再执行pip install --no-index --find-links./packages scikit-learn这种方式能避免在离线环境里逐个手动装依赖的麻烦。3. 数据预处理与特征构建建模前80%的功夫都在这里sklearn官方有一个非常经典的理念数据决定了模型的上限算法只是在逼近这个上限。我在实际项目里也深有体会同样的模型特征处理好与不好结果能差出好几个百分点。所以这一章重点说说在sklearn里做数据预处理和特征构建的实操方法。3.1 先看数据长什么样从pandas到sklearnsklearn的输入数据习惯用numpy二维数组或DataFrame。大多数情况下我们先用pandas读数据、做初步探查再交给sklearn处理。举个典型例子import pandas as pd from sklearn.model_selection import train_test_split df pd.read_csv(data.csv) X df.drop(columns[target]) y df[target] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy )这里有个小细节值得展开train_test_split里的random_state参数很多人不理解为什么要设置。简单说这个参数固定了随机切分的种子让每次运行得到相同的训练集和测试集划分。如果不设置每次运行结果都不一样你就没法对比不同模型或不同参数的真实效果因为数据划分不一致会引入额外的干扰。我一般习惯固定为42纯属个人习惯但固定一个值是好习惯。3.2 缺失值处理SimpleImputer的正确打开方式真实数据几乎都会带缺失值。sklearn提供了SimpleImputer用来处理这类问题。它做的事情就是用一个统计量去替换缺失值常见策略有三种mean用该列均值填充适用于数值型特征。median用中位数填充对异常值更稳健。most_frequent用众数填充适用于类别型特征。实操代码from sklearn.impute import SimpleImputer import numpy as np imputer SimpleImputer(strategymedian) X_train_imp imputer.fit_transform(X_train) X_test_imp imputer.transform(X_test)注意这里的关键点先用fit_transform拟合训练集再用transform直接处理测试集。为什么因为填充用的均值或中位数必须只从训练集计算得到。如果你先对整个数据集计算统计量再填充其实已经引入了“未来信息”会导致模型评估结果偏乐观这在机器学习里叫数据泄漏。这是个非常隐蔽但影响很大的错误在实际业务中经常能看到有人犯。3.3 特征缩放让模型收敛更快、结果更稳特征缩放是数值型特征处理里的重要步骤。什么叫特征缩放就是把不同量纲的特征统一到相近的尺度。比如你有一个特征是“年龄”取值20到60另一个特征是“收入”取值5000到50000两个特征数值差异很大。很多算法比如SVM、KNN、逻辑回归在计算距离或者梯度时量纲大的特征会主导结果量纲小的特征几乎不起作用这会严重影响模型效果。sklearn里最常用的两个缩放器是StandardScaler和MinMaxScalerfrom sklearn.preprocessing import StandardScaler, MinMaxScaler scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train_imp) X_test_scaled scaler.transform(X_test_imp)StandardScaler把特征变成均值为0、标准差为1的分布适合大多数模型MinMaxScaler把特征压缩到0到1之间适合对数据分布有明确范围要求的场景比如图像像素值。同样缩放器也只能在训练集上fit再transform测试集原因和缺失值填充一样都是为了杜绝数据泄漏。3.4 类别特征编码OneHotEncoder与OrdinalEncoder的区别表格数据里除了数值列往往还有“城市”“性别”“职业”这类类别型特征。sklearn里最常用的是OneHotEncoder和OrdinalEncoder。OneHotEncoder是把一个类别列拆成多个0/1列。比如“城市”列有北京、上海、广州三个值OneHot会把它变成“北京”“上海”“广州”三列每行只有对应的那列是1其余是0。这个做法的好处是没有引入虚假的顺序关系缺点是一列变多列维度膨胀。OrdinalEncoder则是把类别映射成整数比如“小0、中1、大2”。它适用于类别本身有顺序关系的场景。如果你把无关的类别也编码成0/1/2模型会误以为2比1大、1比0大可能引入错误先验。所以两者到底选哪个取决于你的业务含义。实操代码from sklearn.preprocessing import OneHotEncoder encoder OneHotEncoder(handle_unknownignore) X_train_encoded encoder.fit_transform(X_train_cat) X_test_encoded encoder.transform(X_test_cat)这里handle_unknownignore很实用。它的作用是当测试集里出现训练集没见过的类别时不会报错而是全置为0。这在线上环境里特别重要因为新数据里随时可能出现新类别。3.5 特征构建别只盯着原始列组合特征有时更有效特征构建是特征工程里最有想象力的部分也是头歌这类实训平台上“数据预处理与特征构建sklearn”模块重点训练的能力。它的核心思路是在原有特征的基础上通过数学变换或组合产生更有区分度的新特征。最简单的做法是用PolynomialFeatures生成多项式特征from sklearn.preprocessing import PolynomialFeatures poly PolynomialFeatures(degree2, include_biasFalse) X_train_poly poly.fit_transform(X_train_scaled)这段代码会把所有特征的两两组合项和平方项都生成出来。比如你有x1和x2两个特征degree2时会得到x1、x2、x1^2、x2^2、x1*x2这5个特征。这种做法的思路是有的真实关系并非线性二次项或交互项可能比原始特征更能刻画规律。特征构建还包括业务层面的手工构造。比如电商数据里有“点击次数”和“浏览时长”两个字段你可以构造一个“平均每次点击的浏览时长”这往往比单独两个特征更有业务含义。再比如时间特征可以从日期列里拆出“星期几”“是否周末”“距月初多少天”等对很多销售预测场景非常有效。特征构建做得好模型效果能提升一大截。但也要注意别过度构建特征数量膨胀会带来计算开销和过拟合风险。什么时候该停最直接的办法是用下一章要讲的特征选择方法去砍低价值特征。3.6 特征选择给模型做减法特征选择的意义可以这么理解你手里的原始特征加上构造的特征可能已经上百个了但其中真正对预测目标有贡献的可能只有二三十个。多余的冗余特征不仅增加训练耗时还可能引入噪声导致过拟合。sklearn里常用的特征选择方法有三类第一种是基于方差过滤。VarianceThreshold会把方差低于阈值的特征删掉因为方差太小意味着这个特征几乎不变化基本没有信息量from sklearn.feature_selection import VarianceThreshold selector VarianceThreshold(threshold0.1) X_train_selected selector.fit_transform(X_train_encoded)第二种是单变量特征选择比如SelectKBest配合f_classif它会计算每个特征与目标之间的统计量选出得分最高的K个特征。第三种是基于模型的重要性选择比如用随机森林训练一次得到每个特征的重要性分数然后保留最重要的前N个。这个做法我个人用得最多因为效果通常比前两种更好。实际项目里特征选择不是必须的步骤但当特征数量确实很大、或者模型训练变慢时它是个很有效的简化手段。更重要的是特征选择结果还能反向帮助我们理解业务哪些特征最重要往往能给出很有价值的业务洞察。4. 从训练到评估Pipeline、交叉验证与调参4.1 为什么推荐用Pipeline把流程串起来如果你的建模流程一直是手动一步步执行“填充缺失值 → 缩放 → 编码 → 切分 → 训练”很容易出现两个问题一是代码冗长、容易出错二是测试集处理时容易漏掉某一步导致训练集和测试集处理方式不一致。sklearn的Pipeline就是为解决这个问题设计的。它把数据预处理和模型训练串成一个整体对象from sklearn.pipeline import Pipeline from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import StandardScaler pipe Pipeline([ (scaler, StandardScaler()), (clf, RandomForestClassifier(n_estimators100, random_state42)) ]) pipe.fit(X_train, y_train) score pipe.score(X_test, y_test)用了Pipeline之后你不需要再手动管理每个预处理器的fit和transform顺序pipe.fit会依次对数据做标准化然后用随机森林训练pipe.score会自动对测试集做同样的标准化再评估模型。这大大降低了流程管理的复杂度也从根本上避免了数据泄漏问题。我强烈建议所有多步骤建模流程都用Pipeline封装。4.2 交叉验证到底在验证什么train_test_split把数据一次性切分成训练集和测试集只能评估一次。问题是这一次划分是否公平如果恰好训练集里某些类别多了、测试集里少了结果就可能不稳定。交叉验证的思路是把训练数据切成K份每次用K-1份训练用剩下1份验证轮流K次最后取K次验证分数的平均值。这样每个样本都有机会成为验证数据评估结果更稳定可靠。sklearn里的用法from sklearn.model_selection import cross_val_score scores cross_val_score(pipe, X_train, y_train, cv5, scoringaccuracy) print(scores.mean(), scores.std())cv5表示5折交叉验证。输出的均值反映了模型在当前数据上的平均表现标准差反映了稳定性。标准差越小说明模型对不同数据子集的表现差异越小泛化能力更值得信赖。交叉验证主要用于模型选择和参数调优阶段。当你确定最终模型后再用测试集做一次最终评估这样才能保证测试集不是被反复“窥探”的。4.3 GridSearchCV与RandomizedSearchCV调参不是玄学模型调参时经常面对一个问题参数组合太多怎么找最优sklearn提供了网格搜索和随机搜索两种工具。GridSearchCV是穷举指定参数的所有组合然后通过交叉验证评估每组参数的效果from sklearn.model_selection import GridSearchCV param_grid { clf__n_estimators: [50, 100, 200], clf__max_depth: [None, 10, 20], clf__min_samples_split: [2, 5, 10] } grid_search GridSearchCV(pipe, param_grid, cv5, scoringaccuracy, n_jobs-1) grid_search.fit(X_train, y_train) print(grid_search.best_params_) print(grid_search.best_score_)注意参数名里的双下划线clf__n_estimators这是Pipeline的固定语法意思是“clf”这个步骤下的n_estimators参数。如果没有Pipeline直接写n_estimators就行。当参数空间很大时网格搜索的耗时呈指数级增长。这时候可以用RandomizedSearchCV它会在参数空间中随机采样固定次数的组合大大缩短时间from sklearn.model_selection import RandomizedSearchCV from scipy.stats import randint param_dist { clf__n_estimators: randint(50, 300), clf__max_depth: [None, 10, 20, 30], clf__min_samples_split: randint(2, 20) } random_search RandomizedSearchCV(pipe, param_dist, n_iter50, cv5, scoringaccuracy, n_jobs-1) random_search.fit(X_train, y_train)我的经验是先用随机搜索快速锁定一个大致范围再在这个范围内用网格搜索精调兼顾效率与精度。4.4 不同任务怎么选评估指标很多刚入门的朋友拿到分类任务就默认用accuracy准确率但实际业务里准确率往往会骗人。举个典型例子假设99%的样本是类别A1%是类别B一个“永远预测A”的模型准确率是99%看起来很高实际一个B都预测不出来毫无业务价值。sklearn在sklearn.metrics下面提供了非常完整的评估指标分类任务accuracy_score、precision_score、recall_score、f1_score、roc_auc_score。回归任务mean_squared_error、mean_absolute_error、r2_score。我的建议是先搞清楚业务里“哪种错误代价更高”。如果是疾病筛查漏诊的代价远高于误诊那就应该重点关注recall如果是垃圾邮件过滤把正常邮件误判成垃圾邮件的代价很高那就应该重点关注precision。F1分数是两者的调和平均在不明确偏好时可以用它作为综合指标。sklearn里还有一个非常好用的工具classification_report一行代码输出所有常用分类指标from sklearn.metrics import classification_report print(classification_report(y_test, y_pred))输出的表格清晰显示了每个类别的precision、recall、f1-score和支持样本数做模型对比时非常方便。5. 完整实战用sklearn的AdaBoost做一个二分类模型5.1 AdaBoost是什么为什么值得单独拿出来说如果你搜索过“sklearn中的adaboost”应该知道AdaBoostClassifier是sklearn集成学习模块里一个非常经典的算法。它的全称是Adaptive Boosting中文叫自适应提升算法。核心思想可以这么理解把一堆弱分类器通常是深度很浅的决策树按顺序串起来每个分类器都重点关注前一个分类器分错的样本最后把所有分类器的结果加权汇总得到一个强分类器。打个比方你带三个实习生第一个实习生先做一批题做错的题让第二个实习生重点复习第二个实习生做错的再让第三个实习生重点突破最后三个人的判断投票决定答案。每个实习生单独看能力一般但组合起来效果惊人。我选择拿AdaBoost做实战案例一是因为它和决策树、随机森林同属树模型家族前面讲的特征工程、Pipeline方法能直接用上二是因为AdaBoost对特征缩放不敏感非常适合作为了解集成学习的入门算法。5.2 从一张表到一个可用的模型为了演示完整流程我直接用make_classification生成一份模拟数据这就省去了找数据的麻烦from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score, classification_report X, y make_classification( n_samples2000, n_features10, n_informative8, n_redundant2, random_state42 ) X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy )make_classification是sklearn提供的数据生成器可以一键生成带标签的分类数据。参数里n_samples是样本数n_features是特征总数n_informative是真正对分类有贡献的特征数n_redundant是由信息特征组合而成的冗余特征数。生成的X是numpy数组y是0/1标签。接下来定义基础弱学习器。AdaBoost默认使用决策树但可以通过estimator参数指定。我比较推荐显式定义一棵深度为1的决策树作为弱学习器这样既保留了AdaBoost的“提升”空间又不容易过拟合base_estimator DecisionTreeClassifier(max_depth1) model AdaBoostClassifier( estimatorbase_estimator, n_estimators100, learning_rate1.0, random_state42 ) model.fit(X_train, y_train) y_pred model.predict(X_test) print(Accuracy:, accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred))这里几个参数值得解释一下n_estimators弱学习器的数量也就是串行训练多少个决策树。太少会欠拟合太多会增加训练时间且可能过拟合。实际使用中建议结合交叉验证去选。learning_rate学习率控制每个弱学习器对最终结果的贡献权重。学习率越小每棵树学得越保守需要更多棵树来拟合学习率越大模型越激进容易过拟合。两者是此消彼长的关系。random_state固定随机种子保证结果可复现。为了对比我顺便训练一个单棵决策树看看差异single_tree DecisionTreeClassifier(max_depth5, random_state42) single_tree.fit(X_train, y_train) y_pred_tree single_tree.predict(X_test) print(Single Tree Accuracy:, accuracy_score(y_test, y_pred_tree))从我个人经验来看在这类合成数据上AdaBoost的准确率通常会显著高于单棵决策树大约高出几个百分点到十几个百分点不等。而在真实数据上AdaBoost的优势同样存在但提升幅度取决于数据的噪声程度和特征质量。如果数据本身噪声很大AdaBoost因为会特别关注难分样本反而可能放大噪声这时候不是算法不好而是数据需要先清洗。5.3 特征重要性AdaBoost附带的高级功能树模型一个很大的优点是可以直接输出特征重要性分数。AdaBoost作为集成模型训练结束后也能通过feature_importances_拿到每个特征的重要性排序import numpy as np importance model.feature_importances_ for idx, imp in enumerate(importance): print(fFeature {idx}: {imp:.4f})特征重要性分数是0到1之间所有特征求和为1。分数越高说明这个特征对模型预测的贡献越大。这个信息在实际业务里非常宝贵它能告诉你“想要提升结果应该优先优化哪些数据”。举个例子假设你的模型是预测用户是否会续费特征重要性排第一的是“最近登录距今天数”排最后的是“用户的注册渠道”。那你就知道提升续费率的抓手在用户活跃度上而不是花大力气去细分渠道策略。5.4 用交叉验证给AdaBoost选个靠谱的参数上面直接用了n_estimators100但这个值是不是最优可以用上一章的交叉验证来验证from sklearn.model_selection import cross_val_score for n in [30, 50, 100, 200]: model_tmp AdaBoostClassifier( estimatorDecisionTreeClassifier(max_depth1), n_estimatorsn, learning_rate1.0, random_state42 ) scores cross_val_score(model_tmp, X_train, y_train, cv5, scoringaccuracy) print(fn_estimators{n}, CV Accuracy{scores.mean():.4f} (/- {scores.std():.4f}))这样输出后你能清楚看到树的数量从30增加到200时模型的平均准确率和稳定性变化。如果30和100差别不大那出于效率考虑选30就够了如果100明显好那就选100。调参的本质就是在“模型效果”和“训练成本”之间找平衡点而不是盲目追求最高分。5.5 别忘了看ROC曲线和AUC最后分类任务里除了准确率ROC曲线和AUC值也是非常重要的评估手段。ROC曲线展示的是不同阈值下真正例率TPR和假正例率FPR的关系而AUC是ROC曲线下的面积。AUC越大说明模型把正类排在负类前面的能力越强。from sklearn.metrics import roc_auc_score, roc_curve import matplotlib.pyplot as plt y_proba model.predict_proba(X_test)[:, 1] print(AUC Score:, roc_auc_score(y_test, y_proba)) fpr, tpr, thresholds roc_curve(y_test, y_proba) plt.plot(fpr, tpr, labelAdaBoost) plt.plot([0, 1], [0, 1], linestyle--, colorgray) plt.xlabel(False Positive Rate) plt.ylabel(True Positive Rate) plt.legend() plt.show()predict_proba返回的是每个样本属于各个类别的概率取[:, 1]就是正类的概率。ROC曲线越靠近左上角模型效果越好。当AUC在0.8以上时基本可以认为模型有较好的判别能力0.9以上则属于表现优秀。6. 实际项目里最常见的报错与排查思路6.1 导入报错与版本冲突报错信息ImportError: cannot import name xxx from sklearn这类报错十有八九是sklearn版本过旧或过新导致的。因为sklearn某些模块和函数是后来新增或改名过的比如旧版本里sklearn.preprocessing没有PolynomialFeatures这样的函数或者某些新模块只在新版本里才有。排查步骤很固定先去查一下你当前sklearn版本再去官方文档确认你用的这个函数出现在哪个版本。如果确实版本太旧升级到较新版本即可。报错信息ValueError: numpy.ndarray size changed, may indicate binary incompatibility这个报错在手动更新numpy后特别常见。原因是sklearn在安装时编译链接的是旧版numpy新numpy的底层数据结构变了就导致冲突。解决方法也很简单把sklearn和numpy一起重装或者直接用conda统一管理。6.2 数据维度与类型不匹配报错信息Expected 2D array, got 1D array instead这是新手特别容易遇到的。sklearn的fit接口要求输入是二维数组而如果你直接传了一列数据会得到一个一维数组就会触发这个报错。解决方法是用X.reshape(-1, 1)或者X[[column_name]]保持二维结构。报错信息Input contains NaN这个报错非常直白数据里有缺失值但模型不接受NaN。说明你的预处理步骤里漏了缺失值填充或者填充步骤是放在Pipeline之外的某个环节被跳过了。用Pipeline能很好避免这个问题。6.3 训练集与测试集处理不一致这类问题不报错但比报错更危险。比如你手动对训练集做了标准化却在测试集上用了训练集的均值方差这个过程如果漏了一步transform模型评估结果会偏差很大。排查方法是逐行检查测试集的处理代码确认每个预处理器都在训练集上fit过并用同样的参数transform测试集。这也是我一直推荐用Pipeline的原因它从机制上杜绝了这类失误。6.4 类别不平衡怎么办实际业务里经常遇到正样本极少的情况比如故障检测里故障样本可能只占1%。这时候直接用准确率评估没有意义模型只需要全预测负类就能得到99%的准确率。处理思路有几种用class_weightbalanced参数让模型自动调整类别权重让少数类的错分代价更高。用RandomUnderSampler或SMOTE等采样方法平衡数据。评估指标改用recall、precision、AUC放弃accuracy。sklearn里最方便的就是直接在模型里设置class_weight很多分类器都支持这个参数。我建议在做类别不平衡项目时先不动数据直接加上class_weight跑一轮看看效果不够再上采样方法。6.5 模型训练慢怎么办训练慢的原因一般有三种数据量大、特征数量多、模型复杂。先分析是哪一种再做针对性优化。如果是特征太多先做特征选择如果是模型太复杂可以适当降低n_estimators或者max_depth如果是数据量太大可以考虑对训练数据做采样或者使用n_jobs-1开启多核并行。比如GridSearchCV里设置n_jobs-1可以把网格搜索并行到所有CPU核心上速度提升非常明显。6.6 关于随机种子为什么同样的代码结果不同random_state是一个无处不在的参数。它在模型里控制初始随机状态保证每次运行时结果一致。很多人不设置这个参数然后发现每次运行结果都不一样误以为自己模型不稳定。其实只要固定了random_state结果就能复现。我的习惯是每个模型、每个数据切分都设置random_state42一是为了方便复现二是为了对比不同模型时消除随机因素。7. 关于sklearn学习的几个私房建议最后分享几点个人经验都是踩过坑摸爬滚打出来的。第一点别急着上复杂模型。我在建模初期有个坏习惯总想用最新最复杂的算法。后来发现大多数业务问题先用线性模型或者一棵浅决策树做baseline把流程跑通、评估指标确定好再逐步换更复杂的模型整个过程会清晰很多。sklearn的优势就在于它的算法可以无缝替换baseline和最终模型之间只改一行代码。第二点多做对比不要只看单一指标。同样的数据逻辑回归、决策树、随机森林、AdaBoost、SVM跑出来的效果各有千秋。只有多跑几个模型横向对比你才能判断“这个效果到底是算法的功劳还是数据本身就容易分得开”。第三点先保证流程正确再追求调参收益。用一个默认参数的模型跑通全流程比用一堆花哨参数但流程有泄漏要重要得多。数据预处理、特征构建、交叉验证、Pipeline这几件事做好了通常就已经能拿到七八成的提升调参只是锦上添花。第四点多读sklearn官方文档和示例代码。sklearn的文档质量在开源库里算是非常高的每个算法都有使用示例、参数说明和背后的数学原理链接。遇到不熟悉的算法先去官方文档看示例比自己瞎猜参数靠谱得多。如果你能把上面这些内容都实践一遍相信用sklearn处理标准表格型数据已经没什么障碍了。后续再遇到具体问题多看看报错信息、多查查文档一切都会慢慢顺手起来。
返回列表