程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

用Python实现线性回归算法预测客户价值(含运行代码)

hfteth 2025-02-04 14:10:44 技术文章 12 ℃

1.背景概述

以信用卡客户的客户价值为例来解释客户价值预测的具体含义:客户价值预测就是指预测客户在未来一段时间内能带来多少利润,其利润可能来自信用卡的年费、取现手续费、分期手续费、境外交易手续费、信用卡贷款等。分析出客户价值后,在进行营销、电话接听、催收、产品咨询等各项业务时,可以展开有差异化的业务服务。

针对高价值客户提供区别于普通客户的服务,以进一步挖掘这些高价值客户的价值,并提高他们的忠诚度,这样可以将有限的资源进行合理化的配置,提供客户的满意度。

2.数据集

样本数据共有128组,数据集中变量的详细描述如下表所示,表格中的“客户价值”列为目标变量(因变量),剩下的字段为特征变量(自变量)。目的是根据这些历史数据搭建线性回归模型,找到线性函数关系,用来预测还未评估的客户价值。

3.分析过程

(1)数据读取

首先通过pandas库读取数据,代码如下:

import pandas as pd
df = pd.read_excel('客户价值数据表.xlsx')
df.head()  # 显示前5行数据

通过打印df.head()查看表格的前5行,结果如下所示:

其中第1列“客户价值”为目标变量y,其余4列为特征变量X,接下来将利用这些数据搭建客户价值预测模型。

(2)提取特征变量和目标变量

在建模前,首先将特征变量和目标变量分别提取出来,代码如下:

# 将数据框 df 中名为 '客户价值' 的列删除,作为特征矩阵存储在 X 中
X = df.drop(columns='客户价值') 
# 将数据框 df 中的 '客户价值' 列提取出来,作为目标变量存储在 y 中
y = df['客户价值']   

(3)划分训练集和测试集

提取完特征变量和目标变量后,将数据划分为训练集和测试集,代码如下。

from sklearn.model_selection import train_test_split
# 将特征矩阵 X 和目标变量 y 划分为训练集和测试集
# test_size=0.2 表示测试集占 20%,random_state=123 确保划分结果的可重复性
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

(4)模型构建

划分好训练集和测试集之后,可以从Scikit-Learn库中引入线性回归算法进行模型训练,代码如下:

from sklearn.linear_model import LinearRegression
# 创建一个线性回归模型对象
reg_model = LinearRegression()
# 使用训练集 X_train 和 y_train 对线性回归模型进行训练
reg_model.fit(X_train, y_train)
import numpy as np
# 设置 numpy 的打印选项,抑制科学计数法显示
np.set_printoptions(suppress=True)
# 打印回归系数,并将结果四舍五入到小数点后 4 位
print("回归系数:",reg_model.coef_.round(4))
# 打印回归常数,并将结果四舍五入到小数点后 4 位
print("回归常数:",reg_model.intercept_.round(4))

运行截图:

(5)模型评估

通过如下代码评估搭建的多元线性回归模型是否有效:

import statsmodels.api as sm  
# 为特征矩阵 X_train 添加常数项,这是 statsmodels 要求的,用于计算回归统计信息
X2 = sm.add_constant(X_train)
# 使用普通最小二乘法(OLS)对训练集进行线性回归拟合
est = sm.OLS(y_train, X2).fit()
# 打印回归结果的详细统计信息,包括系数的 p 值、置信区间等
est.summary()

直接运行代码会产生如下错误:

这是由于环境未安装statsmodels库导致,我们采用pip命令进行安装,从镜像网站下载库文件,命令如下:

pip install statsmodels -i https://mirrors.aliyun.com/pypi/simple/

安装截图:

statsmodels库安装成功后再次运行程序,有如下结果。

上面是通过引入statsmodels库来评估线性回归模型的,下面的代码是更通用的方法来计算R-squared值:

from sklearn.metrics import r2_score
# 使用训练好的线性回归模型对训练集进行预测
y_pred=reg_model.predict(X_train)
# 计算训练集的 R2 得分
r2 = r2_score(y_train,y_pred)

代码执行后显示,r2的值为0.56,与利用statsmodels库获得的r2是一致的。

另外还可以通过如下代码,获取测试集上的MAE,MSE和RMSE:

