【数分/生统/AI】必备面试通关指南知识点速通6

发布时间:2026/8/13 9:51:38
【数分/生统/AI】必备面试通关指南知识点速通6 Python 的 scikit-learn 库中都遵循着这套“五步走”的标准范式使用了 scikit-learn 自带的乳腺癌数据集二分类问题良性/恶性并选用最经典的随机森林Random Forest模型来完整演示这五个步骤。机器学习经典五步走标准代码# 导入所需的库importpandasaspdfromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_splitfromsklearn.ensembleimportRandomForestClassifierfromsklearn.metricsimportaccuracy_score,classification_report,confusion_matrix# # 0. 准备数据 (真实工作中这一步最耗时)# print(正在加载数据...)cancer_dataload_breast_cancer()Xpd.DataFrame(cancer_data.data,columnscancer_data.feature_names)# 特征矩阵 (如肿瘤大小、平滑度等)ycancer_data.target# 标签向量 (0:恶性, 1:良性)# # 1. 切分数据集 (Train-Test Split)# # 知识点千万不能用全量数据训练必须留一部分数据作为“期末考试”来测试模型的真实水平。# test_size0.2 表示 80% 作为训练集20% 作为测试集# random_state42 相当于设定了一个随机种子保证每次切分的结果都一样方便复现X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)print(f数据切分完毕: 训练集包含{X_train.shape[0]}个样本测试集包含{X_test.shape[0]}个样本。)# # 2. 实例化模型 (Instantiate)# # 知识点就像买了一台没开机的机器。你可以在括号里设置超参数调参就是调这里。# n_estimators100 表示这片森林里种 100 棵决策树modelRandomForestClassifier(n_estimators100,random_state42)print(模型已实例化准备训练...)# # 3. 喂数据 / 拟合模型 (Fit)# # 知识点模型开始学习。只把“训练集”的题目(X_train)和答案(y_train)喂给它。# 这一步如果是深度学习模型可能会跑好几天但传统机器学习通常很快。model.fit(X_train,y_train)print(模型训练 (Fit) 完毕)# # 4. 预测 (Predict)# # 知识点模型学成出山。拿“测试集”的题目(X_test)给它做让它给出自己的预测答案。# 注意预测的时候绝对不能把 y_test 传进去y_predmodel.predict(X_test)# # 5. 评估模型 (Evaluate)# # 知识点把模型自己做的答案 (y_pred) 和真正的标准答案 (y_test) 进行比对。print(\n 模型评估报告 )# 5.1 准确率 (Accuracy)accaccuracy_score(y_test,y_pred)print(f1. 整体准确率 (Accuracy):{acc:.4f}({acc*100:.2f}%)\n)# 5.2 混淆矩阵 (Confusion Matrix)print(2. 混淆矩阵 (Confusion Matrix):)# 显示模型真阳、真阴、假阳、假阴的具体个数print(confusion_matrix(y_test,y_pred),\n)# 5.3 综合分类报告 (Classification Report)print(3. 综合评估指标 (包含 Precision, Recall, F1-Score):)# target_names 用来把 0 和 1 替换回人能看懂的标签名print(classification_report(y_test,y_pred,target_namescancer_data.target_names))代码核心逻辑提炼总结无论你未来换成什么算法比如换成支持向量机 SVM或者逻辑回归 Logistic Regression代码结构几乎是不变的。你只需要更改第 2 步实例化的那一行代码即可换成逻辑回归from sklearn.linear_model import LogisticRegression model LogisticRegression()换成支持向量机from sklearn.svm import SVC model SVC()这就是 scikit-learn API 设计得最优雅、最被业界推崇的地方。在实际业务中Pipeline流水线和 Grid Search网格搜索通常是绑定在一起使用的它们被称为“最佳拍档”而对于偏态分布如金融领域的收入数据、电商的客单价对数转换结合 3-Sigma是处理异常值最经典的统计学手法。1. Pipeline (流水线) 与 Grid Search (网格搜索) 联合使用知识点补充Pipeline (流水线)它的核心目的是防止数据泄露Data Leakage并简化代码。它把“数据标准化/归一化”和“模型训练”打包成了一个整体。这样在做交叉验证时每一折数据都会重新独立做一次标准化保证测试集绝对“干净”。Grid Search (网格搜索)暴力穷举法调参。给定几个参数的备选值它会把所有的排列组合都试一遍结合交叉验证找出最好的一组。Python 代码示例importpandasaspdfromsklearn.datasetsimportload_breast_cancerfromsklearn.model_selectionimporttrain_test_split,GridSearchCVfromsklearn.preprocessingimportStandardScalerfromsklearn.svmimportSVCfromsklearn.pipelineimportPipeline# 1. 准备数据dataload_breast_cancer()X_train,X_test,y_train,y_testtrain_test_split(data.data,data.target,test_size0.2,random_state42)# 2. 构建 Pipeline (流水线)# 将标准化步骤 (scaler) 和 SVM模型 (svm) 打包在一起pipePipeline([(scaler,StandardScaler()),(svm,SVC(random_state42))])# 3. 定义 Grid Search 的参数网格# 注意命名规则必须是 步骤名称__参数名 (中间是两个下划线)param_grid{svm__C:[0.1,1,10,100],# 惩罚系数svm__kernel:[linear,rbf],# 核函数svm__gamma:[scale,auto,0.1]# 核函数的系数}# 4. 实例化 GridSearchCV# cv5 表示 5 折交叉验证n_jobs-1 表示调用所有CPU核心加速跑grid_searchGridSearchCV(estimatorpipe,param_gridparam_grid,cv5,n_jobs-1,scoringaccuracy)# 5. 喂入数据开始穷举搜索print(开始网格搜索这可能需要几秒钟...)grid_search.fit(X_train,y_train)# 6. 输出结果print(最佳参数组合:,grid_search.best_params_)print(交叉验证最高得分 (Accuracy):,round(grid_search.best_score_,4))# 7. 用找到的最佳模型在测试集上预测best_modelgrid_search.best_estimator_ test_scorebest_model.score(X_test,y_test)print(测试集最终得分:,round(test_score,4))2. 偏态数据对数转换与 3-Sigma 异常值过滤知识点补充偏态数据 (Skewed Data)比如全国人民的工资极少数人拿极高的工资导致分布呈现“长长的右尾巴”右偏态。很多机器学习模型如线性回归非常讨厌偏态数据。对数转换 (Log Transformation)魔法操作。把偏态数据取对数Log后原本非常大的极端值会被急剧压缩整个数据分布会瞬间变得接近正态分布钟形曲线。3-Sigma 原则统计学规律指出在正态分布中99.73% 的数据都会落在 ( \mu \pm 3\sigma )均值加减三倍标准差的范围内。超出这个范围的数据我们就有充分的理由认为它是极度异常的噪音可以直接剔除或盖帽。核心逻辑现实中的业务数据往往不是正态分布的直接用 3-Sigma 找异常值是错误的。正确做法是先取对数让其变为正态分布 - 再计算均值和标准差 - 应用 3-Sigma 找异常值。Python 代码示例importpandasaspdimportnumpyasnp# 1. 模拟生成一组极度右偏的业务数据 (比如用户充值金额)# 大部分人在 100 左右有极个别土豪充值了 5000, 10000np.random.seed(42)normal_usersnp.random.normal(loc100,scale20,size990)whalesnp.array([5000,8000,15000])# 极端的异常值revenuenp.concatenate([normal_users,whales])dfpd.DataFrame({revenue:revenue})print(原始数据前5条和后3条 (异常值):)print(df.head(2))print(df.tail(3),\n)# 2. 对数转换 (Log Transform)# 技巧使用 np.log1p (即 log(x1)) 而不是 np.log防止数据中有 0 导致报错df[log_revenue]np.log1p(df[revenue])# 3. 在对数空间下计算 3-Sigma 边界mean_logdf[log_revenue].mean()std_logdf[log_revenue].std()lower_boundmean_log-3*std_log upper_boundmean_log3*std_logprint(f对数转换后均值:{mean_log:.2f}, 标准差:{std_log:.2f})print(f合理的对数值范围: [{lower_bound:.2f},{upper_bound:.2f}]\n)# 4. 识别并过滤异常值# 找出正常数据 (在 3-Sigma 范围内)df_cleandf[(df[log_revenue]lower_bound)(df[log_revenue]upper_bound)].copy()# 找出异常数据 (超出 3-Sigma 范围)df_outliersdf[(df[log_revenue]lower_bound)|(df[log_revenue]upper_bound)]print(被 3-Sigma 揪出来的异常值如下)print(df_outliers[[revenue,log_revenue]])print(f\n清洗完成原始数据量:{len(df)}清洗后数据量:{len(df_clean)})K-MeansK均值 是最著名的无监督聚类算法而 SVM支持向量机 则是极其强大的监督学习分类算法1. K-Means (K均值聚类算法)K-Means 是一种无监督学习算法。它的核心任务是“物以类聚”在没有给出标准答案标签的情况下自动将数据划分成K个簇Cluster。核心逻辑随机在空间中扔下K个点作为初始的“簇中心”Centroids。计算所有样本点到这K个中心的距离离谁近就归属哪个簇。根据刚才划分好的簇重新计算每个簇的实际中心点求均值。重复步骤 2 和 3直到中心点不再移动算法收敛。数学目标最小化簇内平方和Within-Cluster Sum of Squares, WCSS即尽量让同一个簇里的数据点紧密地挨在一起。Python 代码示例importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.clusterimportKMeansfromsklearn.datasetsimportmake_blobs# 1. 生成模拟数据生成 300 个样本点大致分为 4 个簇X,_make_blobs(n_samples300,centers4,cluster_std0.60,random_state0)# 2. 实例化 K-Means 模型# n_clusters4 表示我们希望将其聚成 4 类# n_init10 表示算法会用不同的初始中心点运行 10 次选择效果最好的一次kmeansKMeans(n_clusters4,n_init10,random_state42)# 3. 训练模型并直接预测每个数据点所属的簇y_kmeanskmeans.fit_predict(X)# 4. 获取最终确定的 4 个簇中心点的位置centroidskmeans.cluster_centers_# ---------- 下面是可视化代码 ----------plt.figure(figsize(8,5))# 绘制散点图按模型预测的簇(y_kmeans)填充不同颜色plt.scatter(X[:,0],X[:,1],cy_kmeans,s50,cmapviridis,alpha0.6)# 将簇的中心点用红色的星号标出plt.scatter(centroids[:,0],centroids[:,1],cred,s200,marker*,labelCentroids)plt.title(K-Means Clustering Result)plt.legend()plt.show()2. SVM (Support Vector Machine / 支持向量机)SVM 是一种监督学习算法主要用于分类问题尤其是二分类。它的核心思想是寻找一条“最宽的马路”超平面来把不同类别的数据分开。核心逻辑超平面 (Hyperplane)在二维空间中它是一条线在三维空间中是一个面。SVM 要找的那条线必须恰好在两类数据的正中间。支持向量 (Support Vectors)离这条分割线最近的那几个数据点。它们支撑起了整个“马路”的宽度。SVM 算法极其特别的一点是它只关心这几个极其关键的边界点其他离得远的数据点对模型没有任何影响。核技巧 (Kernel Trick)现实中的数据往往不是线性可分的无法用一条直线切开。SVM 通过“核函数”将低维数据映射到高维空间在三维甚至更高维的空间里原本切不开的数据就能用一刀切开了。数学目标最大化分类间隔Margin即最大化 ( \frac{2}{||w||} )同时满足分类正确的约束条件。Python 代码示例importnumpyasnpimportmatplotlib.pyplotaspltfromsklearn.svmimportSVCfromsklearn.datasetsimportmake_classificationfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score# 1. 生成模拟数据二分类问题100个样本2个特征X,ymake_classification(n_samples100,n_features2,n_redundant0,n_informative2,random_state42,n_clusters_per_class1)# 切分训练集和测试集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.3,random_state42)# 2. 实例化 SVM 模型# kernellinear 表示我们寻找一条直线的超平面 (还可以选 rbf 处理非线性数据)# C1.0 是惩罚参数C越大模型越不允许分类错误(容易过拟合)C越小容忍度越高(马路更宽)svm_modelSVC(kernellinear,C1.0)# 3. 训练模型svm_model.fit(X_train,y_train)# 4. 预测与评估y_predsvm_model.predict(X_test)print(fSVM 模型在测试集上的准确率:{accuracy_score(y_test,y_pred)*100:.2f}%)# ---------- 提取核心信息 ----------# 获取起到支撑作用的 支持向量 的坐标support_vectorssvm_model.support_vectors_print(f模型一共找到了{len(support_vectors)}个支持向量。)# ---------- 下面是可视化代码 (画出分割线和边界) ----------plt.figure(figsize(8,5))# 画出训练数据plt.scatter(X_train[:,0],X_train[:,1],cy_train,s50,cmapcoolwarm,edgecolorsk)# 提取超平面方程的系数 w 和截距 bw0*x w1*y b 0wsvm_model.coef_[0]bsvm_model.intercept_[0]# 生成用来画线的 x 坐标点x_pointsnp.linspace(X_train[:,0].min()-1,X_train[:,0].max()1,50)# 根据方程计算对应的 y 坐标点y -(w0/w1)*x - (b/w1)y_points-(w[0]/w[1])*x_points-b/w[1]# 画出中间的主决策边界 (超平面)plt.plot(x_points,y_points,k-,linewidth2,labelDecision Boundary)# 把支持向量用明显的黄色圈出来plt.scatter(support_vectors[:,0],support_vectors[:,1],s150,facecolorsnone,edgecolorsyellow,linewidths2,labelSupport Vectors)plt.title(SVM Linear Classification)plt.legend()plt.show()