Python机器学习实战源码全解析:从ndarray到MLP客户流失预测
发布时间:2026/9/24 22:31:28来源:尧图网络
简介《Python机器学习编程与实战》配套源代码与实验数据打包提供面向希望从零掌握Python机器学习、并借助案例动手练习的初学者。压缩包共77个文件约82.8MB以27个.py脚本、25个.csv实验数据为主另有18张流程示意图、Excel表格、npz数据及SQL脚本等代码与数据按第1-8章对应组织。内容从Python基础语法、Pandas/NumPy数据处理延伸到特征工程、K-means客户价值分析、决策树餐饮客户流失预测、多层感知器电信客户流失预测等完整案例第5章还附有大量Matplotlib可视化示例可对照运行并观察输出。随包附带的泰迪科技大数据、商务数据分析、人工智能产品体系图有助于理解机器学习在实际业务中的落地场景。目前已有676人学习使用适合边看书边动手复现结果的读者。1. Python机器学习编程与实战源码包能跑通比看得懂更有用这份《Python机器学习编程与实战》源代码和实验数据包治的是书看完了代码还跑不通的毛病。我第一次打开这个压缩包时先找readme翻了半天没找到。后来发现根本不需要——代码文件名已经把顺序写明白了。从第1章的Python基础语法、第2章ndarray、第3章pandas一路到第7章餐饮客户流失预测、第8章运营商客户流失预测每一步都有配套数据和能直接执行的.py文件。适合正在学机器学习、卡在理论懂但写不出代码阶段的初学者也适合需要快速搭一套客户流失实验做演示的从业者。泰迪科技的产品体系图放在包里产业场景和代码对得上。2. 先拆包再动手8个章节的数据流与代码组织这份资源不是一个孤立的大工程而是按教材章节组织的渐进式代码集。拿到压缩包后不要急着双击运行先把目录结构看清理解每个章节要解决什么问题、数据和代码怎样衔接再动手跑。这样遇到报错时能快速判断是代码问题、数据问题还是环境问题。2.1 目录结构里藏的学习路线从ndarray到MLP的四个阶段解压后能看到8个chapter目录加上泰迪科技的几张介绍图片。按技术栈分组其实是四条递进的线第1-2章是基础语法层。1.3 控制语句.py、1.4 函数.py、2.1 ndarray创建与索引.py、2.2 ndarray的基础操作.py、2.3 ufunc.py这五个文件解决的是会不会写Python和会不会用NumPy的问题。数据文件很少重点是语法本身。第3-4章是数据处理层。3.1 pandas常用类.py、3.2 DataFrame基础操作.py、3.3 其他数据类型操作.py配合第4章的4.1 数据读取与写出.py、4.2 DataFrame进阶.py、4.3 数据准备.py。这层开始出现真实数据文件users_info.xlsx、Station.csv、orders.sql、Concrete.csv、meal_order_info.csv。《第4章的数据文件最杂xlsx、csv、sql三种格式都有这是故意的——真实业务数据从来不会乖乖躺在一个csv里》。第5-6章是分析与建模基础。第5章全是Matplotlib绘图从5.1 Matplotlib绘图基础.py到5.2 分析特征关系常用图形.py、5.3 分析特征内部数据状态常用图形.py输出了一堆png图折线图、散点图、箱线图、饼图、直方图这是在做探索性数据分析。第6章是sklearn全家桶6.1 数据准备.py、6.2 降维.py、6.3 分类.py、6.4 回归.py、6.5 聚类.py、6.6 模型选择.py目录下还有个tmp/cancer对应sklearn内置的乳腺癌数据集。第7-8章是综合实战。第7章用K-means做客户价值分析、决策树做餐饮客户流失预测数据文件非常多Meals_income.csv、user_loss.csv、users.csv、meal_order_info.csv、sale_sum.csv等。第8章特征工程加多层感知器MLP做运营商客户流失预测数据文件从USER_INFO_M.csv一路衍生到data_preprocessed.csv这条数据流水线是整个包里最值得研究的。2.2 四种数据文件形态csv/xlsx/sql/npz怎么读包里数据文件格式不统一这是好事——正好覆盖了日常工作中最常见的几种存储形态。逐个说下读取方式和注意事项。import pandas as pd import pymysql # 1. csv文件注意编码 df_csv pd.read_csv(meal_order_info.csv, encodinggbk) # 2. xlsx文件需要openpyxl df_xlsx pd.read_excel(users_info.xlsx, sheet_name0) # 3. sql文件先导入MySQL再用pymysql读取 conn pymysql.connect( hostlocalhost, userroot, password你的密码, databasetest, charsetutf8mb4 ) df_sql pd.read_sql(SELECT * FROM orders, conn) conn.close() # 4. npz文件NumPy压缩格式 import numpy as np data np.load(国民经济核算季度数据.npz, allow_pickleTrue) print(data.files) # 查看里面有哪些数组逻辑说明第8行指定encodinggbk是因为很多国内系统导出的csv是GBK编码不指定会报UnicodeDecodeError。第14行的charsetutf8mb4解决中文乱码问题这是读MySQL的标准姿势。第23行allow_pickleTrue是npz里存了Python对象时才需要纯数值数组可以不加。参数说明read_sql的第二个参数是数据库连接对象SQL语句直接写原生的SELECT。np.load返回的是NpzFile对象用data[数组名]取具体内容。跑之前建议把所有csv统一转成utf-8后面建模阶段能少踩一半的乱码坑。2.3 先跑通一条最小链路读csv→看一眼数据→建模拿到新数据集我的习惯是先跑一条最短的链路读取→查看形状和缺失值→跑一个默认参数的模型。不需要调参只需要确认代码和数据能对上。import pandas as pd from sklearn.model_selection import train_test_split from sklearn.neural_network import MLPClassifier from sklearn.metrics import accuracy_score # 第8章的预处理结果文件列名已经标准化 df pd.read_csv(data_preprocessed.csv) print(df.shape) print(df.columns.tolist()) print(df.isnull().sum()) # 假设最后一列是流失标签前几列是特征 X df.iloc[:, :-1] y df.iloc[:, -1] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) model MLPClassifier(hidden_layer_sizes(50, 50), max_iter500, random_state42) model.fit(X_train, y_train) print(accuracy_score(y_test, model.predict(X_test)))逻辑说明第10行的isnull().sum()是数据体检第一步全为0说明前面特征工程做得干净。第15行用iloc按位置切分特征和标签避免硬编码列名。第22行MLPClassifier先用默认参数跑通准确率低没关系关键是确认整个管道没有报错。我一般会先用describe()看数值范围再用value_counts()看标签是否均衡这两步能避免很多无效建模。参数说明test_size0.2表示20%数据留作测试集random_state42固定随机种子保证每次跑的结果一致——这是做实验的基本素养不固定种子的话前后结果没法对比。hidden_layer_sizes(50, 50)是两层隐藏层各50个神经元对中小规模数据集起步够用。3. 逐章过一遍核心代码基础语法到sklearn六件套中间四章第1、2、3、4组代码是后面两个综合案例的地基。地基不牢的话第7、8章跑起来会一脸懵。这章挑每个阶段最关键的文件拆开讲说明代码在干什么、参数怎么调、运行会输出什么。3.1 第1-2章Python基础与NumPy的五个文件第1章的1.3 控制语句.py和1.4 函数.py覆盖if/else、for、while、函数定义和参数传递这些是Python的基本功。如果这两份文件跑起来有报错说明基础语法还不熟建议先回头补Python基础再往下走。第2章三个文件针对NumPy这是科学计算的基石。看一份最典型的import numpy as np # 创建一维数组 arr1 np.array([1, 2, 3, 4, 5]) # 创建二维数组并切片 arr2 np.arange(12).reshape(3, 4) print(arr2[1, :]) # 取第二行 print(arr2[:, 2]) # 取第三列 print(arr2[arr2 5]) # 布尔索引取出大于5的元素 # ufunc向量化运算 x np.array([1, 2, 3]) y np.array([4, 5, 6]) print(np.add(x, y)) # 对应元素相加 print(np.dot(x, y)) # 点积逻辑说明reshape(3, 4)把0-11共12个整数变成3行4列的矩阵这里的行和列顺序容易搞反arr2[1, :]是行索引为1的所有列得到第2行。布尔索引是NumPy最强大的特性之一arr2 5生成同形状的布尔矩阵直接用方括号取值不需要写循环。ufuncuniversal function对数组的每个元素执行相同运算np.add比Python原生循环快一个数量级。参数说明arange(12)生成0到11的整数序列步长默认为1。dot计算向量内积结果是一个标量。这些基础操作后续的pandas和sklearn都会大量用到值得反复手敲几遍。3.2 第3-4章pandas进阶与三种格式的数据读写第3章的3.1 pandas常用类.py讲Series和DataFrame的区别3.2 DataFrame基础操作.py讲增删改查、缺失值处理、分组聚合3.3 其他数据类型操作.py覆盖时间序列、分类数据等。第4章在此基础上加了真实数据读写。重点看4.1 数据读取与写出.py。这个文件演示了前面提到的四种数据格式的读写其中orders.sql是最容易卡住的地方。没有MySQL环境的话可以用SQLite先跑通流程import pandas as pd import sqlite3 # 用SQLite代替MySQL适合本地快速实验 conn sqlite3.connect(orders.db) df pd.read_sql(SELECT * FROM orders LIMIT 100, conn) conn.close() # 写出注意index参数 df.to_csv(orders_sample.csv, indexFalse, encodingutf-8) df.to_excel(orders_sample.xlsx, indexFalse)逻辑说明这里演示了DataFrame的写出操作。第10行的indexFalse很关键——如果不设置会把行索引当成一列写进文件后面读回来时数据会多一个Unnamed列这是新手最容易踩的坑。第11行to_excel同理。参数说明LIMIT 100限制读取行数先看数据结构再全量读取是做数据探索的常用技巧。encodingutf-8保证写出文件跨平台没有乱码。第4章还有一个4.3 数据准备.py从文件名看是清洗和规整数据的流程对应后面特征工程的前置环节。3.3 第5-6章Matplotlib可视化与sklearn六个环节第5章的三个文件分别对应绘图基础、特征间关系、特征内部分布。绘图前先做一步配置否则中文标签会显示成方块import matplotlib.pyplot as plt # 中文字体和负号显示 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 折线图 x [1, 2, 3, 4, 5] y [15, 22, 18, 30, 27] plt.plot(x, y, markero, linestyle--, color#2c7fb8) plt.xlabel(季度) plt.ylabel(生产总值亿元) plt.title(季度生产总值变化) plt.grid(True, alpha0.3) plt.show()逻辑说明第4行设置中文字体为黑体SimHei在Windows和多数Linux发行版都自带。第5行unicode_minusFalse解决负号显示为方块的问题。markero给数据点加圆圈标记linestyle--用虚线连接color指定十六进制颜色。grid(True, alpha0.3)加半透明网格线让读数更容易。包里的第5章目录下有线条rc参数对比.png和2016年各产业国民生产总值条形图.png等多张输出图跑完代码后可以对着看看自己画出来的是不是一致。第6章是sklearn完整流程6.1 数据准备.py、6.2 降维.py、6.3 分类.py、6.4 回归.py、6.5 聚类.py、6.6 模型选择.py六个文件刚好对应机器学习六个经典环节。tmp/cancer是乳腺癌数据集分类文件里大概率用到了它。典型的分类流程from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.decomposition import PCA from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report data load_breast_cancer() X, y data.data, data.target # 30维特征二分类 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) # 降维到10维再训练 pca PCA(n_components10) X_train_pca pca.fit_transform(X_train) X_test_pca pca.transform(X_test) model LogisticRegression(max_iter1000) model.fit(X_train_pca, y_train) print(classification_report(y_test, model.predict(X_test_pca)))逻辑说明第15行pca.fit_transform在训练集上拟合PCA并变换第16行pca.transform在测试集上只做变换不再拟合——这个区别很关键测试集不能参与PCA拟合否则会造成信息泄漏模型效果会虚高。第20行用LogisticRegression(max_iter1000)因为默认的100次迭代在高维数据上可能不收敛加上这个参数是为了消除收敛告警。参数说明n_components10将30维降到10维保留大部分方差。classification_report输出精确率、召回率、F1值这比只看准确率更能反映二分类模型的真实水平。4. 两个端到端案例K-means分群、决策树与MLP流失预测第7章和第8章是整份源码包里最值钱的部分。两个案例的商业逻辑相似——预测客户流失但技术路线完全不同第7章先用K-means做客户价值分群再用决策树做分类第8章走的是特征工程加MLP深度神经网络的路线。把这两个案例吃透等于掌握了两套处理结构化数据的完整套路。4.1 第7章餐饮客户流失K-means客户价值分析与决策树预测第7章有代表性的一组数据文件Meals_income.csv餐饮收入、user_loss.csv用户流失标签、users.csv用户信息、meal_order_info.csv订单信息、info_new.csv整合后的数据、sale_sum.csv销售额汇总。数据准备的文件是7.2 数据准备.py核心代码是7.3 使用K-means算法进行客户价值分析.py和7.4 使用决策树算法实现餐饮客户流失预测.py还有个绘制图7-1.py。K-means做客户价值分析业界最常用的框架是RFM模型Recency最近消费时间、Frequency消费频率、Monetary消费金额。这三个指标计算出来之后标准化再聚类import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.cluster import KMeans import matplotlib.pyplot as plt df pd.read_csv(info_new.csv) # 假设数据里有这三个字段计算RFM特征 rfm df.groupby(user_id).agg({ order_date: max, # 最近消费日期 order_id: count, # 消费次数 amount: sum # 消费总额 }).reset_index() rfm.columns [user_id, recency, frequency, monetary] # 标准化后聚类 scaler StandardScaler() rfm_scaled scaler.fit_transform(rfm[[recency, frequency, monetary]]) kmeans KMeans(n_clusters4, n_init10, random_state42) rfm[cluster] kmeans.fit_predict(rfm_scaled) print(rfm.groupby(cluster)[[recency, frequency, monetary]].mean())逻辑说明第8行groupby(user_id)按用户聚合订单数据agg同时计算三个指标reset_index()把user_id转为普通列。第17行StandardScaler先fit再transform将三个不同量纲的指标压缩到均值为0、方差为1的空间这样聚类时金额不会因为数值大而主导距离计算。第20行n_clusters4将客户分为四类n_init10表示用10个不同的初始质心跑10次取最优结果避免K-means陷入局部最优。参数说明聚成4类不是拍脑袋通常观察轮廓系数或肘部法则来确定但实践里4-5类正好对应高价值、潜力、普通、低价值客户业务解释性强。分群结果出来后每类客户的特征均值可以给运营做定向营销。做完分群用决策树做流失预测。决策树相对于神经网络的优势是——结果能解释能生成可视化规则from sklearn.tree import DecisionTreeClassifier, plot_tree X df.drop(is_loss, axis1) # is_loss是流失标签 y df[is_loss] tree DecisionTreeClassifier( max_depth5, # 限制深度防过拟合 min_samples_leaf20, # 叶节点至少20个样本 random_state42 ) tree.fit(X_train, y_train) # 特征重要性排序 importance dict(zip(X.columns, tree.feature_importances_)) for name, imp in sorted(importance.items(), keylambda x: -x[1])[:10]: print(f{name}: {imp:.4f})逻辑说明第10行max_depth5限制树的最大深度深度太深会过拟合训练集。第11行min_samples_leaf20要求叶节点至少20个样本这个参数比max_depth更能有效防止过拟合原理是叶节点样本太少说明划分得太碎。第19行打印特征重要性决策树训练完成后feature_importances_属性直接给出每个特征对预测的贡献度排名这是决策树最有价值的副产品之一——直接告诉你哪些因素影响客户流失。参数说明max_depth和min_samples_leaf是决策树最重要的两个超参数。max_depth从3起步每次加2交叉验证选最优min_samples_leaf一般取样本量的1%左右。4.2 第8章运营商客户流失从原始表到MLP的完整特征工程第8章是全集最完整的数据流水线。来看数据文件的命名顺序其实就是特征工程的推进步骤USER_INFO_M.csv原始用户信息→data_manu.csv手工筛选后→data_drop.csv剔除无用列后→data_os.csv操作系统信息→data_vip.csv会员等级→data_credit.csv信用分→data_group.csv用户群组→data_agree.csv协议信息→data_preprocessed.csv最终预处理结果。这个命名习惯值得学习——每一步处理的结果都单独落盘而不是在一个文件上反复改。这样每个中间结果都能回溯出现问题时能定位到是哪一步出了偏差。实操中我也推荐这个做法一份原始数据每做一步操作就输出一个新文件方便对比前后差异。import pandas as pd df pd.read_csv(USER_INFO_M.csv, encodinggbk) # 第一步剔除重复值和全空列 df df.drop_duplicates() df df.dropna(axis1, howall) # 第二步衍生特征——将通话时长和消费金额组合 df[total_consume] df[monthly_consume] df[extra_consume] df[avg_consume] df[total_consume] / df[call_duration].clip(lower1) # 第三步分类变量编码会员等级映射为数值 df[vip_level] df[vip_rank].map({普通: 0, 银卡: 1, 金卡: 2, 钻石: 3}) # 保存中间结果 df.to_csv(data_manu.csv, indexFalse, encodingutf-8)逻辑说明第8行dropna(axis1, howall)删除全为空的列axis1表示沿列的维度操作howall表示只有整列全空才删除。第11行clip(lower1)将通话时长的最小值限制为1防止除数为0产生inf。第15行map将文本型会员等级映射为有序数值这样模型才能理解金卡银卡普通。参数说明这版特征工程结束后数据导出为data_manu.csv之后每步处理依次生成新的csv最终得到data_preprocessed.csv。整个过程的顺序是先清洗去重、去空→ 再衍生组合特征→ 后编码文本转数值→ 最后标准化。这个顺序不能乱先衍生再清洗的话新特征里的异常值会影响后续处理。4.3 MLP的隐藏层设计与训练参数别一上来就堆神经元第8章的建模代码是8.4 使用多层感知器算法实现通信运营商客户流失预测.py。MLP的代码写起来不长但参数设计直接决定模型效果。from sklearn.neural_network import MLPClassifier from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report df pd.read_csv(data_preprocessed.csv) X df.drop(churn, axis1) y df[churn] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) model MLPClassifier( hidden_layer_sizes(50, 50), activationrelu, solveradam, learning_rate_init0.001, batch_size64, max_iter500, random_state42 ) model.fit(X_train, y_train) print(classification_report(y_test, model.predict(X_test)))逻辑说明第11行stratifyy是分层抽样保证训练集和测试集中正负样本比例一致否则如果流失用户只占10%随机划分可能让测试集里一个流失用户都没有。第15行标准化在划分之后单独做理由和前面PCA一样——测试集不能参与训练集的统计计算。参数说明hidden_layer_sizes(50, 50)是两层各50个神经元。别一上来就堆几百个神经元数据量只有几千条时大网络几乎必然过拟合训练集准确率98%测试集只有70%。learning_rate_init0.001是Adam优化器的初始学习率这个值再大容易震荡不收敛再小收敛速度会非常慢。batch_size64是每次迭代用64个样本更新梯度数据量小的时候设小一点内存也省。max_iter500是最大迭代轮数模型会在达到收敛时自动提前停止500只是一个上限。跑完之后一定用classification_report看precision、recall、F1不要只看accuracy。流失预测场景里recall找出了多少该找的流失用户比precision找出来的人里面有多少真的是流失用户更重要——漏掉一个流失用户的损失远大于打扰一个不会流失的用户。5. 避坑指南跑这套源码前先记下五条血泪经验从我拆这套源码的经历来看运行环境本身比代码更容易让人翻车。下面这五条是高频雷区每条都是我亲眼见过、实际踩过或者帮人排查过的。逐个按现象→原因→解决说清楚跑代码前先看一眼能省两三个小时的排错时间。5.1 现象orders.sql导入MySQL报语法错误报错信息里出现ERROR 1064或You have an error in your SQL syntax。原因orders.sql文件采用的SQL语法版本和本地MySQL版本不匹配。比如文件里用了ENGINEInnoDB DEFAULT CHARSETutf8mb4老版本MySQL不识别utf8mb4或者文件中包含DROP TABLE IF EXISTS语句而当前用户没有DROP权限。另外直接用source命令导入时如果文件编码是UTF-8带BOM第一行会多一个不可见字符导致语法错误。解决不要直接双击导入或复制粘贴。用命令行显式指定编码和数据库mysql -u root -p --default-character-setutf8mb4 -e CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8mb4; mysql -u root -p test --default-character-setutf8mb4 orders.sql如果还是报错用文本编辑器打开sql文件另存为UTF-8无BOM格式再试。我一般把sql文件里的CREATE TABLE语句复制出来单条执行能更快定位是文件问题还是环境问题。5.2 现象Matplotlib画出的图中文全是方块第5章绘图文件里plt.xlabel(季度)后坐标轴标签显示为□□□□。原因Matplotlib默认字体列表里没有中文字体找到的字体库不支持中文字符集。所有需要显示中文的绘图脚本都必须在一开始指定支持中文的字体。解决在import matplotlib.pyplot as plt之后强制执行两行配置plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, DejaVu Sans] plt.rcParams[axes.unicode_minus] FalseSimHei黑体在Windows下都有Linux下可能要装fonts-wqy-zenhei。第二个配置解决负号显示问题。这套配置只对当前脚本生效每个新脚本都要写一遍。我一般把这配置抽成myplot.py公共模块每次import省事。5.3 现象cancer数据集路径找不到FileNotFoundError第6章代码里如果有类似np.load(tmp/cancer/xxx.npy)的相对路径直接从其他目录跑脚本时会报错。原因相对路径是相对当前工作目录CWD解析的不是相对脚本所在目录。如果终端所在的目录和脚本不是同一个路径就找不到。这不是代码问题是运行方式问题。解决进入代码文件所在目录再运行或者用绝对路径。最稳妥的办法是在脚本开头加一段代码自动切换到脚本所在目录import os os.chdir(os.path.dirname(os.path.abspath(__file__)))这段代码先把当前路径切到脚本文件所在的目录后面所有的相对路径都以此为准。这样不管从哪个路径启动Python都能正确找到csv和数据文件。这是处理带资源文件的脚本最省心的习惯。5.4 现象MLPClassifier报Unknown label type: continuous在第8章跑model.fit(X_train, y_train)时抛异常或者提示ValueError: activation relu is not supported。原因MLPClassifier是分类器标签必须是整数或字符串类型的离散值。如果y列是浮点数比如0.0和1.0但pandas读进来时是float64部分sklearn版本会把它当成回归问题标签报出这个错误。activationrelu报not supported则通常是sklearn版本太老早期版本只支持logistic和tanh。解决先强制转换标签类型再看sklearn版本y y.astype(int) # 或 y y.astype(category) print(sklearn.__version__)如果是老版本activation改为logistic或tanh。需要注意的是新版sklearn0.24以上对hidden_layer_sizes的解析也做过调整老代码如果传的是(50,)而不是(50,50)在新版本上只会建一层隐藏层模型表达力下降很多。5.5 现象数据量一大read_csv内存溢出或速度极慢第7章的meal_order_info.csv加上users.csv做join时程序直接卡死或报MemoryError。原因pandas默认会把所有列读成int64或float64各占8个字节。几百万行、几十列的数据光读进来就吃掉几个GB内存。再跨表join内存直接翻倍。解决读取时指定列的类型和只用到的列dtype_dict { user_id: int32, order_id: int32, amount: float32 } df pd.read_csv(meal_order_info.csv, dtypedtype_dict, usecols[user_id, order_id, amount, order_date])dtype把能缩小的类型尽量缩小int32比int64省一半内存float32同理。usecols只保留分析需要的列剩下的全丢弃。如果数据实在太大还可以设置chunksize100000分块读取每块处理完再合并。6. 把案例换到自己的数据上替换、调参、验证的三步走两个流失预测案例跑通后可以开始做迁移。很多读者会问第8章的代码是电信运营商的我是电商场景能用吗能用但流程不是把excel换成csv那么简单。要做三步替换数据源、调整特征工程、验证稳定。第一步先做数据体检。把自己的数据读进来看shape、dtypes、isnull().sum()、describe()四件套。这里有一个关键要求标签列必须确认是0/1二值。第8章代码里y df[churn]换到自己的数据上标签列可能是文字流失/留存先做映射df[churn] (df[status] 流失).astype(int)。特征列要先剔除客户ID、注册时间这类不参与建模的字段否则模型会把这些高基数列当成重要特征效果虚高但没有业务意义。数据量如果超过5万条建议走第7章的决策树路线先跑通再考虑MLP——神经网络在小样本上的表现往往不如调好参的树模型。第二步按情况调整建模代码。我自己的模板是这样数据读取→标准化→划分→baseline模型LogisticRegression默认参数→记录准确率和AUC→替换成MLP或决策树→对比结果。如果baseline的AUC低于0.7先回头检查特征工程而不是去调模型参数——模型救不了烂特征。第三步用交叉验证代替单次划分验证模型是否稳定。我一般跑5折交叉验证记录每次的AUC然后看均值和方差from sklearn.model_selection import cross_val_score from sklearn.ensemble import RandomForestClassifier model RandomForestClassifier(n_estimators100, max_depth6, random_state42) scores cross_val_score(model, X, y, cv5, scoringroc_auc) print(fAUC均值: {scores.mean():.4f}, 标准差: {scores.std():.4f})标准差如果超过0.03说明模型在不同数据子集上表现波动大这时候需要检查数据是否分布不均或考虑加正则化参数。这套流程本身也是我从这套源码包里得到的最有价值的东西。从那以后我每次拿到一份新的数据集都强制走一遍体检→baseline→交叉验证这条路先把数据摸透再谈模型优化。这套习惯帮我少走了很多弯路希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网