import sklearn.metrics as sm
# 使用训练好的线性回归模型对测试集进行预测
y_pred=reg_model.predict(X_test)
# 计算测试集的平均绝对误差(MAE)
print("MAE:",sm.mean_absolute_error(y_test,y_pred))
# 计算测试集的均方误差(MSE)
print("MSE:",sm.mean_squared_error(y_test,y_pred))
# 计算测试集的均方根误差(RMSE)
print("RMSE:",sm.mean_squared_error(y_test,y_pred)**0.5)

运行截图:

附录:本程序全部代码带解析

# 导入 pandas 库并将其简称为 pd,pandas 是一个强大的数据处理和分析库
import pandas as pd
# 使用 pandas 的 read_excel 函数读取 Excel 文件 '客户价值数据表.xlsx',将数据存储在 DataFrame 对象 df 中
df = pd.read_excel('客户价值数据表.xlsx')
# 调用 df 的 head 方法,显示 DataFrame 的前 5 行数据,方便查看数据的基本情况
df.head()  

# 将 df 中名为 '客户价值' 的列删除,得到特征矩阵 X
X = df.drop(columns='客户价值') 
# 将 df 中名为 '客户价值' 的列提取出来作为目标变量 y
y = df['客户价值']   


# 从 sklearn 的 model_selection 模块导入 train_test_split 函数,用于将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
# 使用 train_test_split 函数将特征矩阵 X 和目标变量 y 划分为训练集和测试集
# test_size=0.2 表示测试集占总数据集的 20%,random_state=123 用于设置随机数种子,保证结果可重复
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)


# 从 sklearn 的 linear_model 模块导入 LinearRegression 类,用于创建线性回归模型
from sklearn.linear_model import LinearRegression
# 创建 LinearRegression 类的实例,即创建一个线性回归模型对象
reg_model = LinearRegression()
# 使用训练集的特征矩阵 X_train 和目标变量 y_train 对线性回归模型进行训练
reg_model.fit(X_train, y_train)
# 导入 numpy 库,主要用于科学计算
import numpy as np
# 设置 numpy 的打印选项,suppress=True 表示不使用科学计数法显示数字,便于阅读
np.set_printoptions(suppress=True)
# 打印线性回归模型的回归系数,并将结果四舍五入到小数点后 4 位
print("回归系数:",reg_model.coef_.round(4))
# 打印线性回归模型的回归常数,并将结果四舍五入到小数点后 4 位
print("回归常数:",reg_model.intercept_.round(4))


# 引入 statsmodels 库的 api 模块并将其简称为 sm,用于进行更详细的线性回归模型评估
import statsmodels.api as sm  
# 为训练集的特征矩阵 X_train 添加一个常数列,这是 statsmodels 的 OLS 方法要求的
X2 = sm.add_constant(X_train)
# 使用 statsmodels 的 OLS 方法对添加常数后的特征矩阵 X2 和训练集目标变量 y_train 进行普通最小二乘回归拟合
est = sm.OLS(y_train, X2).fit()
# 打印线性回归的详细统计信息,包括系数的 p 值、置信区间、F 统计量等
est.summary()


# 从 sklearn 的 metrics 模块导入 r2_score 函数,用于计算 R2 得分
from sklearn.metrics import r2_score
# 使用训练好的线性回归模型对训练集的特征矩阵 X_train 进行预测,得到预测值 y_pred
y_pred=reg_model.predict(X_train)
# 使用 r2_score 函数计算训练集的 R2 得分,用于评估模型在训练集上的拟合优度
r2 = r2_score(y_train,y_pred)
# 打印训练集的 R2 得分
r2


# 导入 sklearn 的 metrics 模块并将其简称为 sm,该模块包含多种评估指标
import sklearn.metrics as sm
# 使用训练好的线性回归模型对测试集的特征矩阵 X_test 进行预测,得到预测值 y_pred
y_pred=reg_model.predict(X_test)
# 计算并打印测试集的平均绝对误差(MAE),衡量预测值与真实值之间的平均绝对偏差
print("MAE:",sm.mean_absolute_error(y_test,y_pred))
# 计算并打印测试集的均方误差(MSE),衡量预测值与真实值之间的平均平方偏差
print("MSE:",sm.mean_squared_error(y_test,y_pred))
# 计算并打印测试集的均方根误差(RMSE),是 MSE 的平方根,与目标变量的单位一致
print("RMSE:",sm.mean_squared_error(y_test,y_pred)**0.5)

Tags:

最近发表
标签列表