
简介这是一套面向数据挖掘初学者与进阶学习者的Python实战项目合集围绕真实业务场景提供六个完整案例帮助读者打通从数据预处理到建模评估的全流程。内容覆盖员工流失预警、电信客户流失、药物数据决策树挖掘、世界幸福报告分析、英雄联盟比赛胜负预测以及保险业交叉销售涉及逻辑回归、随机森林、支持向量机、XGBoost、关联规则等多种算法并配有特征选择与探索性数据分析脚本。资源包共14个文件包含6个Jupyter Notebook、6个CSV数据集和2个Python脚本压缩包约9.04MBNotebook便于直接运行与阅读CSV提供原始数据脚本则封装了特征选择与EDA等通用步骤。目前已有776人学习下载。每个项目均附带代码注释与结果解释读者可据此复现完整分析流程理解业务问题如何转化为建模任务并积累特征工程、模型调参与结果解读的实践经验适合作为课程设计、自学练手或面试准备的参考素材。1. 六个 Notebook 拆开看这套数据挖掘实战包到底能跑出什么结果很多人学数据挖掘卡在同一个地方sklearn 的 API 背得滚瓜烂熟真拿到一份带缺失值、类别不平衡、字段含义模糊的业务数据就不知道从哪下手。这份资源解决的就是这个断层——它把六个不同行业的完整分析流程打包成 Jupyter Notebook每个项目从原始 CSV 到特征工程、建模、评估、结论一条龙走完代码、分析文字、运行结果、数据集全在里面。六个项目分别是员工流失预警、电信客户流失、药物数据集决策树挖掘、世界幸福报告分析、英雄联盟比赛胜负预测、保险业交叉销售。覆盖了分类、回归、关联规则、可视化探索几条主线数据集从 HR 场景的HR_comma_sep.csv到电竞的games.csv规模不大但字段结构真实适合拿来练手也适合改造成自己的项目模板。如果你正在找一套能直接跑通、能看懂每一步为什么这么做的 python 数据挖掘实战材料这套东西的完成度是够的。2. 环境搭起来到第一个 Notebook 跑通依赖、路径与数据加载2.1 环境准备与依赖清单这套资源的核心运行环境是 Jupyter NotebookPython 版本建议 3.8 以上。常见做法是用 conda 建一个独立环境避免和系统里已有的包打架。我一般会先建环境再装包这样后面哪个项目缺库直接补就行不会污染全局。# 创建独立环境python 3.9 兼容性比较稳 conda create -n dm_projects python3.9 -y conda activate dm_projects # 核心依赖六个项目基本都跑不出这个范围 pip install jupyter pandas numpy scikit-learn matplotlib seaborn pip install xgboost lightgbm mlxtend这里mlxtend是保险交叉销售项目里关联规则Apriori会用到的库xgboost和lightgbm对应英雄联盟胜负预测那类集成模型场景。装完之后jupyter notebook启动浏览器里能看到文件列表就算环境通了。注意如果你用的是 VSCode 的 Jupyter 插件选 kernel 的时候要选刚建的dm_projects环境不然会出现「明明装了包却 import 报错」的经典翻车。2.2 数据加载与路径处理六个项目的数据文件都放在同级目录下Notebook 里读数据一般用相对路径。但 Jupyter 的工作目录取决于你从哪里启动所以最稳的做法是在每个 Notebook 开头统一确认路径。import pandas as pd import numpy as np import os # 确认当前工作目录避免路径玄学问题 print(os.getcwd()) # 读取员工流失数据先看形状和前几行 hr pd.read_csv(HR_comma_sep.csv) print(hr.shape) print(hr.head()) print(hr.dtypes)HR_comma_sep.csv是经典的员工流失数据集字段包括满意度、绩效评估、项目数、月工时、司龄、是否离职等。shape先确认行列数dtypes看有没有该是数值却被读成 object 的列——这一步能提前发现编码或分隔符问题。电信客户流失的Telco-Customer-Churn.csv里TotalCharges列经常被读成字符串因为里面有空格后面做数值计算前必须处理。# 电信数据里 TotalCharges 常见坑空格导致被识别为 object telco pd.read_csv(Telco-Customer-Churn.csv) print(telco[TotalCharges].dtype) # 大概率是 object # 强制转数值无法转换的变 NaN 再统一处理 telco[TotalCharges] pd.to_numeric(telco[TotalCharges], errorscoerce) print(telco[TotalCharges].isnull().sum())errorscoerce的作用是把转换失败的单元格变成 NaN 而不是直接报错中断这样你能先看到有多少条脏数据再决定是删还是填。这个参数在处理真实业务数据时几乎是标配。3. 流失预警类项目怎么落地从特征工程到模型评估的完整链路3.1 员工流失与电信流失的共性流程员工流失和电信客户流失本质是同一类问题二分类预测正负样本不平衡业务方关心的是「能不能提前圈出高风险人群」。两个 Notebook 的流程骨架一致——缺失值处理、类别特征编码、特征缩放、模型训练、混淆矩阵和 ROC 评估。先看员工流失里的特征处理。salary列是 low/medium/high 三档需要转成有序数值sales和department是类别列用 one-hot 编码。from sklearn.preprocessing import LabelEncoder, StandardScaler from sklearn.model_selection import train_test_split # salary 是有序类别手动映射比 LabelEncoder 更可控 salary_map {low: 0, medium: 1, high: 2} hr[salary] hr[salary].map(salary_map) # department 和 sales 无序用 get_dummies hr pd.get_dummies(hr, columns[department, sales], drop_firstTrue) # 特征与标签分离 X hr.drop(left, axis1) y hr[left] # 分层抽样保证训练集测试集正负比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)stratifyy在流失预测里很关键因为离职样本通常只占百分之十几不分层的话测试集里可能正样本少得可怜评估指标会失真。drop_firstTrue是避免 one-hot 后的虚拟变量陷阱虽然对树模型影响不大但对逻辑回归这类线性模型是必要的。3.2 模型选择与评估指标怎么看员工流失项目里通常会对比逻辑回归和随机森林。逻辑回归可解释性强系数能直接看哪个特征推高离职概率随机森林效果好但解释性弱一些。电信流失项目里可能还会上 SVM 或简单神经网络。from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, roc_auc_score # 逻辑回归class_weight 处理不平衡 lr LogisticRegression(class_weightbalanced, max_iter1000, random_state42) lr.fit(X_train_scaled, y_train) lr_pred lr.predict(X_test_scaled) print(LR AUC:, roc_auc_score(y_test, lr.predict_proba(X_test_scaled)[:, 1])) print(classification_report(y_test, lr_pred)) # 随机森林不需要缩放直接用原始特征 rf RandomForestClassifier(n_estimators200, class_weightbalanced, random_state42) rf.fit(X_train, y_train) rf_pred rf.predict(X_test) print(RF AUC:, roc_auc_score(y_test, rf.predict_proba(X_test)[:, 1])) print(classification_report(y_test, rf_pred))class_weightbalanced让模型自动按类别频率反比加权缓解不平衡问题。评估时不要只看 accuracy——如果离职率是 15%全预测「不离职」也有 85% 准确率但这个模型毫无用处。重点看 recall召回率和 AUC业务上更关心「该抓的风险有没有漏掉」。提示predict_proba返回的是概率roc_auc_score需要传正类的概率值别传成predict的硬标签否则 AUC 会算错。4. 决策树、关联规则与回归另外三个项目的技术要点4.1 药物数据集决策树与可视化药物数据集DRUG1n.csv是一个小规模分类数据集字段包括年龄、性别、血压、胆固醇、Na/K 比值目标是预测适合哪种药物。这个项目用决策树做分类重点在于树的可视化和规则提取。from sklearn.tree import DecisionTreeClassifier, export_text from sklearn.preprocessing import LabelEncoder drug pd.read_csv(DRUG1n.csv) print(drug.head()) print(drug[Drug].value_counts()) # 类别特征编码 le LabelEncoder() for col in [Sex, BP, Cholesterol]: drug[col] le.fit_transform(drug[col]) X_drug drug.drop(Drug, axis1) y_drug drug[Drug] dt DecisionTreeClassifier(max_depth4, min_samples_leaf5, random_state42) dt.fit(X_drug, y_drug) # 直接打印决策规则比画图更直观 print(export_text(dt, feature_nameslist(X_drug.columns)))max_depth4和min_samples_leaf5是控制过拟合的两个关键参数。药物数据样本量小树太深会记住噪声export_text输出的规则可以直接拿给业务方看比如「Na/K 大于某阈值且血压高则推荐 drugY」这种可读性很强的结论。4.2 保险交叉销售的关联规则保险交叉销售项目用的是关联规则学习核心是找出「买了 A 产品的客户大概率也会买 B 产品」这种组合。mlxtend的 Apriori 是常见做法。from mlxtend.frequent_patterns import apriori, association_rules # 假设数据已经转成 one-hot 的交易矩阵格式 frequent_items apriori(insurance_encoded, min_support0.05, use_colnamesTrue) rules association_rules(frequent_items, metriclift, min_threshold1.2) # 按提升度排序lift 大于 1 说明正相关 rules_sorted rules.sort_values(lift, ascendingFalse) print(rules_sorted[[antecedents, consequents, support, confidence, lift]].head(10))min_support0.05表示组合至少出现在 5% 的交易里太低会产出大量无意义规则。lift大于 1 说明前项和后项正相关等于 1 说明独立小于 1 说明负相关。实际业务里通常还会叠加confidence门槛比如只保留置信度 0.6 以上的规则。4.3 世界幸福报告的回归分析世界幸福报告项目偏探索性分析和多元线性回归。exploratory_data_analysis.py这个脚本大概率就是配合这个项目做分布可视化和相关性热力图的。import matplotlib.pyplot as plt import seaborn as sns # 相关性热力图快速看哪些变量和幸福分数相关 plt.figure(figsize(10, 8)) sns.heatmap(happiness.corr(), annotTrue, cmapcoolwarm, fmt.2f) plt.title(Happiness Factors Correlation) plt.show() # 多元线性回归 from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score features [GDP per capita, Social support, Healthy life expectancy] X_h happiness[features] y_h happiness[Happiness Score] lr_h LinearRegression() lr_h.fit(X_h, y_h) print(R2:, r2_score(y_h, lr_h.predict(X_h))) print(系数:, dict(zip(features, lr_h.coef_)))R2看模型解释了多大比例的方差系数看每个因素对幸福分数的边际影响方向。这个项目适合练手回归分析的完整流程从可视化到建模到系数解读。5. 英雄联盟胜负预测与特征选择集成模型和特征筛选的配合5.1 比赛数据的特征提取英雄联盟比赛数据games.csv和train.csv、test.csv的结构通常是每行一场比赛包含双方的经济、击杀、推塔、龙控等统计。预测目标是二分类——蓝方赢还是红方赢。games pd.read_csv(games.csv) train pd.read_csv(train.csv) test pd.read_csv(test.csv) print(games.columns.tolist()) print(train.shape, test.shape) # 常见特征经济差、击杀差、推塔差等 # 具体列名以实际数据为准这里演示构造差值特征的思路 games[gold_diff] games[blueGold] - games[redGold] games[kill_diff] games[blueKills] - games[redKills] games[tower_diff] games[blueTowers] - games[redTowers]差值特征是这类对抗数据的核心——绝对值意义不大双方差距才是胜负的信号。feature_selection.py这个脚本大概率就是用方差阈值、卡方检验或递归特征消除来筛掉冗余特征。from sklearn.feature_selection import SelectKBest, f_classif # 用 F 检验选 Top K 特征 selector SelectKBest(score_funcf_classif, k10) X_selected selector.fit_transform(X_lol, y_lol) # 看哪些特征被选中 selected_mask selector.get_support() selected_features [f for f, s in zip(X_lol.columns, selected_mask) if s] print(选中特征:, selected_features)SelectKBest的k值需要试太小丢信息太大没起到筛选作用。常见做法是先跑一遍看特征得分排序再结合业务理解决定保留几个。5.2 XGBoost 与 LightGBM 的选型差异英雄联盟胜负预测这类结构化数据梯度提升树是首选。XGBoost 和 LightGBM 都能用差异主要在训练速度和内存占用上。import xgboost as xgb from sklearn.metrics import accuracy_score model_xgb xgb.XGBClassifier( n_estimators300, max_depth6, learning_rate0.05, subsample0.8, colsample_bytree0.8, random_state42, eval_metriclogloss ) model_xgb.fit(X_train_lol, y_train_lol) pred_xgb model_xgb.predict(X_test_lol) print(XGBoost Accuracy:, accuracy_score(y_test_lol, pred_xgb))subsample0.8和colsample_bytree0.8是行采样和列采样比例作用是增加模型多样性、抑制过拟合。learning_rate0.05配合n_estimators300是常见的慢学习率多轮迭代组合比learning_rate0.3配 50 棵树更稳。LightGBM 在数据量大的时候训练更快参数体系类似把XGBClassifier换成LGBMClassifier即可。6. 避坑与排查这六个项目跑不通时先查这几条6.1 编码报错与中文列名问题现象pd.read_csv报UnicodeDecodeError或者读进来中文列名变成乱码。原因CSV 文件编码可能是 GBK 或 UTF-8 with BOMpandas 默认按 UTF-8 读。解决先试encodingutf-8-sig不行再试encodinggbk。不确定的话用chardet检测。import chardet with open(HR_comma_sep.csv, rb) as f: print(chardet.detect(f.read(10000)))6.2 特征缩放遗漏导致模型效果异常现象逻辑回归或 SVM 的准确率低得离谱或者出现收敛警告。原因忘了做标准化量纲差异大的特征比如月工时几千 vs 满意度 0-1让梯度下降走偏。解决线性模型和 SVM 必须缩放树模型不需要。缩放器只能在训练集上fit测试集用transform否则数据泄漏。6.3 类别不平衡导致模型全预测多数类现象accuracy 很高但 recall 接近 0混淆矩阵里少数类一个都没抓到。原因流失、欺诈这类场景正样本占比低模型倾向于全预测多数类来刷准确率。解决class_weightbalanced、SMOTE 过采样、或者调整预测阈值。评估指标换成 AUC、F1、recall。6.4 关联规则产出大量无意义组合现象Apriori 跑出来几千条规则lift 都在 1 附近没法用。原因min_support设太低或者数据里本身没有强关联。解决提高min_support和min_threshold叠加confidence过滤再按 lift 排序人工审查 Top 20。6.5 Notebook 运行顺序错乱导致变量未定义现象NameError: name X_train is not defined但代码明明写了。原因Jupyter 的 cell 执行顺序和书写顺序不一致中间跳过了定义变量的 cell。解决Kernel - Restart Run All从头跑一遍。养成习惯每次改完代码交付前必须完整重启跑一次。7. 把这套资源用出最大价值改造数据集和交叉验证的实操建议六个项目跑通只是第一步真正让这套资源产生价值的方式是把它当成模板去套自己的数据。我自己的习惯是拿到任何一个新数据集先复制员工流失那个 Notebook 的结构把数据加载和特征工程部分替换掉后面的建模和评估流程基本不用大改。具体做法上建议在每个项目里加一层交叉验证比单次 train_test_split 更可靠。以员工流失为例from sklearn.model_selection import cross_val_score from sklearn.pipeline import Pipeline # 把缩放和模型串成 pipeline交叉验证时不会数据泄漏 pipe Pipeline([ (scaler, StandardScaler()), (clf, LogisticRegression(class_weightbalanced, max_iter1000)) ]) # 5 折交叉验证看 AUC 的均值和标准差 scores cross_val_score(pipe, X, y, cv5, scoringroc_auc) print(fAUC: {scores.mean():.4f} /- {scores.std():.4f})用Pipeline把预处理和模型绑在一起是避免数据泄漏的标准做法——交叉验证的每一折里缩放器只在训练部分 fit不会偷看验证集的信息。scores.std()看稳定性如果标准差超过 0.05说明模型对数据划分太敏感需要检查特征或样本量。另一个建议是拿世界幸福报告那个项目练手特征构造。原始字段只有 GDP、社会支持、健康预期寿命几个可以试着加交互项GDP 乘以社会支持、多项式项看 R2 能提升多少。这种小数据集上做特征实验成本低反馈快比直接上大项目更容易积累直觉。英雄联盟那个项目的数据如果有时间序列结构比如按分钟的经济曲线可以试试把train.csv和test.csv按时间切分而不是随机切分更贴近真实预测场景。保险交叉销售项目可以试着把 Apriori 换成 FP-Growth数据量大时速度快一个量级mlxtend里直接有fpgrowth函数参数和apriori一致。从那以后我每次拿到新的 Notebook 资源都强制先 Restart Run All 跑一遍再改代码确认基线可复现才动手。这套六个项目的资源基线是干净的数据集也齐全剩下的就看你怎么把它拆成自己的东西了。希望帮到你。本文还有配套的精品资源点击获取