Python多元线性回归预测客户价值:期末大作业全流程指南
发布时间:2026/10/1 3:27:16来源:尧图网络
简介面向Python课程设计、期末大作业场景的多元线性回归信用卡客户价值预测项目包适合正在完成机器学习或统计建模作业的本科及高职学生。包内含完整Python源码、客户价值数据表与项目设计报告代码按导入库、读取Excel数据、建模、评估的步骤组织并配有数据可视化图表便于对照理解回归建模全过程。压缩包共33个文件以19张png可视化图片、2个py脚本和1份xlsx数据表为核心另有pdf、doc、md三种格式的设计报告及pptx答辩演示文稿整体大小约26.58MB目录结构清晰可直接用于学习、复现或答辩展示。目前已有481人学习下载。提供的内容包括可直接运行的多元线性回归模型源码、绘图脚本、原始数据表、Markdown版项目设计报告和期末答辩PPT读者可据此复现信用卡客户价值预测流程快速完成课程报告、答辩材料准备及回归分析实验验证。1. 多元线性回归模型预测信用卡客户价值期末大作业从数据到报告的一站式参考信用卡客户价值预测这类题目几乎是 Python 期末大作业和课程设计里出场率最高的选题。难点从来不在算法本身而在整个链条Excel 数据表怎么读、字段怎么筛选、回归模型怎么在 sklearn 和 statsmodels 之间切换、显著性怎么解释、最后报告里的图表和结论怎么组织。我拆的这个资源包正好把这条路走了一遍完整源码、客户价值数据表、Markdown/PDF/Word 三种格式的设计报告、答辩 PPT 都在压缩包里。适合正在做期末大作业、备课程设计答辩或者想找一个完整多元线性回归案例照着改的人。2. 数据准备与探索性分析先搞清客户价值数据表的底细再谈建模2.1 读取 Excel 数据pandas 的 read_excel 与字段体检源码第一步是导入库用的都是 Python 数据分析最标准的一套matplotlib 画图、pandas 处理数据、statsmodels 做统计推断、sklearn 做机器学习建模。新手容易忽略的是数据体检这个动作拿到客户价值数据表.xlsx直接丢进模型后面必然翻车。import pandas as pd import matplotlib.pyplot as plt file_path 客户价值数据表.xlsx data pd.read_excel(file_path, sheet_name0) print(数据形状:, data.shape) print(字段类型:\n, data.dtypes) print(描述统计:\n, data.describe().T) print(缺失值统计:\n, data.isnull().sum())read_excel的sheet_name0表示读第一个工作表如果表里有多个 sheet可以改成表名或索引号。describe().T转置后每行是一个字段方便纵向看均值和分位数。isnull().sum()是核对缺失值最直接的方式——客户价值数据表这类手工整理的 Excel 经常有空行不做这一步回归结果会直接报错或者静默丢掉样本。数据体检之后要做两件事确认目标列是哪一列以及哪些字段是真正的数值型输入。这个资源包里目标就是“客户价值”列其余特征列要自己根据业务含义确认常见的有年龄、收入、学历、交往时长、额度、消费频率等。用select_dtypes把数值列筛出来做相关性矩阵能快速判断哪些特征和目标线性相关。2.2 可视化探索散点图矩阵与相关性热力图模型还没建先看图。资源包里那十几张img_*.png图片就是这一阶段产出的散点图和热力图设计报告里直接引用了它们。import seaborn as sns numeric_df data.select_dtypes(include[number]) corr_matrix numeric_df.corr() plt.figure(figsize(10, 8)) sns.heatmap(corr_matrix, annotTrue, cmapRdBu_r, fmt.2f) plt.title(特征相关性热力图) plt.show()相关性矩阵的用途有两个一是看每个特征与目标变量的相关方向和强度二是提前发现特征之间的强相关。如果两个特征的相关系数超过 0.8后面模型的系数会出现明显的多重共线性问题这一点在避坑章里会展开。annotTrue把相关系数标在格子里fmt.2f控制小数位报告里直接截图就能用。2.3 数据清洗缺失值、异常值与量纲统一Excel 手工整理的数据表最怕两件事空单元格和异常值。空单元格的处理要分情况均值填充只适合数值型且缺失率低于 5% 的字段对客户价值这类目标列如果缺失直接删行不要拿均值去填否则会把分布拉偏。异常值用describe()里的 min/max 和 25%/75% 分位数来判断——比如年龄字段出现 200这种行直接删。# 简单清洗流程按实际情况调整 data data.dropna(subset[客户价值]) data data[(data[年龄] 0) (data[年龄] 100)] for col in [收入, 消费金额]: q75, q25 data[col].quantile(0.75), data[col].quantile(0.25) iqr q75 - q25 upper q75 1.5 * iqr data data[data[col] upper]量纲统一这一步很多人会忘。收入是万元级年龄是十级消费频率是个位数三个量纲混在一起直接丢进 sklearn虽然模型系数照样能算出来但解释起来非常痛苦——一个系数 0.0003 你很难跟老师说清楚“收入每增加 1 元客户价值增加多少”。是否标准化放到模型训练一节再讲这里只需要先做到数据本身干净。3. 特征工程与模型训练sklearn 和 statsmodels 双路完成线性回归3.1 训练集测试集划分train_test_split 的参数与随机种子建模的第一步是划分数据集。常见的比例是 7:3 或 8:2期末作业样本量通常只有几百行测试集别切太大20% 就够了。random_state必须固定不然后面每次跑的结果都不一样报告里的数字没法对上。from sklearn.model_selection import train_test_split X data.drop(columns[客户价值]) y data[客户价值] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) print(训练集样本数:, X_train.shape[0]) print(测试集样本数:, X_test.shape[0])drop(columns[客户价值])是拿除了目标列以外的全部特征做输入。如果数据表里有客户 ID、姓名这种纯标识列在划分之前就应该剔除它们对预测没有任何贡献反而会干扰模型。random_state42是让随机划分可复现的标准写法期末答辩最怕老师说“你现场再跑一遍”数字变了很难解释。3.2 sklearn LinearRegression训练、预测与回归评估指标sklearn 的LinearRegression走的是机器学习路线关注预测精度。拟合完成后用 R² 和 RMSE 两个指标衡量效果R² 越接近 1 说明模型解释力越强RMSE 看预测误差的绝对水平。from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score, mean_squared_error model LinearRegression() model.fit(X_train, y_train) y_pred model.predict(X_test) r2 r2_score(y_test, y_pred) rmse mean_squared_error(y_test, y_pred, squaredFalse) print(测试集 R2:, round(r2, 4)) print(测试集 RMSE:, round(rmse, 4)) print(截距:, round(model.intercept_, 4)) print(特征系数:, dict(zip(X.columns, model.coef_.round(4))))mean_squared_error在较新版本 sklearn 里支持squaredFalse直接返回 RMSE老版本没有这个参数需要用np.sqrt(...)包一层。特征系数打印出来后要逐个跟业务常识比对收入系数应该是正的、逾期次数系数应该是负的如果一个特征的系数符号反直觉大概率存在共线性问题。期末报告里 R² 和 RMSE 这两行是必写的建议把 train 和 test 两组指标都算出来对比过拟合程度。3.3 statsmodels OLSP 值和置信区间才是统计课要的重点如果这门课是统计学或计量经济学方向的光有 sklearn 的输出不够答辩老师一定会问“哪些变量显著”。statsmodels 的OLS能给出每个变量的 P 值和置信区间这是 sklearn 给不了的。import statsmodels.api as sm X_sm sm.add_constant(X) sm_model sm.OLS(y, X_sm).fit() print(sm_model.summary())sm.add_constant(X)是 statsmodels 和老版本 sklearn 最大的区别——你必须手动给设计矩阵加一列常数项它才会计入截距。OLS(y, X_sm)里第一个参数是目标第二个是特征矩阵顺序反了报错会很难看。.fit()之后直接.summary()会输出一张大表重点看几列参数含义把关标准R-squared模型整体解释力期末作业 0.5 以上可接受Pt单变量显著性coef回归系数符号要符合业务直觉Omnibus / Durbin-Watson残差诊断DW 接近 2 说明残差独立期末报告建议把这张 summary 表的截图放进去然后单独列一张表把显著变量摘出来解释。如果所有变量 P 值都大于 0.05大概率是样本量太小或者特征之间有严重多重共线性先去处理数据别急着往报告里写结论。3.4 标准化对系数的影响什么时候该用 StandardScaler这个资源场景里有两种做法取决于你报告里想讲什么。讲预测效果用原始量纲的特征系数解读是“收入每增加 1 万元客户价值平均增加多少元”讲变量重要性必须标准化否则量纲大的特征系数天然就小没法比较。from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_scaled scaler.fit_transform(X) model_std LinearRegression() model_std.fit(X_scaled, y) coef_std pd.Series(model_std.coef_, indexX.columns) print(coef_std.sort_values(ascendingFalse))标准化之后的回归系数表示“该特征每变化一个标准差目标变化多少个标准差”系数绝对值越大这个变量在模型里影响力越强。答辩时用这套输出给出“影响客户价值最核心的三个因素是……”比单报一个 R² 有说服力得多。注意一点先做训练测试集划分再用fit_transform测试集只能transform不能重新 fit否则数据泄漏这是机器学习的铁律。4. 模型诊断与常见问题避坑多重共线性、P 值和残差假设怎么排查4.1 现象模型 R² 很高但某个系数符号跟业务直觉相反这是我拆这类期末作业时见过最多的情况。客户价值数据和收入正相关是常识但跑出来的收入系数是负的。原因几乎都是特征之间存在强相关性——收入和信用卡额度、消费金额往往高度相关回归模型分配系数时出现了共线性干扰。解决做法是看相关性矩阵和方差膨胀因子 VIFVIF 大于 10 的特征删掉或合并。from statsmodels.stats.outliers_influence import variance_inflation_factor X_vif sm.add_constant(X) vif_data pd.DataFrame({ 特征: X_vif.columns, VIF: [variance_inflation_factor(X_vif.values, i) for i in range(X_vif.shape[1])] }) print(vif_data)删掉 VIF 过高的变量之后重新训练系数符号通常会恢复正常。这段时间的经验是符号错了先查共线性别急着怀疑模型写错了。4.2 现象statsmodels 的输出里没有截距那一行statsmodels 的 OLS 如果忘加常数项拟合结果里coef第一行可能不是你想的截距或者截距被忽略R² 的计算方式也会变。原因是sm.OLS默认设计矩阵里没有常数列必须靠sm.add_constant手动加。解决建模前一行先X_sm sm.add_constant(X)然后检查X_sm第一列是否全是 1。答辩前把这两行代码和输出截图对一下确认 summary 表格里有const行。4.3 现象换一次 random_state结果变化很大客户价值数据表样本量通常只有几百行8:2 划分后测试集就不到一百个样本。random_state从 42 改成 0R² 能从 0.6 掉到 0.3。原因不是模型不稳定而是小样本下划分的随机性被放大了。解决做法是两个一是固定种子并且在报告里写明random_state42二是改用cross_val_score做 K 折交叉验证把多折的平均分写进报告。from sklearn.model_selection import cross_val_score scores cross_val_score(model, X, y, cv5, scoringr2) print(5折交叉验证 R2:, scores.mean().round(4))期末报告里加上交叉验证结果能挡住“你这个 0.8 是不是凑出来的”这类问题。4.4 现象预测值在真实值偏大的区间系统性偏低做预测值和真实值散点图时如果高价值客户的点都落在对角线下方说明模型对极端值不敏感常见原因是目标变量“客户价值”分布严重右偏少数大客户把均值拉高了。线性回归假设误差正态分布目标太偏会让残差也偏。解决做法是对目标做对数变换再训练和预测解释时把预测值exp回去。import numpy as np y_log np.log1p(y) model_log LinearRegression() model_log.fit(X, y_log) y_pred_log model_log.predict(X_test) y_pred_original np.expm1(y_pred_log)注意log1p和expm1是成对使用的数值 0 也能处理。变换之后 R² 可能看起来略低但残差图会均匀很多答辩老师看残差图这一关能过。4.5 现象报告里的 P 值大于 0.05 的变量也写进了显著性结论期末报告最容易犯的错把 summary 表里所有变量当成“显著影响因素”写进结论。P 值大于 0.05 意味着在 95% 置信水平下这个系数无法证明不为零写进结论是站不住的。解决做法是只挑 P0.05 的变量进最后的结论段并且在设计报告里列一个“变量筛选”小节说明剔除流程。5. 结果解读与交付收尾把回归系数讲成答辩和报告里能用的结论模型跑完不是终点期末作业的交付物是设计报告和 PPT怎么把统计结果翻译成人话才是拿分的关键。我一般会做三件事先把标准化系数按绝对值排序确定“影响客户价值的前三个因素”再从 summary 里挑出显著变量针对每个变量写一句业务解释最后把训练集 R²、测试集 R²、交叉验证均值三个数字对齐放进报告结论页。importance coef_std.abs().sort_values(ascendingFalse) print(特征重要性排序:\n, importance) top_features importance.head(3).index.tolist() target_coefs coef_std[top_features] print(Top3 标准化系数:\n, target_coefs)我个人的习惯是凡是涉及变量重要性的话术都只用标准化系数的排序结果不拿原始系数比大小。答辩时被问到“你怎么判断哪个变量更重要”把这一段代码和一页排序图亮出来比空口解释有说服力得多。做这份资源对应的项目时我还踩过一个细节坑——设计报告里引用的图片和 Excel 数据表文件路径在换电脑打开时全断了从那以后我每次交作业前都强制走一遍“压缩包解压到全新路径、跑通主脚本、确认报告图片路径存在”这三步同桌吃过的亏我不打算重吃。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网