使用线性回归和岭回归预测客户价值
1. 线性回归预测客户价值
customers.csv已提供在文章开头,或者访问下面的路径进行下载:https://github.com/SGY321/CUEB_Code/blob/9b091bf896af0b2da72b845099505fe4e5f72093/machine_learning/customers.csv
# 导入所需的库,包括线性回归和数据集划分的函数
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import pandas as pd
# 从CSV文件中加载数据集,并提取特征变量('历史贷款金额'、'贷款次数'、'学历'、'月收入'、'性别')和目标变量('客户价值')
df = pd.read_csv('customers.csv',encoding='gb2312')
X = df[['历史贷款金额', '贷款次数', '学历', '月收入', '性别']]
y = df['客户价值']
pd.DataFrame(df) # 将df转换为DataFrame形式,以便快速查看数据
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.2,random_state=200) # 将数据集划分为训练集和测试集
for i in [Xtrain, Xtest]: # 重置训练集和测试集的索引
i.index = range(i.shape[0])
lr = LinearRegression() # 创建线性回归模型
lr.fit(Xtrain, Ytrain) # 训练模型
yhat = lr.predict(Xtest) # 预测测试集的目标变量
print(yhat)
1.1 查看线性回归模型运行后的截距和系数值,并使用print()输出回归方程
# 获取截距和系数值
intercept = lr.intercept_
coefficients = lr.coef_
# 查看截距和系数值
print('截距:',intercept,'\n系数值:',coefficients)
# 创建回归方程字符串
equation = "回归方程:y = " + str(intercept)
for i, coef in enumerate(coefficients):
equation += " + " + str(coef) + " * x" + str(i+1)
# 输出回归方程
print(equation)
1.2 根据评价指标对线性回归模型进行评价,并对模型可视化
# 导入必要的库
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score
1.2.1 模型可视化
import matplotlib.pyplot as plt
sorted(Ytest) # 调用了sorted()函数来返回一个排序后的Ytest列表的副本
print('排序后的Ytest列表的副本:\n',sorted(Ytest))
plt.plot(range(len(Ytest)), sorted(Ytest), c='black', label='Data')
plt.plot(range(len(yhat)), sorted(yhat), c='red', label='Predict')
plt.legend()
plt.show()
1.2.2 结合各评价指标对线性回归模型进行评价
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 计算均方误差MSE,均方误差衡量了预测值与真实值之间的平均差异的平方。数值越小表示模型的预测能力越好。
mse = mean_squared_error(Ytest, yhat)
print('Mean Squared Error:', mse)
# 计算均方根误差RMSE,均方根误差是均方误差的平方根,它表示预测值与真实值之间的平均差异。与均方误差类似,数值越小表示模型的预测能力越好。
rmse = np.sqrt(mse)
print('Root Mean Squared Error:', rmse)
# 计算MAE,绝对均值误差/平均绝对误差(MAE)越小表示模型越好
mae = mean_absolute_error(Ytest, yhat)
print('Mean Absolute Error:', mae)
# 计算R Squared, 它的取值范围在0到1之间,数值越接近1表示模型的拟合效果越好。
'''
在R^2中,分子是真实值和预测值的差值,也就是模型没有捕获到的信息总量,
分母是真实标签所带的信息量,其衡量的是1 - 模型没有捕获到的信息量占真实标签中所带的信息量的比例,故R2越接近1越好
'''
r2 = r2_score(Ytest, yhat)
print('R Squared:', r2)
根据给出的评估指标,我们可以看出模型的预测能力有待改进。
均方误差、均方根误差和平均绝对误差的数值较大,说明模型的预测与真实值之间存在较大的差异。
而R平方的数值为0.426,表示模型只能解释观测值变异的42.6%。
因此,我们可能需要进一步优化模型或考虑使用其他的评估指标来评估模型的性能。
2. 岭回归预测客户价值
from sklearn.linear_model import Ridge # 导入岭回归模型
ridge = Ridge(alpha=1).fit(Xtrain,Ytrain) # 创建岭回归模型并训练
ridge.score(Xtest,Ytest) # 计算岭回归模型在测试集上的得分
from sklearn.model_selection import cross_val_score # 导入交叉验证函数
import matplotlib.pyplot as plt # 导入可视化库
import numpy as np # 导入数值计算库
alpharange = np.arange(1,10,0.5) # 设置岭回归模型的超参数范围
ridge = [] # "ridge" 是一个变量名,它被赋值为一个空列表,被用来存储不同 alpha 值下的岭回归模型的得分
for alpha in alpharange:
rid = Ridge(alpha=alpha) # "Ridge" 是一个岭回归模型的类,通过调用该类的构造函数可以创建一个岭回归模型的实例。使用了一个变量名 "rid" 来存储这个实例。
rids = cross_val_score(rid,X,y,cv=5,scoring = "r2").mean() # 计算岭回归模型在cv=5交叉验证下的R^2得分
ridge.append(rids) # "ridge" 是一个列表,它最初是一个空列表。在循环中,我们计算了不同 alpha 值下的岭回归模型的得分,并将这些得分添加到 "ridge" 列表中。
plt.plot(alpharange,ridge,color="red",label="Ridge") # 绘制岭回归模型的R^2得分随alpha值的变化曲线
print("ridge中最大值的索引为:", ridge.index(max(ridge)))
print("最合适的alpha的值为:",alpharange[ridge.index(max(ridge))])
岭回归的结果先随着alpha的值增加而增加,到达顶峰后逐渐下降,我认为最合适的alpha值为2.5
3. Lasso回归建模
from sklearn.linear_model import Lasso
# 创建Lasso回归模型
lasso = Lasso(alpha=1)
# 在训练集上拟合模型
lasso.fit(Xtrain, Ytrain)
lasso.score(Xtest,Ytest) # 计算Lasso回归模型在测试集上的得分
alpharange = np.arange(1,10,0.5) # 设置Lasso回归模型的超参数范围
lasso = [] # "lasso" 是一个变量名,它被赋值为一个空列表,被用来存储不同 alpha 值下的Lasso回归模型的得分
for alpha in alpharange:
la = Lasso(alpha=alpha) # "Lasso" 是一个Lasso回归模型的类,通过调用该类的构造函数可以创建一个Lasso回归模型的实例。使用了一个变量名 "la" 来存储这个实例。
las = cross_val_score(la,X,y,cv=5,scoring = "r2").mean() # 计算Lasso回归模型在cv=5交叉验证下的R^2得分
lasso.append(las) # "lasso" 是一个列表,它最初是一个空列表。在循环中,我们计算了不同 alpha 值下的Lasso回归模型的得分,并将这些得分添加到 "lasso" 列表中。
plt.plot(alpharange,lasso,color="red",label="Lasso") # 绘制Lasso回归模型的R^2得分随alpha值的变化曲线
print("lasso中最大值的索引为:", lasso.index(max(lasso)))
print("最合适的alpha的值为:",alpharange[lasso.index(max(lasso))])
Lasso回归的结果先随着alpha的值增加而增加,到达顶峰后逐渐下降,我认为最合适的alpha值为3.5
4. 交叉验证下线性回归、岭回归与Lasso回归结果如何随alpha变化的学习曲线
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
# 定义不同的alpha值
alpharange = np.arange(1,10,0.5)
# 存储模型的得分
linear_scores = []
# 交叉验证计算得分
for alpha in alpharange:
lr.alpha = alpha
cv_scores = cross_val_score(lr, X, y, cv=5,scoring = "r2")
linear_scores.append(np.mean(cv_scores))
# 绘制学习曲线
plt.plot(alphas, linear_scores, label='Linear Regression')
plt.plot(alphas, ridge, label='Ridge Regression')
plt.plot(alphas, lasso, label='Lasso Regression')
plt.xscale('log')
plt.xlabel('Alpha')
plt.ylabel('Score')
plt.title('Learning Curve of Linear, Ridge, and Lasso Regression')
plt.legend()
plt.show()
4.1 在线性回归中,随着alpha值的变化,学习曲线通常会呈现一条水平线。这是因为线性回归模型是基于最小二乘法来拟合数据的,而最小二乘法不涉及正则化项,也就是不对模型的系数进行惩罚。因此,alpha值的变化不会对模型的系数产生影响,进而不会对模型的性能产生影响。
4.2 相比之下,岭回归和Lasso回归在模型训练过程中引入了正则化项,用于惩罚模型的系数。正则化项的大小由alpha值控制。当alpha值较小时,正则化项的影响较小,模型更倾向于拟合训练数据,可能会导致过拟合。当alpha值较大时,正则化项的影响较大,模型更倾向于收缩系数,可能会导致欠拟合。
4.3 此数据集中,Lasso模型在一定范围内的值比线性回归、岭回归的交叉验证计算得分都要大,表现更好,且Lasso回归的结果先随着alpha的值增加而增加,到达顶峰后逐渐下降,我认为最合适的alpha值为3.5
5.RidgeCV和LassoCV选取最佳正则化参数
from sklearn.linear_model import RidgeCV, LassoCV
# RidgeCV
alphas = np.arange(1,10,0.5) # 设置正则化参数的候选值
ridge_cv = RidgeCV(alphas=alphas, store_cv_values=True) # store_cv_values=True用于保存交叉验证的结果
ridge_cv.fit(Xtrain, Ytrain)
# 输出最佳正则化参数
print("Ridge 最佳正则化参数 alpha:", ridge_cv.alpha_) # 模型的属性alpha_为调用交叉验证选出来的最佳正则化参数
# LassoCV
lasso_cv = LassoCV(alphas=alphas, cv=5) # cv是交叉验证的折数
lasso_cv.fit(Xtrain, Ytrain)
# 输出最佳正则化参数
print("Lasso 最佳正则化参数 alpha:", lasso_cv.alpha_)
5.1 RidgeCV和LassoCV给出的最佳正则化参数不同,这可能是由于它们分别使用不同的正则化方法和优化算法,以及对应的目标函数。Ridge回归使用L2正则化,而Lasso回归使用L1正则化。这两种正则化方法会导致不同的稀疏性和模型复杂性。
5.2 特征选择的影响: Lasso回归倾向于将某些特征的系数推到零,从而实现特征选择。如果你的问题中有很多不相关的特征,Lasso可能会选择性地将其中一些特征的系数设为零,从而得到一个稀疏的模型。而Ridge回归则更倾向于将系数缩小但不为零。 问题的性质: 如果问题中的真实模型更接近于稀疏性模型,Lasso回归可能会更受欢迎。相反,如果问题更适合使用平滑的系数,Ridge回归可能更为合适。 正则化强度的设置: RidgeCV和LassoCV可能在内部使用不同的正则化强度的范围,这会影响最终选择的最佳参数。
5.3 RidgeCV和LassoCV选取最佳正则化参数所得的结果与上述学习曲线的所得得最佳alpha所对应的值大2 上述岭回归和Lasso回归最合适的alpha值分别为2.5、3.5,RidgeCV和LassoCV选取最佳正则化参数为4.5、5.5。