ARTICLE DETAIL

资讯详情

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

Python数据挖掘实战:从算法选型到模型调优的完整指南

Python数据挖掘实战:从算法选型到模型调优的完整指南 1. 项目概述从数据到洞察的实战跨越如果你已经跟着前面的章节走完了数据预处理和探索性分析的流程手里拿着一份干净、规整的数据集那么恭喜你你已经完成了数据分析中最“脏”也最基础的体力活。现在我们站在了真正有趣的门槛前——挖掘建模。这就像一位厨师已经备好了所有洗净切好的食材接下来要施展的煎炒烹炸才是决定菜品最终风味的关键。第五章“挖掘建模”就是教你如何运用Python这把“厨具”将数据食材烹饪成有价值的商业洞察或预测模型。很多人学Python数据分析卡就卡在这里。看理论头头是道一到实战就无从下手分类、聚类、回归、关联规则……这么多算法该选哪个sklearn里参数一大堆怎么调模型跑出来了结果怎么看怎么判断它好不好这一章我们就来彻底解决这些问题。我不会给你罗列一堆数学公式而是聚焦于“实战”如何根据你的业务目标是预测用户流失还是对客户分群或是发现商品搭配规律选择合适的算法如何用pandas和sklearn快速搭建一个可运行的模型管道以及如何解读模型输出避免掉进常见的陷阱。无论你是想用逻辑回归预测销量用K-Means做用户细分还是用Apriori算法挖掘购物篮中的隐藏关联这里都有可以直接“抄作业”的代码和思路。2. 挖掘建模的核心思路与算法选型逻辑在动手写代码之前我们必须先想清楚一件事我要用数据解决什么问题这个问题决定了我们挖掘建模的方向。盲目地套用算法就像不问病症乱开药结果往往是徒劳无功。2.1 明确业务目标与问题类型通常数据挖掘问题可以归结为以下几类每一种都对应着不同的算法家族预测/分类问题这是最常见的一类。目标是基于历史数据预测一个未知的、离散的或连续的结果。分类预测离散的类别标签。例如根据用户的浏览记录和 demographics人口统计信息预测他是否会购买某产品是/否根据肿瘤的特征判断它是良性还是恶性。回归预测连续的数值。例如根据房屋的面积、地段、房龄预测其售价根据过往的广告投入和季节性因素预测下个月的销售额。描述/聚类问题我们没有明确的标签要预测而是希望探索数据内在的结构将相似的对象分组。聚类目标是将数据分成多个组簇使得同一组内的数据点彼此相似而不同组的数据点相异。例如对电商用户进行分群发现高价值用户、价格敏感用户、低频用户等以便进行精细化运营。关联与序列问题寻找数据中项集之间有趣的关联或先后顺序。关联规则经典案例是“购物篮分析”。发现诸如“购买了尿布的顾客有很大概率也会购买啤酒”这样的规则。序列模式在关联的基础上加入了时间顺序例如“购买了手机的用户在接下来一周内有较大概率购买手机壳和贴膜”。选型心法拿到数据后先别急着想算法。拿出一张纸和业务方或者你自己确认“我们最终想要得到一个什么样的输出是一个预测值比如明天股票涨跌是一份分组报告比如客户画像分群还是一条条‘如果…那么…’的规则比如商品推荐策略” 这个问题的答案直接指向了上述的某一类问题。2.2 主流算法工具箱与sklearn映射确定了问题类型我们就可以打开Python的算法工具箱了。对于绝大多数实战场景scikit-learn简称sklearn是我们的主战场。它提供了统一、简洁的API让建模变得像搭积木一样简单。下面是一个快速映射指南分类问题逻辑回归sklearn.linear_model.LogisticRegression。虽然名字里有“回归”但它是个分类器。它是理解分类问题的基础速度快可解释性强常作为基线模型。决策树sklearn.tree.DecisionTreeClassifier。非常直观可以可视化容易理解。但单棵树容易过拟合。随机森林sklearn.ensemble.RandomForestClassifier。决策树的集成版本通过构建多棵树并投票显著提升了泛化能力和准确率是当前最流行、最稳健的分类器之一。支持向量机sklearn.svm.SVC。在小样本、高维数据上表现优异但数据量大时训练较慢调参相对复杂。朴素贝叶斯sklearn.naive_bayes.GaussianNB(等)。基于概率特别适合文本分类如垃圾邮件识别计算效率高。回归问题线性回归sklearn.linear_model.LinearRegression。最基础的回归模型寻找特征与目标值之间的线性关系。岭回归/Lasso回归sklearn.linear_model.Ridge/Lasso。在线性回归基础上加入了正则化项用于防止过拟合和特征选择。决策树回归sklearn.tree.DecisionTreeRegressor。随机森林回归sklearn.ensemble.RandomForestRegressor。聚类问题K-Meanssklearn.cluster.KMeans。最经典、最常用的聚类算法需要预先指定簇的数量K。DBSCANsklearn.cluster.DBSCAN。基于密度的聚类能发现任意形状的簇并能识别噪声点不需要预先指定K。层次聚类sklearn.cluster.AgglomerativeClustering。可以生成一个树状的聚类结构便于观察不同粒度下的分组。关联规则sklearn中没有直接提供。我们通常使用专门的库如mlxtend或apyori。mlxtend的API更接近sklearn风格推荐使用。注意对于初学者我的建议是从逻辑回归/线性回归分类/回归和随机森林开始。它们像瑞士军刀在大多数问题上都能给出一个不错的结果且不太容易出错。等你对数据的感觉和问题的理解更深了再去尝试更复杂的模型。2.3 模型评估如何判断模型的好坏模型训练出来不是终点评估才是。用错误的指标评估模型可能会得出完全相反的结论。分类模型评估准确率accuracy_score。所有预测正确的样本占总样本的比例。但在类别不平衡的数据集上比如99%是好用户1%是欺诈用户准确率会严重失真。一个把所有样本都预测为“好用户”的模型准确率高达99%但对欺诈检测毫无用处。精确率 召回率 F1-Scoreprecision_score,recall_score,f1_score。这三个指标通常一起看特别适用于不平衡数据集。精确率预测为正的样本中实际为正的比例。“宁缺毋滥”召回率实际为正的样本中被预测为正的比例。“宁可错杀”F1-Score精确率和召回率的调和平均数是一个综合指标。ROC曲线与AUC值roc_curve,roc_auc_score。ROC曲线描绘了在不同阈值下模型的真正例率和假正例率的关系。AUC值越接近1模型整体性能越好。它不依赖于单一的分类阈值是对模型排序能力的整体评价。回归模型评估均方误差mean_squared_error。预测值与真实值之差平方的平均值。对大的误差惩罚更重。均方根误差mean_squared_error开根号。与目标值在同一量纲更易解释。平均绝对误差mean_absolute_error。预测值与真实值之差的绝对值的平均值。对异常值不如MSE敏感。R²分数r2_score。表示模型对目标变量方差的解释比例越接近1越好。聚类模型评估无监督较主观轮廓系数silhouette_score。结合了内聚度和分离度用于评估聚类的紧密度和分离度。值在-1到1之间越大越好。Calinski-Harabasz指数类内离散度与类间离散度的比值越大表示聚类效果越好。实际业务解读聚类结果最终要落到业务上。通过分析每个簇的特征如平均消费额、活跃度看分群是否有实际意义。实操心得永远不要只依赖一个指标。对于分类我会同时看准确率、精确率、召回率、F1和AUC并画出混淆矩阵。对于回归我会对比RMSE和MAE并画出预测值与真实值的散点图直观感受误差分布。3. 分类与回归实战以预测客户流失为例理论说再多不如一行代码。我们以一个经典的“客户流失预测”场景为例完整走一遍分类建模的流程。假设我们有一个电信公司的客户数据集包含客户的基本信息、服务订阅情况和是否流失的标签。3.1 数据准备与特征工程回顾在建模前数据必须已经是“干净”的。我们假设已经完成了第4章的所有步骤处理了缺失值、编码了分类变量如性别、合同类型、标准化了数值变量如月费用、通话时长。这里用pandas和sklearn的预处理模块快速回顾import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler, LabelEncoder # 1. 加载数据 df pd.read_csv(customer_churn.csv) # 2. 处理分类变量标签编码适用于有序变量或独热编码适用于无序变量 # 例如对‘性别’进行标签编码 le LabelEncoder() df[gender_encoded] le.fit_transform(df[gender]) # 对‘合同类型’进行独热编码更常用 df pd.get_dummies(df, columns[contract_type], prefixcontract) # 3. 分离特征和目标变量 X df.drop(churn, axis1) # 特征 y df[churn] # 目标变量是否流失1/0 # 4. 划分训练集和测试集非常重要 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42, stratifyy) # stratifyy 确保训练集和测试集中流失客户的比例保持一致 # 5. 特征缩放对基于距离的模型如SVM、KNN很重要对树模型如随机森林不重要 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 注意用训练集的参数转换测试集踩过的坑fit_transform只能用在训练集上然后用训练集拟合出来的scaler去transform测试集。这是为了模拟真实情况我们在上线模型时面对的是全新的、未知分布的数据必须使用训练时学到的尺度进行转换。如果在测试集上也用fit_transform就造成了“数据泄露”会严重高估模型性能。3.2 模型训练、预测与评估我们尝试逻辑回归和随机森林两个模型并对比它们的性能。from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, roc_auc_score import matplotlib.pyplot as plt import seaborn as sns # 1. 逻辑回归 print( 逻辑回归 ) lr_model LogisticRegression(random_state42, max_iter1000) # max_iter增加迭代次数确保收敛 lr_model.fit(X_train_scaled, y_train) y_pred_lr lr_model.predict(X_test_scaled) y_pred_proba_lr lr_model.predict_proba(X_test_scaled)[:, 1] # 预测为正类流失的概率 print(f准确率: {accuracy_score(y_test, y_pred_lr):.4f}) print(fAUC值: {roc_auc_score(y_test, y_pred_proba_lr):.4f}) print(\n分类报告:) print(classification_report(y_test, y_pred_lr)) # 2. 随机森林不需要特征缩放 print(\n 随机森林 ) rf_model RandomForestClassifier(n_estimators100, random_state42) # n_estimators: 树的数量 rf_model.fit(X_train, y_train) # 注意这里使用未缩放的原始特征 y_pred_rf rf_model.predict(X_test) y_pred_proba_rf rf_model.predict_proba(X_test)[:, 1] print(f准确率: {accuracy_score(y_test, y_pred_rf):.4f}) print(fAUC值: {roc_auc_score(y_test, y_pred_proba_rf):.4f}) print(\n分类报告:) print(classification_report(y_test, y_pred_rf)) # 3. 绘制混淆矩阵对比 fig, axes plt.subplots(1, 2, figsize(12, 5)) models [(Logistic Regression, y_pred_lr), (Random Forest, y_pred_rf)] for idx, (name, y_pred) in enumerate(models): cm confusion_matrix(y_test, y_pred) sns.heatmap(cm, annotTrue, fmtd, cmapBlues, axaxes[idx]) axes[idx].set_title(fConfusion Matrix - {name}) axes[idx].set_xlabel(Predicted) axes[idx].set_ylabel(Actual) plt.tight_layout() plt.show()代码解读与关键点random_state设置一个随机种子确保每次运行结果可复现。这在分享和调试代码时至关重要。max_iter1000逻辑回归默认迭代次数可能不够导致警告增加此参数。predictvspredict_probapredict直接给出类别预测0或1predict_proba给出属于每个类别的概率。计算AUC值需要概率。classification_report一键输出精确率、召回率、F1-score和支持度非常方便。特征重要性随机森林一个强大的功能是可以输出特征重要性帮助我们理解哪些因素对预测客户流失最关键。# 获取特征重要性 feature_importances pd.DataFrame({ feature: X_train.columns, importance: rf_model.feature_importances_ }).sort_values(importance, ascendingFalse) print(feature_importances.head(10)) # 查看最重要的10个特征3.3 回归问题速览房价预测回归问题的流程与分类高度相似只是模型和评估指标不同。以波士顿房价数据集已弃用此处仅作示例的简化流程为例from sklearn.datasets import fetch_california_housing # 使用加州房价数据集 from sklearn.linear_model import LinearRegression, Ridge from sklearn.metrics import mean_squared_error, r2_score # 加载数据 housing fetch_california_housing() X housing.data y housing.target X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 特征缩放对线性回归很重要 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 线性回归 lr LinearRegression() lr.fit(X_train_scaled, y_train) y_pred_lr lr.predict(X_test_scaled) print(f线性回归 - RMSE: {mean_squared_error(y_test, y_pred_lr, squaredFalse):.4f}, R2: {r2_score(y_test, y_pred_lr):.4f}) # 岭回归带正则化 ridge Ridge(alpha1.0) # alpha是正则化强度 ridge.fit(X_train_scaled, y_train) y_pred_ridge ridge.predict(X_test_scaled) print(f岭回归 - RMSE: {mean_squared_error(y_test, y_pred_ridge, squaredFalse):.4f}, R2: {r2_score(y_test, y_pred_ridge):.4f})4. 聚类分析实战发现用户细分群体当我们没有“是否流失”这样的标签时聚类可以帮助我们发现数据中自然存在的分组。我们使用一个电商用户的消费行为数据集。4.1 K-Means聚类全流程K-Means的核心是确定簇的数量K。我们使用“肘部法则”和“轮廓系数”来辅助选择。import numpy as np from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 假设 df_users 是包含用户‘年消费额’‘购买频率’‘平均订单价值’等特征的数据框 # X df_users[[annual_spend, purchase_freq, avg_order_value]] # 这里用模拟数据 np.random.seed(42) X np.random.randn(300, 2) * np.array([5, 1]) np.array([10, 2]) # 模拟两个特征 # 1. 寻找最佳K值 - 肘部法则 inertias [] K_range range(2, 11) for k in K_range: kmeans KMeans(n_clustersk, random_state42, n_initauto) # n_initauto 避免未来版本警告 kmeans.fit(X) inertias.append(kmeans.inertia_) # inertia_是样本到其最近聚类中心的距离平方和 plt.figure(figsize(10, 4)) plt.subplot(1, 2, 1) plt.plot(K_range, inertias, bo-) plt.xlabel(Number of clusters (K)) plt.ylabel(Inertia) plt.title(Elbow Method For Optimal K) # 2. 寻找最佳K值 - 轮廓系数 silhouette_scores [] for k in K_range: kmeans KMeans(n_clustersk, random_state42, n_initauto) cluster_labels kmeans.fit_predict(X) silhouette_avg silhouette_score(X, cluster_labels) silhouette_scores.append(silhouette_avg) plt.subplot(1, 2, 2) plt.plot(K_range, silhouette_scores, ro-) plt.xlabel(Number of clusters (K)) plt.ylabel(Silhouette Score) plt.title(Silhouette Score For Optimal K) plt.tight_layout() plt.show() # 3. 根据图表选择K假设我们选择K3进行最终聚类 optimal_k 3 final_kmeans KMeans(n_clustersoptimal_k, random_state42, n_initauto) cluster_labels final_kmeans.fit_predict(X) # 4. 将聚类标签添加到原始数据 df_users[cluster] cluster_labels # 5. 分析每个簇的特征 cluster_profile df_users.groupby(cluster).mean() print(cluster_profile)结果解读“肘部法则”图中inertia下降速度突然变缓的点像肘部对应的K值可能是好的选择。“轮廓系数”越接近1越好。我们选择使轮廓系数较高的K值。最终通过groupby查看每个簇在各个特征上的平均值就能给每个用户群打上标签比如“高消费低频用户”、“低消费高频用户”等。4.2 聚类结果可视化可视化能帮助我们直观判断聚类效果。# 绘制聚类散点图假设我们只有两个特征 plt.scatter(X[:, 0], X[:, 1], ccluster_labels, cmapviridis, alpha0.6) plt.scatter(final_kmeans.cluster_centers_[:, 0], final_kmeans.cluster_centers_[:, 1], s200, cred, markerX, labelCentroids) plt.xlabel(Feature 1 (e.g., Annual Spend)) plt.ylabel(Feature 2 (e.g., Purchase Frequency)) plt.title(Customer Segments Identified by K-Means) plt.legend() plt.show()5. 关联规则挖掘实战Apriori算法与购物篮分析关联规则旨在发现诸如“如果顾客买了A那么他也很可能买B”的规律。我们使用mlxtend库来实现Apriori算法。5.1 数据准备与编码关联规则需要事务型数据即每一行代表一次交易一个购物篮每一列代表一个商品是否被购买布尔值。# 安装 mlxtend: pip install mlxtend import pandas as pd from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori, association_rules # 示例数据每个列表代表一个顾客的购物篮 dataset [[牛奶, 面包, 黄油], [啤酒, 尿布, 面包], [牛奶, 尿布, 啤酒, 鸡蛋], [面包, 牛奶, 尿布, 啤酒], [面包, 牛奶, 尿布, 可乐]] # 1. 将事务数据转换为One-Hot编码的DataFrame te TransactionEncoder() te_ary te.fit(dataset).transform(dataset) df_encoded pd.DataFrame(te_ary, columnste.columns_) print(df_encoded)5.2 挖掘频繁项集与关联规则# 2. 使用Apriori算法找出频繁项集 # min_support: 最小支持度。支持度 包含该项集的事务数 / 总事务数。这里设为0.4即项集至少在40%的交易中出现。 frequent_itemsets apriori(df_encoded, min_support0.4, use_colnamesTrue) print(频繁项集) print(frequent_itemsets.sort_values(support, ascendingFalse)) # 3. 从频繁项集中生成关联规则 # min_threshold: 最小提升度(lift)。提升度1表示规则有效且越大越好。 rules association_rules(frequent_itemsets, metriclift, min_threshold1.2) print(\n关联规则) # 按提升度或置信度排序查看 print(rules[[antecedents, consequents, support, confidence, lift]].sort_values(lift, ascendingFalse))核心指标解释支持度规则中所有商品同时出现的频率。太低说明组合不常见商业价值可能不大。置信度买了A的前提下也买了B的条件概率。衡量规则的可靠性。提升度规则中商品之间的相关性。提升度1表示独立1表示正相关1表示负相关。我们通常关注提升度1的规则。业务应用从输出结果中我们可能会发现{尿布} - {啤酒}这条规则有较高的支持度、置信度和提升度。这就可以指导业务进行捆绑销售、交叉推荐或调整货架布局。6. 建模过程中的常见陷阱与调优实战模型第一次跑出来的结果往往不是最好的。以下是几个你必须面对的挑战和应对策略。6.1 过拟合与欠拟合诊断与应对欠拟合模型在训练集和测试集上都表现不佳。好比学生连课本例题都没学会。表现训练集和测试集的准确率/得分都很低。原因模型太简单如用线性模型拟合非线性关系特征信息不足。解决增加模型复杂度如用多项式特征、更深的树增加更多有效特征减少正则化强度。过拟合模型在训练集上表现极好但在测试集上表现很差。好比学生死记硬背了所有例题但不会解新题。表现训练集得分很高测试集得分显著下降。原因模型过于复杂把训练数据中的噪声也学进去了。解决获取更多数据最有效的方法。降低模型复杂度如减少决策树深度、减少随机森林中树的数量。正则化在损失函数中加入惩罚项如L1/L2正则化限制参数大小。逻辑回归/Ridge/Lasso都内置了正则化。特征选择移除不相关或冗余的特征。集成方法如随机森林、梯度提升树本身通过平均多棵树来降低过拟合风险。诊断工具学习曲线绘制学习曲线可以直观看到过拟合/欠拟合。from sklearn.model_selection import learning_curve import numpy as np def plot_learning_curve(estimator, title, X, y, cv5): train_sizes, train_scores, test_scores learning_curve( estimator, X, y, cvcv, scoringaccuracy, train_sizesnp.linspace(0.1, 1.0, 10)) train_scores_mean np.mean(train_scores, axis1) test_scores_mean np.mean(test_scores, axis1) plt.figure() plt.plot(train_sizes, train_scores_mean, o-, labelTraining score) plt.plot(train_sizes, test_scores_mean, o-, labelCross-validation score) plt.xlabel(Training examples) plt.ylabel(Score) plt.title(title) plt.legend(locbest) plt.grid() plt.show() # 分别绘制一个简单模型和复杂模型的学习曲线 from sklearn.tree import DecisionTreeClassifier simple_model DecisionTreeClassifier(max_depth3) complex_model DecisionTreeClassifier(max_depth20) plot_learning_curve(simple_model, Learning Curve (Underfitting?), X_train, y_train) plot_learning_curve(complex_model, Learning Curve (Overfitting?), X_train, y_train)理想情况下两条曲线随着数据量增加都收敛到一个较高的值且彼此接近。如果训练分数远高于验证分数则是过拟合如果两者都很低则是欠拟合。6.2 超参数调优让模型性能更上一层楼模型的超参数如随机森林的n_estimators、max_depth不是从数据中学到的需要我们手动设定。调优就是为这些参数找到最佳组合。网格搜索最常用的方法遍历所有给定的参数组合。from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestClassifier # 定义参数网格 param_grid { n_estimators: [50, 100, 200], max_depth: [5, 10, 15, None], # None表示不限制深度 min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4] } # 创建基础模型 rf RandomForestClassifier(random_state42) # 创建GridSearchCV对象 # cv5 表示5折交叉验证 scoringaccuracy 表示以准确率作为评估标准 grid_search GridSearchCV(estimatorrf, param_gridparam_grid, cv5, scoringaccuracy, n_jobs-1, verbose1) # n_jobs-1 使用所有CPU核心并行计算 verbose1 打印进度 # 在训练集上拟合网格搜索 grid_search.fit(X_train, y_train) # 输出最佳参数和最佳得分 print(fBest parameters: {grid_search.best_params_}) print(fBest cross-validation score: {grid_search.best_score_:.4f}) # 使用最佳模型在测试集上评估 best_rf grid_search.best_estimator_ y_pred_best best_rf.predict(X_test) print(fTest set accuracy with best model: {accuracy_score(y_test, y_pred_best):.4f})实操心得网格搜索非常耗时尤其是参数组合多的时候。可以先进行粗调参数范围大、步长大找到表现好的区域再进行细调。另外对于大型数据集或复杂模型可以考虑使用RandomizedSearchCV随机搜索它在指定的参数分布中随机采样能以更少的尝试找到不错的参数组合。6.3 类别不平衡问题处理在客户流失预测中流失客户可能只占5%。这种类别不平衡会导致模型倾向于预测多数类从而忽略少数类。解决方法调整评估指标如前所述不要再用准确率改用精确率、召回率、F1、AUC。重采样过采样增加少数类样本的副本或生成合成样本如SMOTE算法。欠采样随机减少多数类样本。使用imbalanced-learn库pip install imbalanced-learn调整类别权重许多模型如逻辑回归、SVM、随机森林支持class_weight参数可以给少数类更高的惩罚权重。from sklearn.ensemble import RandomForestClassifier from imblearn.over_sampling import SMOTE # 方法一使用 class_weight rf_balanced RandomForestClassifier(n_estimators100, class_weightbalanced, random_state42) rf_balanced.fit(X_train, y_train) # 方法二使用SMOTE过采样 smote SMOTE(random_state42) X_train_resampled, y_train_resampled smote.fit_resample(X_train, y_train) rf_smote RandomForestClassifier(n_estimators100, random_state42) rf_smote.fit(X_train_resampled, y_train_resampled) # 比较两种方法在测试集上的召回率对少数类的识别能力 from sklearn.metrics import recall_score y_pred_balanced rf_balanced.predict(X_test) y_pred_smote rf_smote.predict(X_test) print(fRecall (Balanced Class Weight): {recall_score(y_test, y_pred_balanced):.4f}) print(fRecall (SMOTE): {recall_score(y_test, y_pred_smote):.4f})选择策略没有绝对最好的方法。通常建议先尝试调整class_weight因为它最简单。如果效果不佳再尝试SMOTE。欠采样可能会丢失重要信息除非数据量极大。6.4 特征工程进阶创造更有力的特征模型的上限往往由数据和特征决定。好的特征工程能极大提升模型性能。领域知识结合例如在电商中可以创造“用户生命周期价值”、“最近一次购买距今天数”、“购买频率”等复合特征。交互特征将两个或多个特征相乘或相加捕捉非线性关系。例如在房价预测中“房间数 * 每间房面积”可能比单独两个特征更有用。可以用PolynomialFeatures自动生成。分箱将连续变量如年龄离散化成几个区间如青年、中年、老年有时能让线性模型捕捉到非线性趋势。目标编码用目标变量的统计量如均值来编码分类变量特别适用于高基数分类变量如邮政编码。需小心避免数据泄露。# 示例创建交互特征 import numpy as np df[feature_interaction] df[feature1] * df[feature2] # 或者使用PolynomialFeatures from sklearn.preprocessing import PolynomialFeatures poly PolynomialFeatures(degree2, interaction_onlyTrue, include_biasFalse) X_poly poly.fit_transform(X[[feature1, feature2]])建模不是一蹴而就的而是一个“构建-评估-调优”的迭代过程。从选择一个简单的基线模型开始理解你的数据在模型眼中的样子然后通过特征工程、处理不平衡、调参等手段一步步提升。每一次迭代你都会对数据和问题有更深的理解。记住没有“最好”的模型只有“最适合”当前业务场景和数据的模型。
返回列表