【使用线性回归、岭回归以及Lasso回归预测客户价值,LinearRegression,Ridge】

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。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多元线性回归是一种用于预测房屋价格的常用方法。它基于多个自变量与因变量之间的线性关系建立回归模型。在Python中,可以使用sklearn库的LinearRegression类来实现多元线性回归岭回归是对多元线性回归的一种正则化方法。它通过引入一个正则化项,可以在模型训练过程中对自变量的系数进行约束,从而避免过拟合的问题。在Python中,可以使用sklearn库的Ridge类来实现岭回归Lasso回归也是对多元线性回归的一种正则化方法,与岭回归类似,但它使用的是L1正则化。Lasso回归不仅可以约束自变量的系数,还可以用于特征选择,将不重要的特征的系数推向零。在Python中,可以使用sklearn库的Lasso类来实现Lasso回归使用这些方法进行房屋价格预测的步骤大致相同。首先,将房屋的特征作为自变量,房屋价格作为因变量,构建多元回归模型。然后,根据数据集中的房屋特征和对应的价格,利用模型进行训练。最后,可以使用训练好的模型对新的房屋特征进行预测,得到对应的价格。 需要注意的是,为了得到准确的预测结果,应该对数据进行适当的预处理,例如特征缩放、数据清洗和特征选择等。此外,还应该通过交叉验证等方法,选择适当的模型超参数,以避免过拟合或欠拟合的问题。 总的来说,多元回归岭回归lasso回归都是常用的预测房屋价格的方法,使用Python中的相应库可以方便地实现这些方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值