目录
1. K近邻(K-NN)
2. 线性回归(一元/多元)
3. 逻辑回归
4. 决策树
5. 集成学习之随机森林
6. 贝叶斯(朴素/高斯)
7. SVM(支持向量机)
8. K-means聚类
9. DBSCAN
10. TF-IDF
11. 词向量转换(如Word2Vec)
12. PCA降维
13. XGBoost
1. K近邻(K-NN)
原理:无训练过程,预测时找测试样本最近的K个邻居,按邻居类别投票(分类)或取平均(回归)。
Python实现流程:
-
导入库,加载数据并标准化(消除量纲影响)。
-
划分训练集(X_train, y_train)与测试集(X_test, y_test)。
-
初始化KNN模型(指定K值)。
-
用训练集"拟合"(仅存储数据,model.fit(X_train, y_train))。
-
预测(model.predict(X_test))并评估(分类用accuracy,回归用MSE)。
核心库:scikit-learn(sklearn.neighbors.KNeighborsClassifier/Regressor)、numpy、pandas
重要概念与关键参数:
-
概念:距离度量(如欧氏距离,衡量样本相似度)、K值选择(K过小易过拟合,过大欠拟合)。
-
参数:n_neighbors(K值,默认5)、metric(距离度量,默认'minkowski'即欧氏距离)。
适用问题:简单分类(手写数字识别)、回归(房价初步预测),适合小数据、低维度场景。
面试官可能提问及回答:
-
问:K-NN为什么需要对数据标准化?如果不标准化,哪些特征会影响结果?
答:因为K-NN基于距离度量(如欧氏距离),若特征量纲差异大(如"年龄(0-100)"和"收入(0-100万)"),收入的数值差异会主导距离计算,掩盖年龄的影响。标准化(如Z-score)能将所有特征缩放到同一区间,让各特征对距离的贡献均衡。
-
问:当数据量很大或特征维度很高时,K-NN的性能会受什么影响?怎么优化?
答:会出现"维度灾难"(高维下样本距离趋近一致,邻居失去意义)和"计算缓慢"(预测时需遍历所有训练样本)。优化方法:①降维(如PCA)减少特征维度;②用KD树/球树索引训练样本,加速邻居搜索;③采样(如随机采样)减少训练样本量。
-
问:K值怎么确定?如果K取1或整个数据集大小,分别会出现什么问题?
答:K值通常通过交叉验证(如5折CV)选择——遍历多个K值,取验证集效果最好的。若K=1,模型会完全拟合训练集中的噪声,过拟合严重;若K=整个数据集大小,所有测试样本的邻居都是全量训练样本,预测结果恒为训练集多数类(分类)或平均值(回归),模型欠拟合,失去预测意义。
-
问:K-NN是参数模型还是非参数模型?非参数模型的优缺点是什么?
答:是非参数模型——它不预设数据分布,也没有固定参数(参数数量随训练样本增加而增加)。优点:①无需假设数据分布,对非线性数据适应性强;②实现简单。缺点:①训练样本需全部存储,内存消耗大;②高维/大数据场景下预测慢;③对异常值和量纲敏感。
-
问:除了欧氏距离,K-NN还能用哪些距离度量?不同距离适合什么场景?
答:①曼哈顿距离(L1):适合高维数据或存在异常值的场景(对异常值敏感度低于欧氏距离);②余弦距离:适合文本(如TF-IDF向量)、图像(如特征向量)等"关注方向而非大小"的场景,衡量样本相似度;③汉明距离:适合二进制数据(如用户行为是否点击),衡量特征差异次数。
2. 线性回归(一元/多元)
原理:构建线性方程(y=wx+b),通过最小二乘法最小化预测值与实际值的平方误差,拟合数据趋势(一元单特征,多元多特征)。
Python实现流程:
-
导入库,加载数据,预处理(处理缺失值、标准化多元特征)。
-
划分训练集与测试集。
-
初始化线性回归模型。
-
训练模型(model.fit(X_train, y_train))。
-
预测(y_pred = model.predict(X_test))并评估(MAE、R²)。
核心库:scikit-learn(sklearn.linear_model.LinearRegression)、numpy、pandas
重要概念与关键参数:
-
概念:最小二乘法(最小化平方误差)、多重共线性(多元特征高相关,影响系数稳定性)。
-
参数:fit_intercept(是否计算截距,默认True)、normalize(是否标准化特征,默认False)。
适用问题:连续值预测(房价、销售额、气温),特征与目标呈线性关系的场景。
面试官可能提问及回答:
-
问:线性回归的损失函数为什么用平方误差(MSE)?用绝对误差(MAE)可以吗?两者有什么区别?
答:用MSE的原因:①MSE是凸函数,存在唯一最优解,可通过梯度下降或正规方程高效求解;②MSE对误差的惩罚是非线性的(误差越大,惩罚越重),能重点关注大误差。MAE可以用,但缺点是:①在误差为0处不可导,需用次梯度下降,求解效率低;②对所有误差惩罚相同,对大误差不敏感。实际中,若数据有较多异常值,MAE更稳健(受异常值影响小);无异常值时MSE更常用。
-
问:如何检测多元线性回归中的多重共线性?检测到后怎么处理?
答:检测方法:①计算特征间的相关系数矩阵,若两特征相关系数绝对值>0.8,可能存在共线性;②计算方差膨胀因子(VIF),VIF>10表示共线性严重(VIF=1/(1-R²),R²是该特征对其他特征的回归拟合度)。处理方法:①删除冗余特征(如删除VIF最大的特征);②特征融合(如将高度相关的"身高""体重"合并为"BMI");③用岭回归(L2正则)降低共线性对系数的影响。
-
问:R²和调整后R²有什么区别?为什么要引入调整后R²?
答:R²衡量模型对数据的解释能力(R²=1-残差平方和/总平方和),取值范围[0,1],R²越大越好。但普通R²有缺陷:只要增加特征(即使是无关特征),R²不会下降反而可能上升,无法客观反映模型性能。调整后R²引入了特征数量的惩罚项(调整后R²=1-[(1-R²)*(n-1)/(n-p-1)],n是样本数,p是特征数),当增加无关特征时,调整后R²可能下降,能更真实地评估多特征模型的解释能力。
-
问:线性回归假设数据满足哪些条件?如果不满足(比如误差不服从正态分布),会有什么影响?
答:经典线性回归的假设:①线性性(特征与目标呈线性关系);②误差独立性;③误差同方差性(误差方差恒定);④误差正态分布。若误差不服从正态分布,在小样本下,参数的置信区间和假设检验(如t检验)会不准确;但在大样本下,根据中心极限定理,参数估计仍会渐近正态,影响较小。若违反"同方差性"(如误差方差随特征增大而增大),系数估计仍无偏,但方差会被低估,导致模型稳定性下降。
-
问:当特征和目标是非线性关系时,还能用线性回归吗?怎么改造?
答:可以用,需通过"特征非线性变换"将非线性关系转为线性关系。例如:①若目标与特征呈二次关系(y=ax²+b),可新增特征x²,模型变为y=a*(x²)+b,仍为线性回归;②若呈指数关系(y=ae^x+b),可对目标取对数(ln y = ln a +x + ln b),转为线性模型;③也可引入多项式特征(如sklearn的PolynomialFeatures),将x扩展为x、x²、x³等,再用线性回归拟合。
3. 逻辑回归
原理:用sigmoid函数将线性回归输出映射到[0,1],输出类别概率,通过阈值判断实现二分类。
Python实现流程:
-
导入库,加载数据,预处理(编码分类特征、标准化)。
-
划分训练集与测试集。
-
初始化模型(指定正则化类型)。
-
训练模型(model.fit(X_train, y_train))。
-
预测类别(model.predict(X_test))或概率(predict_proba),评估用AUC、混淆矩阵。
核心库:scikit-learn(sklearn.linear_model.LogisticRegression)、numpy、pandas
重要概念与关键参数:
-
概念:sigmoid函数(将线性输出转为概率)、正则化(L1/L2,防止过拟合)。
-
参数:penalty(正则化类型,'l1'/'l2',默认'l2')、C(正则强度倒数,C越小正则越强)。
适用问题:二分类任务(垃圾邮件识别、疾病诊断、客户流失预测)。
面试官可能提问及回答:
-
问:逻辑回归为什么用sigmoid函数?不用其他函数(比如tanh)的原因是什么?
答:sigmoid函数(σ(z)=1/(1+e^-z))的核心优势:①输出范围[0,1],可直接解释为类别概率(如σ(z)=0.8表示样本属于正类的概率为80%);②单调递增,线性输出z越大,正类概率越高,符合分类直觉;③导数易计算(σ'(z)=σ(z)(1-σ(z))),便于梯度下降求解。tanh函数输出范围[-1,1],无法直接映射为概率,需额外缩放,且在z=0附近的梯度比sigmoid大,对噪声更敏感,因此不适合逻辑回归。
-
问:逻辑回归的损失函数是什么?为什么不用MSE作为损失函数?
答:逻辑回归用交叉熵损失(二分类:L=-[ylnσ(z)+(1-y)ln(1-σ(z))])。不用MSE的原因:MSE与sigmoid函数结合后,损失函数是非凸的(存在多个局部最优解),梯度下降可能陷入局部最优;且当预测概率与标签差异大时(如σ(z)=0.9但y=0),MSE的梯度会很小(接近饱和),导致模型收敛缓慢。交叉熵损失是凸函数,且梯度与预测误差正相关,收敛更快。
-
问:L1和L2正则化在逻辑回归中的作用有什么不同?L1为什么能做特征选择?
答:L1正则化(损失+λ|w|)会使部分特征的系数收缩到0,实现特征选择——因为L1的 penalty是"绝对值",在梯度下降时,对系数的惩罚是恒定的,当λ足够大时,不重要特征的系数会被压缩至0,相当于删除该特征。L2正则化(损失+λw²)会使所有特征的系数均匀缩小(但不会到0),主要作用是降低模型复杂度,防止过拟合,同时能缓解多重共线性(让高相关特征的系数更稳定)。
-
问:当数据正负样本不平衡时,逻辑回归的结果会有什么问题?怎么解决?
答:问题:模型会偏向多数类(如正样本占10%,负样本占90%,模型直接预测所有样本为负类,accuracy也能达到90%),导致少数类(如正类)的召回率极低,失去实际意义。解决方法:①调整分类阈值(如默认0.5,可降至0.3,让更多样本被预测为正类);②样本重采样(过采样少数类:SMOTE算法生成少数类合成样本;欠采样多数类:随机删除部分多数类样本);③调整损失权重(如sklearn的class_weight='balanced',让少数类的损失权重更高)。
-
问:逻辑回归能处理多分类问题吗?如果能,有哪两种常见方法?
答:能,两种核心方法:①一对多(One-vs-Rest, OVR):为每个类别训练一个二分类模型(如3分类:模型1区分"类1vs其他",模型2区分"类2vs其他",模型3区分"类3vs其他"),预测时取概率最大的类别;②一对一(One-vs-One, OVO):为每对类别训练一个二分类模型(如3分类需训练3个模型:类1vs类2、类1vs类3、类2vs类3),预测时通过"投票"确定最终类别。OVR适合类别数少的场景(效率高),OVO适合类别数多的场景(精度更高,但训练成本高)。
4. 决策树
原理:基于信息增益(分类)或MSE(回归)递归划分特征,构建树状模型,通过路径决策输出结果。
Python实现流程:
-
导入库,加载数据,预处理(无需标准化)。
-
划分训练集与测试集。
-
初始化模型(指定任务类型:分类/回归)。
-
训练模型(model.fit(X_train, y_train))。
-
预测并评估(分类用accuracy,回归用MSE),可可视化树结构。
核心库:scikit-learn(sklearn.tree.DecisionTreeClassifier/Regressor)、matplotlib(可视化)
重要概念与关键参数:
-
概念:信息增益(划分后不确定性降低程度)、剪枝(预剪枝/后剪枝,防止过拟合)。
-
参数:max_depth(树最大深度,限制过拟合)、min_samples_split(节点分裂最小样本数)。
适用问题:分类(鸢尾花品种识别)、回归(房价预测),适合解释性要求高的场景。
面试官可能提问及回答:
-
问:决策树分类时,除了信息增益,还有哪些特征划分准则?它们的区别是什么?
答:还有信息增益比和基尼系数。区别:①信息增益:偏向选择取值多的特征(如"身份证号"这类唯一值特征,划分后信息增益极大,但无泛化能力);②信息增益比:在信息增益基础上除以"特征熵"(取值多的特征熵更大),平衡对多取值特征的偏好,适合作为C4.5算法的划分准则;③基尼系数:衡量节点纯度(基尼=1-Σ(类别概率)²,基尼越小纯度越高),计算速度比信息增益快(无需对数运算),是CART算法的划分准则,对噪声更稳健。
-
问:决策树为什么容易过拟合?预剪枝和后剪枝分别有哪些具体方法?
答:过拟合原因:决策树会递归划分特征直到"每个叶子节点纯度最高"(如每个叶子只含一个样本),导致模型完全记住训练数据,无法泛化到测试数据。①预剪枝(训练中停止树生长):设置max_depth(树最大深度)、min_samples_split(节点分裂需至少n个样本)、min_samples_leaf(叶子节点至少n个样本),当满足条件时停止分裂;②后剪枝(训练完再剪枝):先构建完整决策树,再从叶子节点向上"剪枝"(将子树替换为叶子节点),通过交叉验证判断剪枝后模型是否更优,常见方法有"代价复杂度剪枝(CCP)"。
-
问:决策树对异常值敏感吗?为什么?
答:相对不敏感。因为决策树是基于"特征阈值划分"的模型(如"年龄>30""收入<50万"),异常值(如收入=1亿)只会影响自身所在的划分路径,不会改变其他样本的划分逻辑;且在计算划分准则(如信息增益、基尼系数)时,异常值的权重与普通样本一致,对整体纯度的影响较小。相比之下,线性回归、SVM对异常值更敏感(会直接影响超平面或回归线的位置)。
-
问:如何解释决策树的结果?比如用它做客户流失预测,怎么告诉业务方"为什么这个客户会流失"?
答:决策树的解释性极强,可通过"决策路径"直观说明。例如:某客户流失的决策路径是"月消费>500元 → 客服投诉次数≥2次 → 会员等级<VIP",对应的叶子节点是"流失"。可告诉业务方:"该客户因月消费高(>500元)但多次投诉未解决(≥2次),且会员等级低(非VIP),因此流失风险高。建议优先跟进高消费且有投诉记录的非VIP客户。"
-
问:当特征中有类别特征(如性别、职业)和连续特征(如年龄、收入)时,决策树会怎么处理这两种特征?
答:①类别特征:若为无序类别(如职业:教师、医生、工程师),会尝试"每个类别单独作为划分阈值"(如"职业=教师"vs"职业≠教师"),计算每种划分的准则值(如信息增益),选最优划分;若为有序类别(如学历:小学<中学<大学),会按顺序合并类别(如"小学+中学"vs"大学"),寻找最优划分点。②连续特征:会将特征值排序,尝试所有"相邻样本的中间值"作为划分阈值(如年龄排序后,尝试18.5、25.5等),计算每个阈值的准则值,选最优阈值(如"年龄>30.5")。
5. 集成学习之随机森林
原理:集成多棵决策树,每棵树用Bootstrap采样数据和随机特征训练,结果通过投票(分类)或平均(回归)输出。
Python实现流程:
-
导入库,加载数据,预处理(无需标准化)。
-
划分训练集与测试集。
-
初始化模型(指定树数量)。
-
训练模型(model.fit(X_train, y_train))。
-
预测并评估,可查看特征重要性(model.feature_importances_)。
核心库:scikit-learn(sklearn.ensemble.RandomForestClassifier/Regressor)
重要概念与关键参数:
-
概念:集成学习(多模型融合降低误差)、Bootstrap采样(随机抽取样本训练单树)。
-
参数:n_estimators(树数量,默认100)、max_features(单树最大特征数,默认'auto')。
适用问题:复杂分类(图像分类)、回归(股票价格预测),抗过拟合能力强,适合高维数据。
面试官可能提问及回答:
-
问:随机森林为什么能比单棵决策树效果好?它是怎么降低方差(过拟合)的?
答:核心逻辑是"集成学习的多样性增益"——单棵决策树易过拟合(方差大),而随机森林通过"两个随机性"保证树的多样性:①Bootstrap采样(每棵树用训练集的63.2%样本训练,样本不同);②随机特征选择(每棵树仅用部分特征划分,特征不同)。多样的树会产生不同的预测误差,通过"投票/平均"可抵消部分随机误差,最终降低整体模型的方差,同时保留决策树的低偏差优势(因为每棵树仍能拟合数据趋势)。
-
问:Bootstrap采样会导致部分样本没被选中(袋外样本OOB),这些样本有什么用?
答:OOB样本(约36.8%的训练样本)可作为"天然的验证集",无需额外划分测试集就能评估模型性能。例如:某棵树未使用样本A,可用这棵树预测样本A,所有未使用A的树的预测结果投票/平均,得到A的OOB预测值,最终用所有样本的OOB预测值计算accuracy(分类)或MSE(回归),作为模型的无偏评估指标。此外,OOB样本还可用于评估特征重要性(通过打乱某特征后OOB误差的变化)。
-
问:随机森林中的"随机"体现在哪两个方面?如果去掉这两个随机性,会变成什么模型?
答:两个随机性:①样本随机(Bootstrap采样,每棵树用不同的训练样本);②特征随机(每棵树分裂时,仅从所有特征中随机选一部分(如sqrt(总特征数))作为候选特征)。若去掉这两个随机性:每棵树都会用全量训练样本和全量特征训练,所有树完全相同,集成结果与单棵决策树一致,相当于"单树模型",失去集成的多样性优势,过拟合问题会重现。
-
问:随机森林怎么评估特征重要性?如果特征中有高度相关的变量,会对特征重要性评估有什么影响?
答:评估方法:①节点不纯度减少量(每棵树中,特征每次划分带来的"信息增益/基尼系数减少量"求和,再除以总树数,得到特征重要性);②OOB置换检验(打乱某特征的取值,若OOB误差显著上升,说明该特征重要)。高度相关特征的影响:会导致"重要性被分摊"——例如特征A和B高度相关(都对目标有强影响),模型可能随机选择A或B进行划分,两者的重要性得分都会偏低,无法准确反映单个特征的真实重要性。
-
问:当数据量很大时,随机森林训练速度慢,有什么优化方法?
答:①调整参数:减少n_estimators(树数量,如从200减到100,精度下降有限但速度提升显著)、增大max_features(如从sqrt(n)到n/2,减少单树特征选择时间)、限制max_depth(如设为10,减少单树训练时间);②并行训练:利用scikit-learn的n_jobs参数(如n_jobs=-1,使用所有CPU核心),因为每棵树的训练独立,可并行执行;③数据采样:对训练集进行随机采样(如取50%样本),减少训练数据量(需保证采样后数据分布与原数据一致);④使用轻量级实现(如FastForest)或降维(如PCA)减少特征维度。
6. 贝叶斯(朴素/高斯)
原理:基于贝叶斯定理,假设特征条件独立,计算样本属于各类的概率,取最大概率类为结果(高斯贝叶斯假设特征服从高斯分布)。
Python实现流程:
-
导入库,加载数据,预处理(文本转词频向量,连续特征无需标准化)。
-
划分训练集与测试集。
-
初始化模型(文本用MultinomialNB,连续特征用GaussianNB)。
-
训练模型(model.fit(X_train, y_train),计算类概率与特征概率)。
-
预测并评估(accuracy、混淆矩阵)。
核心库:scikit-learn(sklearn.naive_bayes.GaussianNB/MultinomialNB)
重要概念与关键参数:
-
概念:条件独立性假设(简化计算,忽略特征关联)、先验概率(样本属于某类的初始概率)。
-
参数:GaussianNB中var_smoothing(平滑方差,避免概率为0,默认1e-9)。
适用问题:文本分类(情感分析、垃圾邮件识别)、高维稀疏数据场景,速度快。
面试官可能提问及回答:
-
问:朴素贝叶斯的"朴素"体现在哪里?这个假设的优缺点是什么?
答:"朴素"体现在"特征条件独立性假设"——假设给定类别后,所有特征之间相互独立(如文本分类中,假设"喜欢"和"开心"两个词的出现互不影响)。优点:①极大简化计算(无需计算特征间的联合概率,只需计算单个特征的条件概率);②减少参数需求,适合高维稀疏数据(如文本)。缺点:①实际场景中特征往往不独立(如"购买电脑"和"购买键盘"高度相关),会导致概率估计偏差,影响模型精度;②对特征间的依赖关系敏感,若依赖强,模型效果会显著下降。
-
问:为什么朴素贝叶斯在文本分类中表现很好?即使文本特征间有相关性也能用?
答:原因有三:①文本数据是高维稀疏的,特征(词)数量极多但大部分词出现频率低,独立性假设的偏差对整体概率计算影响较小;②文本分类的核心是"区分类别相关词"(如垃圾邮件中的"中奖""汇款"),这类词的条件概率差异显著,即使有部分特征相关,仍能主导分类结果;③朴素贝叶斯计算速度极快(训练仅需统计词频,预测仅需计算概率),适合大规模文本数据(如百万级邮件分类),性价比高。
-
问:当某个特征在训练集中某个类别下从未出现过时(概率为0),会导致什么问题?怎么解决?
答:问题:根据贝叶斯公式,若某特征的条件概率为0(如"垃圾邮件"类别下从未出现"机器学习"一词),则整个类别的后验概率会被乘以0,导致该类别被直接排除,即使其他特征强烈支持该类别,也会预测错误("零概率问题")。解决方法:拉普拉斯平滑(对所有特征的条件概率分子加1,分母加该特征的取值数),例如:某词在垃圾邮件中出现0次,总词数1000,平滑后概率=(0+1)/(1000+V)(V是词表大小),避免概率为0。
-
问:GaussianNB、MultinomialNB、BernoulliNB分别适合什么类型的数据?
答:①GaussianNB:适合连续型特征(如身高、体重、温度),假设每个类别下的特征服从高斯分布(正态分布),通过计算样本在该分布下的概率密度来得到条件概率;②MultinomialNB:适合离散计数型特征(如文本词频、用户购买商品次数),假设特征服从多项式分布,核心用于文本分类(如TF-IDF向量、词袋向量);③BernoulliNB:适合二值离散特征(如文本中词是否出现、用户是否点击某按钮),假设特征服从伯努利分布(取值0或1),也可用于文本分类(基于词的存在与否,而非出现次数)。
-
问:朴素贝叶斯是生成模型还是判别模型?生成模型和判别模型的区别是什么?
答:朴素贝叶斯是生成模型。核心区别:①生成模型:先学习数据的联合概率分布P(X,y),再通过贝叶斯公式推导后验概率P(y|X)=P(X|y)P(y)/P(X),本质是"学习数据的生成机制",代表模型有朴素贝叶斯、隐马尔可夫模型(HMM);②判别模型:直接学习后验概率P(y|X)或决策函数f(X)=y,不关注数据生成机制,本质是"学习特征到类别的映射",代表模型有逻辑回归、SVM、决策树。生成模型的优势是数据量小时更稳健,可处理缺失值;判别模型的优势是精度更高,适合复杂数据。
7. SVM(支持向量机)
原理:找到最优超平面最大化两类样本间隔,非线性问题通过核函数映射到高维空间实现线性可分。
Python实现流程:
-
导入库,加载数据,预处理(必须标准化)。
-
划分训练集与测试集。
-
初始化模型(指定核函数)。
-
训练模型(model.fit(X_train, y_train))。
-
预测并评估(分类用accuracy,回归用MSE)。
核心库:scikit-learn(sklearn.svm.SVC/SVR)、numpy
重要概念与关键参数:
-
概念:核函数(如RBF,低维转高维)、软间隔(允许少量样本越界,平衡间隔与误差)。
-
参数:kernel(核函数类型,'linear'/'rbf',默认'rbf')、C(软间隔惩罚系数,C越大惩罚越重)。
适用问题:小样本分类(文本分类)、回归,高维数据(基因数据)场景。
面试官可能提问及回答:
-
问:SVM中的"支持向量"指的是什么?为什么只关注支持向量,不关注其他样本?
答:支持向量是"距离最优超平面最近的样本"(包括间隔边界上的样本和软间隔中越界的样本)。因为最优超平面的位置由这些支持向量唯一决定——移除非支持向量,超平面不会改变(间隔大小和方向不变),非支持向量对超平面的构建没有贡献。因此,SVM训练和预测时,只需关注支持向量,能减少计算量,同时保证模型泛化能力(支持向量反映了两类样本的边界信息)。
-
问:为什么SVM用核函数就能处理非线性问题?核函数的"核技巧"本质是什么?
答:非线性数据在低维空间无法用超平面分隔(如环形数据),但映射到高维空间后可能线性可分(如环形数据映射到3维空间可找到平面分隔)。核函数的核心是"核技巧"——无需显式将数据映射到高维空间,而是直接在低维空间计算"高维空间中样本的内积"。例如RBF核(K(x1,x2)=e^(-γ||x1-x2||²)),其对应的高维映射是无穷维的,但内积计算仍在低维完成,避免了"维度灾难"(高维空间计算量爆炸),高效实现非线性分类。
-
问:线性SVM和逻辑回归在二分类任务中有什么区别?分别适合什么场景?
答:区别:①损失函数:SVM用 hinge损失(关注支持向量,对异常值不敏感),逻辑回归用交叉熵损失(关注所有样本的概率);②决策边界:SVM追求"最大间隔"(鲁棒性强),逻辑回归追求"概率拟合"(可输出类别概率);③复杂度:SVM在高维小样本场景下更优,逻辑回归在大数据场景下训练更快(可在线学习)。场景:①小样本、高维数据(如基因数据分类)、对鲁棒性要求高:选线性SVM;②需要输出概率(如风险评估需给出"违约概率")、大数据场景、在线学习:选逻辑回归。
-
问:SVM的C参数和RBF核的gamma参数分别控制什么?调大gamma会有什么影响?
答:①C参数:控制软间隔的惩罚强度——C越大,对"越界样本"的惩罚越重,模型会追求更小的训练误差(间隔变小),易过拟合;C越小,惩罚越轻,允许更多样本越界,间隔变大,易欠拟合。②gamma参数:控制RBF核的"高斯半径"——gamma越大,高斯半径越小,核函数的局部性越强(仅关注样本附近的点),模型会拟合训练集中的细节(包括噪声),易过拟合;gamma越小,局部性越弱,模型更关注全局趋势,易欠拟合。
-
问:SVM处理大样本数据时效率低,为什么?有什么改进方法?
答:效率低的原因:传统SVM训练需求解二次规划问题,时间复杂度为O(n²)(n是样本数),当n>10万时,计算量和内存消耗极大。改进方法:①工程优化:用SMO(序列最小优化)算法(将大二次规划拆分为多个小问题求解),降低时间复杂度;②样本采样:对大样本集进行随机采样(如取10%样本),用采样后的小样本训练SVM(需保证采样数据分布与原数据一致);③核函数优化:用线性核(时间复杂度O(n))替代RBF核,若数据非线性,可先降维(如PCA)再用线性核;④使用近似算法:如LibSVM、LibLinear等库的高效实现,支持并行计算和稀疏数据优化。
8. K-means聚类
原理:无监督学习,指定K个初始聚类中心,迭代将样本分配到最近中心并更新中心,最小化簇内方差。
Python实现流程:
-
导入库,加载数据,标准化(消除量纲影响)。
-
用肘部法则确定最优K值。
-
初始化模型(指定K值)。
-
训练模型(model.fit(X),迭代优化中心)。
-
获取聚类标签(model.labels_),可视化聚类结果。
核心库:scikit-learn(sklearn.cluster.KMeans)、matplotlib
重要概念与关键参数:
-
概念:聚类中心(簇的代表点)、肘部法则(通过簇内误差变化找最优K)。
-
参数:n_clusters(K值,需指定)、n_init(初始化中心次数,默认10,避免局部最优)。
适用问题:数据聚类(用户分群、客户画像)、异常检测初步,适合凸形簇。
面试官可能提问及回答:
-
问:K-means的迭代停止条件是什么?
答:常见两个停止条件(满足其一即可):①聚类中心不再变化(两次迭代中,所有中心的坐标变化量小于预设阈值,如1e-4);②簇内平方和(SSE,所有样本到其簇中心的距离平方和)不再变化(变化量小于阈值)。此外,也可设置最大迭代次数(如sklearn的max_iter默认300),防止因数据特殊导致迭代无法收敛。
-
问:初始聚类中心的选择对K-means结果有什么影响?sklearn中是怎么处理这个问题的?
答:影响:K-means对初始中心敏感——若初始中心选在同一簇内,最终会导致"簇重叠"(部分簇无样本,部分簇样本过多),陷入局部最优解。sklearn的处理方法:通过n_init参数(默认10),随机初始化10组不同的聚类中心,分别训练K-means,最终选择"簇内平方和(SSE)最小"的一组结果,大幅降低陷入局部最优的概率。
-
问:除了肘部法则,还有什么方法确定K值?轮廓系数的取值范围和意义是什么?
答:其他方法:①轮廓系数(Silhouette Coefficient):对每个样本计算"轮廓值"=(样本到其他簇的平均距离-样本到自身簇的平均距离)/max(两者),所有样本的轮廓值平均值即为模型的轮廓系数,取值范围[-1,1]——越接近1,聚类效果越好(样本在自身簇内紧密,与其他簇分离);越接近-1,聚类效果越差(样本可能分错簇)。②Calinski-Harabasz指数:计算(簇间方差和/簇数-1)/(簇内方差和/样本数-簇数),指数越大,聚类效果越好(簇间差异大,簇内差异小)。
-
问:K-means对非凸形状的簇(比如环形簇)效果不好,为什么?怎么解决?
答:原因:K-means基于"欧氏距离"和"簇内方差最小化",会将样本分配到"最近的中心",导致非凸簇(如环形簇)被错误分为多个凸簇(如环形中心的样本会被归为一个簇,环形外围的样本被归为另一个簇)。解决方法:①用密度聚类算法(如DBSCAN),通过样本密度划分簇,天然支持非凸形状;②用核K-means(将数据通过核函数映射到高维空间,再做K-means),高维空间中环形簇可能变为凸簇;③用谱聚类(基于图论,将聚类问题转为图分割问题),适合非凸、高维数据。
-
问:K-means对异常值敏感吗?异常值会对聚类结果产生什么影响?怎么处理异常值?
答:敏感。因为异常值(如远离所有样本的点)会显著拉大簇内方差(SSE),为了最小化SSE,K-means可能会将异常值单独分为一个簇(浪费K值),或让正常簇的中心向异常值偏移,导致聚类结果失真。处理方法:①聚类前用统计方法检测并删除异常值(如Z-score>3的样本、IQR外的样本);②用K-means++初始化中心(优先选择远离已有中心的样本,减少异常值成为初始中心的概率);③用加权K-means(给异常值分配较低权重,降低其对聚类中心的影响);④用基于密度的方法(如DBSCAN),自动将异常值标记为噪声,不参与簇划分。
9. DBSCAN
原理:密度聚类,基于样本密度划分簇,通过"核心点"(邻域内样本数达标)和"密度可达"关系形成任意形状簇,无需指定K。
Python实现流程:
-
导入库,加载数据,标准化。
-
调整参数eps(邻域半径)和min_samples(核心点最小样本数)。
-
初始化DBSCAN模型。
-
训练模型(model.fit(X)),得到聚类标签。
-
可视化聚类结果,-1表示异常点。
核心库:scikit-learn(sklearn.cluster.DBSCAN)、numpy
重要概念与关键参数:
-
概念:核心点(邻域内样本数≥min_samples)、密度可达(通过核心点链连接的样本)。
-
参数:eps(邻域半径,需根据数据分布调整)、min_samples(核心点最小样本数,默认5)。
适用问题:非凸形状聚类(空间点聚类)、异常检测(欺诈识别),能处理噪声。
面试官可能提问及回答:
-
问:DBSCAN中的核心点、边界点、噪声点分别是什么?怎么区分?
答:①核心点:以该点为中心,半径eps的邻域内包含的样本数≥min_samples(自身也计入);②边界点:邻域内样本数<min_samples,但该点可通过"密度可达"(即存在一条核心点链,从核心点到该点的所有点都在彼此的eps邻域内)连接到某个核心点;③噪声点(异常值):既不是核心点,也无法通过密度可达连接到任何核心点,最终被标记为-1。例如:环形簇中,环形上的样本是核心点(邻域内样本多),环形内侧少量样本是边界点(邻域内样本少但能连接到核心点),远离环形的点是噪声点。
-
问:eps和min_samples这两个参数怎么调优?如果eps太小或太大,会出现什么问题?
答:调优方法:①先固定min_samples(通常设为"特征数+1",如2维数据设为3),用"K距离图"选eps——计算每个样本到其第min_samples个最近邻居的距离,排序后画图,找"拐点"(距离突然增大的点)对应的距离作为eps;②再调整min_samples(如3、5、7),通过聚类结果的合理性(如簇数量、噪声点比例)验证。问题:①eps太小:大部分样本被归为噪声点,仅少数密集样本形成小簇;②eps太大:所有样本被归为一个簇,无法区分不同簇。
-
问:DBSCAN和K-means相比,优缺点分别是什么?
答:
维度
DBSCAN 优点
DBSCAN 缺点
K-means 优点
K-means 缺点
簇形状
支持任意形状(凸、非凸)
-
仅支持凸形簇
无法处理非凸形状
参数依赖
无需指定K,但需调eps和min_samples
参数对结果影响大,调优难
仅需指定K,调优简单(如肘部法则)
依赖K值,对初始中心敏感
噪声处理
自动标记噪声点,抗噪声能力强
-
对噪声敏感,易影响聚类中心
-
数据适应性
适合密度不均匀的数据
对密度差异大的数据效果差
适合密度均匀的凸簇数据
对密度不均匀、非凸数据效果差
效率
时间复杂度O(n²),大数据场景慢
-
时间复杂度O(nKiter),效率高
-
-
问:当数据密度不均匀时(比如有的区域样本密、有的区域疏),DBSCAN会遇到什么问题?怎么解决?
答:问题:"密度偏差导致簇分裂或合并"——例如数据中有"密集小簇"和"稀疏大簇",若eps设为适合密集簇的值,稀疏大簇会被拆分为多个小簇或标记为噪声;若eps设为适合稀疏簇的值,密集小簇会合并为一个大簇。解决方法:①用"层次DBSCAN"(HDBSCAN),通过不同eps值构建密度层次结构,自动选择最优密度水平,适应密度不均匀数据;②对数据分区域处理(如先将数据按密度分区,再在每个区域内跑DBSCAN);③用"可变eps"(根据样本局部密度调整eps,密集区域eps小,稀疏区域eps大)。
-
问:DBSCAN怎么用于异常检测?和其他异常检测算法(比如孤立森林)比有什么优势?
答:DBSCAN用于异常检测的逻辑:将无法通过密度可达连接到任何核心点的样本(噪声点)视为异常值。优势:①无需假设数据分布(非参数方法),对非线性、非凸数据的异常检测效果好;②能同时完成聚类和异常检测,适合"先分群再找异常"的场景(如用户分群后找异常用户);③抗噪声能力强,不会将密集区域的正常样本误判为异常。相比之下,孤立森林的优势是效率高(适合大数据),但对密集型异常(如簇内的孤立点)检测效果不如DBSCAN。
10. TF-IDF
原理:文本特征提取方法,通过词频(TF)和逆文档频率(IDF)衡量词在文档中的重要性(词频高且少文档出现的词更重要)。
Python实现流程:
-
导入库,准备文本数据(如句子列表)。
-
初始化TF-IDF转换器。
-
拟合文本数据(学习词表与IDF)。
-
转换文本为TF-IDF向量(X = model.transform(texts))。
-
用向量做后续任务(如分类、检索)。
核心库:scikit-learn(sklearn.feature_extraction.text.TfidfVectorizer)
重要概念与关键参数:
-
概念:词频(TF)(词在文档中出现次数)、逆文档频率(IDF)(log(总文档数/含该词的文档数))。
-
参数:max_features(保留最高频的词数,控制维度)、stop_words(停用词列表,如'english'去除英文虚词)。
适用问题:文本分类、信息检索、关键词提取,处理结构化文本数据。
面试官可能提问及回答:
-
问:TF-IDF的计算公式是什么?IDF部分为什么要用对数?
答:TF-IDF=TF×IDF。其中:①TF(词频)=某词在文档中的出现次数/该文档总词数(或直接用出现次数,即"原始TF");②IDF(逆文档频率)=log(总文档数/(含该词的文档数+1))(加1是为了避免含该词的文档数为0时分母为0)。IDF用对数的原因:①压缩IDF的取值范围(若总文档数1000,含该词的文档数10,IDF=log(100)=2;若含该词的文档数1,IDF=log(1000)=3,避免IDF值过大);②让IDF的增长呈线性减缓,符合"词的重要性随含该词的文档数增加而递减,但递减速度逐渐变慢"的直觉(如含该词的文档数从1到2,重要性下降明显;从100到200,重要性下降不明显)。
-
问:为什么要去除停用词?停用词对TF-IDF结果有什么影响?
答:停用词是"在文本中频繁出现但无实际语义的词"(如英文的"the""and",中文的"的""是")。去除停用词的原因:①减少特征维度(停用词占比高,去除后可大幅降低TF-IDF向量的维度,提升后续模型训练速度);②避免干扰重要词的权重——停用词的TF很高(几乎每个文档都有),但IDF很低(含该词的文档数接近总文档数),TF-IDF值虽不高,但大量停用词会占用特征空间,可能掩盖关键语义词(如"机器学习""人工智能")的重要性,影响模型精度。
-
问:TF-IDF和词袋模型(Bag of Words)有什么区别?TF-IDF解决了词袋模型的什么问题?
答:区别:①词袋模型:仅统计词在文档中的出现次数(或是否出现),生成"词频向量",不考虑词的重要性(如"的"和"机器学习"的权重相同);②TF-IDF:在词频基础上乘以IDF,突出"词频高且少文档出现"的词,赋予其更高权重。TF-IDF解决了词袋模型的"词权重无差别"问题——词袋模型中,频繁出现的停用词(如"的")和关键语义词(如"机器学习")权重相同,无法区分词的重要性;而TF-IDF通过IDF惩罚了频繁出现在多个文档中的词,让关键语义词的权重更高,更符合文本处理的需求(如文本分类中,关键语义词对类别判断更重要)。
-
问:处理中文文本时,用TF-IDF前需要做什么额外步骤(和英文比)?
答:英文文本天然以空格分隔单词,而中文文本是连续字符(如"我爱机器学习"),需额外做分词处理(将连续字符拆分为独立单词,如"我/爱/机器学习"),这是中文TF-IDF处理的核心额外步骤。具体流程:①文本清洗(去除标点、特殊符号、数字);②分词(用jieba、THULAC等工具,如jieba.lcut("我爱机器学习"));③去除停用词(加载中文停用词表,如哈工大停用词表,删除"的""是"等词);④后续步骤(计算TF-IDF)与英文一致。若不分词,中文文本会以单个字符为单位(如"我""爱""机"),无法体现语义,TF-IDF向量会失去意义。
-
问:当文本中出现生僻词(只在个别文档中出现一次),TF-IDF值会很高,这会有什么问题?怎么处理?
答:问题:生僻词(如"颟顸""觊觎")的IDF很高(含该词的文档数少),即使TF=1,TF-IDF值也会很高,但这类词往往无实际语义或仅在特定文档中有用,会导致:①特征维度冗余(生僻词数量多,增加TF-IDF向量维度);②模型过拟合(模型可能过度关注生僻词,将其作为分类的"假特征",无法泛化到测试集)。处理方法:①词频过滤(用TfidfVectorizer的min_df参数,如min_df=2,保留至少在2个文档中出现的词,过滤仅在1个文档中出现的生僻词);②手动构建生僻词表,直接过滤;③用"词干提取"或"词形还原"(对英文有效,中文可用品词标注过滤无意义的生僻词)。
11. 词向量转换(如Word2Vec)
原理:将词映射到低维稠密向量,通过上下文训练使语义相近的词向量距离近(如"国王-男人+女人≈女王")。
Python实现流程:
-
导入库,准备文本数据(分词后的句子列表)。
-
初始化Word2Vec模型(指定向量维度、窗口大小)。
-
训练模型(model.build_vocab(texts);model.train(texts, total_examples=model.corpus_count, epochs=model.epochs))。
-
获取词向量(model.wv['word'])。
-
用向量做NLP任务(如文本分类、相似度计算)。
核心库:gensim(gensim.models.Word2Vec)、nltk(分词)
重要概念与关键参数:
-
概念:分布式表示(向量包含语义信息)、CBOW/Skip-gram(两种训练模式,前者用上下文预测词,后者用词预测上下文)。
-
参数:vector_size(向量维度,默认100)、window(上下文窗口大小,默认5)、sg(0=CBOW,1=Skip-gram,默认0)。
适用问题:NLP任务(情感分析、机器翻译、命名实体识别),处理语义理解场景。
面试官可能提问及回答:
-
问:Word2Vec的CBOW和Skip-gram两种模式有什么区别?分别适合什么数据场景?
答:区别:①CBOW(连续词袋模型):输入"上下文词"(如"我/爱/学习"中的"我/学习"),预测"中心词"(如"爱"),本质是"用多个上下文词的平均向量预测中心词";②Skip-gram(跳字模型):输入"中心词"(如"爱"),预测"上下文词"(如"我/学习"),本质是"用单个中心词向量预测多个上下文词"。场景:①CBOW:训练速度快(每次输入多个词,梯度更新效率高),适合大数据、高频词场景,对低频词的表示效果较差;②Skip-gram:训练速度慢(每次输入一个词,需预测多个上下文词),但对低频词、罕见词的表示效果更好(能从少量出现次数中学习语义),适合小数据、需要精准表示低频词的场景。
-
问:Word2Vec的词向量为什么能体现语义关系(比如"国王-男人+女人≈女王")?
答:核心原因是Word2Vec的训练目标是"让语义相近的词在向量空间中距离相近"。训练时,模型通过上下文学习词的"共现模式"——例如"国王"常与"王后""城堡""国家"共现,"女王"也常与这些词共现,且"国王"与"男人"的共现差异、"女王"与"女人"的共现差异高度相似,导致向量空间中:"国王"的向量 - "男人"的向量 ≈ "女王"的向量 - "女人"的向量,整理后即"国王-男人+女人≈女王"。这种向量运算本质是捕捉了词在语义场景中的"角色差异",体现了语义关系。
-
问:Word2Vec和TF-IDF相比,优势是什么?
答:
维度
Word2Vec 优势
TF-IDF 劣势
向量性质
低维稠密向量(如100维),语义信息丰富
高维稀疏向量(维度=词表大小),无语义信息
语义理解
能捕捉词的语义相似性(如"猫"和"狗"向量近)
仅衡量词的文档重要性,无法体现语义相似性
一词多义
(部分改进模型如FastText、BERT)可处理一词多义
无法处理一词多义(同一词在不同文档中TF-IDF值不同,但向量无差异)
文本表示
可通过词向量平均得到文档向量,保留语义
文档向量是词频加权和,仅体现词的出现频率,无语义关联
下游任务适配
适合需要语义理解的任务(如情感分析、机器翻译)
适合文本检索、关键词提取等对语义要求低的任务
-
问:如果遇到训练集中没有的词(OOV词),怎么获取它的词向量?有哪些解决方法?
答:解决方法:①子词级模型:用FastText(Word2Vec的改进版),将词拆分为子词(如"机器学习"拆分为"机器""学习""机器学""器学习"),OOV词的向量可通过其子词向量的平均得到(只要OOV词的子词在训练集中出现过);②字符级模型:用字符级CNN/RNN训练词向量,OOV词可通过其字符序列生成向量(无需依赖训练集中的词);③预训练词向量:使用大规模语料预训练的词向量(如Google的300维Word2Vec、GloVe),OOV词若在预训练词表中,可直接调用;④上下文预测:用BERT等预训练语言模型,通过OOV词在具体句子中的上下文动态生成向量(最有效,能处理一词多义)。
-
问:除了Word2Vec,还有哪些常见的词向量模型?FastText和Word2Vec的区别是什么?
答:常见模型:Word2Vec、GloVe、FastText、BERT(动态词向量)。FastText和Word2Vec的核心区别:①词的表示方式:Word2Vec将每个词视为一个整体,生成唯一向量;FastText将词拆分为子词(n-gram),词向量是其子词向量的平均,支持OOV词(OOV词的子词若在训练集中,可生成向量);②训练数据:Word2Vec适合处理纯文本数据;FastText还能处理带有形态变化的语言(如英文的"run""running""ran",可通过子词共享语义信息);③训练速度:FastText训练速度比Word2Vec快(因为子词的共享性减少了参数数量);④精度:对低频词、罕见词,FastText的表示精度更高(子词提供了更多语义信息)。
12. PCA降维
原理:无监督降维,通过线性变换找到数据方差最大的主成分,将高维数据投影到低维空间,保留关键信息。
Python实现流程:
-
导入库,加载数据,标准化(保证各特征方差可比)。
-
初始化PCA模型(指定降维后维度或方差保留比例)。
-
训练模型(model.fit(X),计算主成分)。
-
对数据降维(X_pca = model.transform(X))。
-
分析主成分解释的方差比例(model.explained_variance_ratio_)。
核心库:scikit-learn(sklearn.decomposition.PCA)、numpy
重要概念与关键参数:
-
概念:主成分(数据方差最大的方向)、方差解释率(主成分保留的原数据信息比例)。
-
参数:n_components(降维后维度,可设0-1间的数表示方差保留比例,如0.95保留95%信息)。
适用问题:高维数据降维(图像、基因数据)、去噪,简化后续模型计算。
面试官可能提问及回答:
-
问:PCA的计算步骤是什么?
答:标准PCA的计算步骤:①数据中心化(将每个特征的均值减为0,即X = X - X.mean(axis=0),这是PCA的前提,确保主成分围绕原点旋转);②计算协方差矩阵(若数据是n行p列(n样本p特征),协方差矩阵为p×p矩阵,元素(i,j)是特征i和特征j的协方差);③计算协方差矩阵的特征值和特征向量(特征向量是主成分的方向,特征值表示主成分的方差大小);④对特征值降序排序,选择前k个最大特征值对应的特征向量(这k个特征向量即前k个主成分);⑤将原始数据投影到前k个主成分上,得到降维后的数据(X_pca = X × 主成分矩阵)。
-
问:PCA为什么需要对数据标准化?如果不标准化,哪些特征会主导主成分?
答:因为PCA是"基于方差最大化"的降维方法,方差大的特征会主导主成分的方向。若特征量纲差异大(如"身高(0-100cm)"和"收入(0-100万元)"),收入的数值范围远大于身高,其方差也远大于身高,导致第一主成分几乎完全由收入决定,身高的信息被忽略,降维后的数据无法反映身高的特征。标准化(如Z-score标准化:(X - mean)/std)能将所有特征的方差缩放到1,让各特征对主成分的贡献均衡,确保主成分能捕捉所有特征的关键信息。
-
问:第一主成分和第二主成分是什么关系?为什么要保证正交?
答:第一主成分和第二主成分是正交的(夹角90度,内积为0)。原因:①PCA的目标是"在降维后保留尽可能多的信息",正交能确保各主成分之间"信息不重叠"——第二主成分捕捉的是第一主成分未解释的方差(即与第一主成分无关的信息),若主成分不正交,会存在信息冗余,导致降维后的数据仍有较高的相关性,无法有效降低维度;②从计算角度,协方差矩阵是对称矩阵,其特征向量天然正交,因此主成分必然正交。
-
问:PCA是线性降维还是非线性降维?非线性降维有哪些方法?和PCA的区别是什么?
答:PCA是线性降维(通过线性变换将高维数据投影到低维空间)。常见非线性降维方法:t-SNE、LLE(局部线性嵌入)、Isomap(等距映射)。区别:①降维方式:PCA用全局线性变换,无法处理非线性数据(如环形数据);非线性降维用局部非线性变换(如t-SNE关注样本的局部邻域关系),能处理非线性数据,保留数据的局部结构;②目标:PCA追求"全局方差最大化",适合保留数据的全局结构;非线性降维(如t-SNE)追求"局部邻域关系不变",适合可视化高维数据(如将1000维的图像特征降维到2维可视化);③适用场景:PCA适合高维数据预处理(如降维后用SVM训练)、去噪;t-SNE适合高维数据可视化;LLE适合流形数据(如人脸图像)的降维。
-
问:PCA能用于特征选择吗?和直接基于特征重要性的选择方法有什么区别?
答:PCA不能直接用于特征选择(即不能直接选出原始特征中的"重要特征"),但可间接辅助特征选择。区别:①PCA的本质是"特征融合"——降维后的主成分是原始特征的线性组合(如主成分1=0.8×身高+0.2×体重),无法对应到单个原始特征,因此不能直接选出重要的原始特征;②基于特征重要性的选择方法(如决策树的feature_importances_、L1正则化):直接评估每个原始特征对目标的贡献,选出贡献大的特征,能保留原始特征的物理意义(如"身高"是重要特征)。PCA辅助特征选择的方式:通过主成分的载荷矩阵(特征对主成分的贡献度),找出对前k个主成分贡献大的原始特征,间接筛选出重要特征。
13. XGBoost
原理:优化的梯度提升树,串行训练决策树,每棵树拟合前序模型的残差,通过正则化和并行计算提升效率与性能。
Python实现流程:
-
导入库,加载数据,预处理(处理缺失值、编码分类特征)。
-
划分训练集与测试集,转为DMatrix格式(XGBoost专用)。
-
定义参数(学习率、树深度等)。
-
训练模型(model = xgb.train(params, dtrain, num_boost_round))。
-
预测(model.predict(dtest))并评估(分类用accuracy,回归用MSE)。
核心库:xgboost(xgboost.XGBClassifier/XGBRegressor)、pandas
重要概念与关键参数:
-
概念:正则化提升(加入树复杂度惩罚,减少过拟合)、并行计算(特征分裂候选点并行,加速训练)。
-
参数:learning_rate(学习率,默认0.1)、max_depth(树深度,默认3)、n_estimators(树数量,默认100)、objective(损失函数,如'binary:logistic'用于二分类)。
适用问题:高维数据分类(信用风险评估)、回归(销量预测),竞赛与工业界常用,精度高。
面试官可能提问及回答:
-
问:XGBoost和传统的梯度提升树(GBM)相比,有哪些优化?
答:XGBoost是"工程化优化的梯度提升树",核心优化点:①正则化优化:加入树复杂度惩罚项(叶子节点数+树深度),防止过拟合,传统GBM无正则化;②缺失值处理:自动学习缺失值的最优分裂方向(无需手动填充缺失值),传统GBM需手动处理;③并行计算:在"特征分裂候选点选择"阶段并行(非树训练并行,因为树是串行训练的),加速训练,传统GBM无并行;④梯度优化:用"二阶泰勒展开"近似损失函数,比传统GBM的一阶梯度更精准,收敛更快;⑤稀疏数据优化:针对稀疏特征(如one-hot编码后的特征),设计高效的分裂算法,减少计算量;⑥早停机制:训练过程中监控验证集误差,若误差连续多轮不下降则停止训练,避免过拟合。
-
问:XGBoost的目标函数由哪两部分组成?正则项包括哪些部分?
答:XGBoost的目标函数=损失函数+正则项。①损失函数:衡量模型预测值与真实值的差异,如二分类用"对数损失",回归用"平方损失",且通过二阶泰勒展开近似(损失≈一阶梯度×残差 + 0.5×二阶梯度×残差²),便于高效求解;②正则项:控制树的复杂度,防止过拟合,公式为λ×Σ(叶子节点权重²) + γ×(叶子节点数),其中:λ是叶子节点权重的L2正则系数(减少叶子节点权重的绝对值),γ是叶子节点数的惩罚系数(减少叶子节点数量,简化树结构)。
-
问:XGBoost怎么处理缺失值?和随机森林处理缺失值的方法有什么区别?
答:XGBoost处理缺失值的逻辑:训练时,对每个特征的分裂点,将缺失值样本分别分配到"左子树"和"右子树",计算两种分配方式的损失减少量,选择损失减少更多的分配方向,将该方向作为缺失值的默认分裂方向(后续训练和预测时,缺失值样本直接按该方向分裂)。区别:①XGBoost:自动学习缺失值的分裂方向,无需手动填充,适合缺失值比例高的场景;②随机森林:通过"袋外样本"或"特征重要性"间接处理缺失值——训练时,若某样本的特征缺失,该样本不参与该特征的分裂计算;或用"中位数/众数"填充缺失值(需手动处理),本质是"忽略缺失值的信息",不如XGBoost主动学习缺失值的分裂方向高效。
-
问:学习率(learning_rate)和树数量(n_estimators)之间有什么关系?调小学习率时,通常需要怎么调整n_estimators?
答:学习率(η)控制每棵树的贡献权重(最终预测值=Σ(η×单棵树预测值)),树数量(n_estimators)控制集成的树的总数,两者是"互补关系"。核心关系:①学习率越小,单棵树的贡献越小,需要更多的树才能达到足够的模型复杂度(即需要增大n_estimators),否则模型会欠拟合;②学习率越大,单棵树的贡献越大,需要 fewer 的树(减小n_estimators),否则模型会过拟合。例如:若将学习率从0.1调小到0.01,为了保持模型精度,通常需要将n_estimators从100增大到1000左右(具体需通过交叉验证调整)。
-
问:XGBoost容易过拟合吗?有哪些防止过拟合的参数?分别怎么起作用?
答:XGBoost虽然有正则化,但在数据量小、特征维度高或树数量过多时,仍可能过拟合。防止过拟合的核心参数及作用:①max_depth(树深度,默认3):限制树的最大深度,减少树的复杂度(深度越大,越容易拟合噪声);②min_child_weight(叶子节点最小样本权重和,默认1):若叶子节点的样本权重和小于该值,不分裂节点,防止生成过深的树;③subsample(样本采样比例,默认1.0):训练每棵树时,随机采样部分样本(如subsample=0.8,用80%样本训练),减少样本间的相关性;④colsample_bytree(特征采样比例,默认1.0):训练每棵树时,随机采样部分特征(如colsample_bytree=0.8,用80%特征训练),减少特征间的相关性;⑤reg_alpha(L1正则系数,默认0):对叶子节点权重施加L1正则,可让部分叶子节点权重为0,简化树结构;⑥reg_lambda(L2正则系数,默认1):对叶子节点权重施加L2正则,减少权重的绝对值,让模型更稳健;⑦early_stopping_rounds(早停轮次,如10):若验证集误差连续10轮不下降,停止训练,避免过多树导致过拟合。