Boston波士顿房价预测 +两种回归算法建模和分析

 初步分析数据(使用 pandas 进行初步分析)。

代码中用到的函数解释:
  • .corr():这是pandas DataFrame对象的一个方法,用于计算DataFrame中每对列之间的相关系数。默认情况下,.corr()方法计算的是皮尔逊相关系数(Pearson correlation coefficient),这是一个衡量两个变量之间线性相关程度的指标,其值范围从-1到1。其中,1表示完全正相关,-1表示完全负相关,0表示没有线性相关。

  • .sort_values(ascending=False)这部分代码对前面选出的'CRIM'列中的值进行排序。sort_values是pandas Series对象的一个方法,用于根据值对Series进行排序。参数ascending=False指定了排序的顺序为降序,即最大的值会排在最前面。

  • y之所以是MEDV,是因为boston.target专门用于存储与每个数据点(房屋)相对应的中位数房价。这是回归问题的典型设置,其中模型的目标是学习输入特征(如犯罪率、房间数等)与输出目标(房价)之间的关系。

# 加载波士顿房价数据集  
boston = fetch_openml(name="boston", version=1, as_frame=True)  
# Data相当于自变量 target相当于因变量
X, y = boston.data, boston.target  
  
# 初步分析数据  
print("数据基本信息:")  
print(X.info())  
print("\n数值型特征的统计信息:")  
print(X.describe())  

# 假设我们要查看城镇犯罪率(CRIM)和房价(MEDV)之间的相关性  
#使用pandas库对名为X的DataFrame(或Series,但更常见于DataFrame)进行操作。这行代码的目的是计算X中所有列之间的相关系数,并将这些相关系数以矩阵的形式存储在新的变量correlation_matrix中。
correlation_matrix = X.corr()  
print("\n城镇犯罪率(CRIM)与房价(MEDV)的相关性:")  
print(correlation_matrix['CRIM'].sort_values(ascending=False))  
  
# 可视化城镇犯罪率与房价的关系  
plt.scatter(X['CRIM'], y, alpha=0.5)  
plt.xlabel('Town Crime Rate (CRIM)')  
plt.ylabel('Median Value of Owner-Occupied Homes (MEDV)')  
plt.title('CRIM vs. MEDV')  
plt.show()  
结果: 

 

  • count:数量统计,此列共有多少有效值
  •    unipue:不同的值有多少个
  •    std:标准差
  •    min:最小值
  •    25%:四分之一分位数
  •    50%:二分之一分位数
  •    75%:四分之三分位数
  •    max:最大值
  •    mean:均值

划分训练集和验证集:

train_test_split 函数在 scikit-learn 库中定义时,其返回值的顺序是固定的,不受外部调用的影响。具体来说,当你调用 train_test_split(X, y, test_size=0.3, random_state=42) 时,它会返回四个值(尽管你通常只接收前两个或前四个的某些组合),这些值的顺序是:

  1. X_train:训练集的特征数据
  2. y_train:训练集的目标(或标签)数据
  3. X_test:测试集的特征数据(如果你通过 train_test_split 的参数直接指定了返回四个值,或者你在后续通过某种方式获取了这个值)
  4. y_test:测试集的目标(或标签)数据(同样,这取决于你是否接收了这个值)

在Python中,函数返回值的分配是基于它们在函数内部返回的顺序。所以在书写变量的名称时最好按照函数内部返回顺序 不然很容易弄混每个变量的含义。

# 划分训练集和验证集  
# =============================================================================
# random_state 参数:设置了 random_state=42
# 这个参数确保了每次分割时,相同的输入总会产生相同的输出,这对于可重复性和调试是非常有用的。
# =============================================================================

# X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.3, random_state=42)

# 第一次分割:将数据集分割为训练集和剩余部分(测试+验证)  
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.3, random_state=42)  
  
# 第二次分割:将剩余部分分割为验证集和测试集  
# 注意:这里我们再次使用0.5作为test_size,但这次它是相对于剩余部分的比例  
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)  
    
  
print(f"\nTraining set size: {X_train.shape}")  
print(f"Validation set size: {X_val.shape}")  

 

 关于 train_test_split ,它不直接返回验证集(X_val, y_val)。要得到验证集,需要手动进行第二次分割,或者在初次分割时就将数据集分割为训练集、验证集和测试集(这通常通过更复杂的方法或自定义函数来实现,因为 train_test_split 只支持两部分的分割)。

对特征进行标准化:

# 对特征进行标准化  
scaler = StandardScaler()  
#fit:scaler.fit(X_train)部分首先计算X_train(训练数据)中每个特征的均值和标准差。这些统计量(均值和标准差)将用于后续的缩放操作。
#transform:紧接着,scaler使用上一步计算得到的均值和标准差来缩放X_train中的每个特征,使得每个特征的均值为0,标准差为1。
#缩放后的数据被赋值给X_train_scaled。
X_train_scaled = scaler.fit_transform(X_train)  
#使用scaler(已经通过X_train数据拟合过)来转换(或缩放)验证集X_val。
#由于scaler已经知道了X_train的均值和标准差(在之前的fit_transform步骤中计算得到),它可以直接使用这些统计量来缩放X_val,而无需重新计算。
X_val_scaled = scaler.transform(X_val)  

使用相同的scaler实例来转换X_val,以确保X_val的缩放方式与X_train保持一致。这是机器学习中的一个重要步骤,因为模型在训练时学习的是缩放后的特征,所以在评估模型性能时(例如,在验证集或测试集上),也需要使用相同的缩放方式。

两种训练模型:

评价模型的两个参数:
1.均方误差(MSE)

均方误差是衡量模型预测值与真实值之间差异的一种方法。它计算了预测误差的平方的平均值。MSE 的值越小,表示模型的预测性能越好。

2.决定系数(R² score)

决定系数(也称为 R-squared)是另一种评估回归模型性能的指标。它表示模型预测的改善相对于仅使用平均值的改善。R² 的值范围从负无穷大到 1。R² 值为 1 表示模型完美地预测了数据,而 R² 值为 0 表示模型仅预测了目标变量的平均值,没有比随机猜测更好。负值表示模型性能比简单地预测平均值还要差。

MSE 提供了预测误差的量化度量,而 R² 则提供了模型相对于基准(即仅使用平均值进行预测)的改进程度的度量。

1.线性回归模型

这行代码的作用是让模型学习如何从 X_train_scaled 中的特征预测 y_train 中的目标值。在训练过程中,模型会调整其内部参数(也称为权重或系数),以最小化预测值与实际值之间的差异(这通常通过某种形式的损失函数来衡量)。

# 训练和评估回归模型  
# 初始化线性回归模型  
model = LinearRegression()  
  
# 使用训练集数据训练模型  
model.fit(X_train_scaled, y_train)  

这行代码的作用是让模型学习如何从 X_train_scaled 中的特征预测 y_train 中的目标值。在训练过程中,模型会调整其内部参数(也称为权重或系数),以最小化预测值与实际值之间的差异(这通常通过某种形式的损失函数来衡量)。

  • X_train_scaled:这是经过标准化处理的训练数据特征集。标准化是预处理步骤之一,它可以帮助改善许多机器学习算法的性能,特别是那些基于梯度的算法,如神经网络。通过使每个特征的均值为0,标准差为1,标准化可以确保所有特征在训练过程中都被平等地考虑。

  • y_train:这是与 X_train_scaled 对应的训练标签集,包含了每个训练样本的目标值。在监督学习中,模型的目标是学习从输入特征到输出标签的映射。

# 使用验证集数据评估模型  
y_val_pred = model.predict(X_val_scaled)

model.predict(X_val_scaled) 方法调用会利用训练好的模型对 X_val_scaled 中的数据进行预测,并返回预测结果 y_val_pred。这些预测结果通常是一个数组或列表,包含了模型对每个验证集样本的预测值。

可视化结果:
# 计算并打印性能指标  
mse = mean_squared_error(y_val, y_val_pred)  
r2 = r2_score(y_val, y_val_pred)  
print(f"验证集的均方误差(MSE): {mse}")  
print(f"验证集的R^2分数: {r2}")  
  
# 可视化实际值与预测值  
plt.scatter(y_val, y_val_pred, alpha=0.5)  
plt.xlabel('Actual Prices')  
plt.ylabel('Predicted Prices')  
plt.title('Actual vs. Predicted Prices')  
plt.axvline(x=0, color='gray', lw=1)  
plt.axhline(y=0, color='gray', lw=1)  
plt.plot([y_val.min(), y_val.max()], [y_val.min(), y_val.max()], 'k--', lw=4)  
plt.show()  

2.随机森林
# 随机森林回归建模  
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)  
rf_model.fit(X_train_scaled, y_train)  
y_val_pred_rf = rf_model.predict(X_val_scaled)  
  
# 计算随机森林回归的MSE和R^2  
mse_rf = mean_squared_error(y_val, y_val_pred_rf)  
r2_rf = r2_score(y_val, y_val_pred_rf)  
print(f"随机森林回归的MSE: {mse_rf}")  
print(f"随机森林回归的R^2: {r2_rf}")  

plt.scatter(y_val, y_val_pred_rf, alpha=0.5)  
plt.xlabel('Actual Prices')  
plt.ylabel('Predicted Prices')  
plt.title('Actual vs. Predicted Prices')  
plt.axvline(x=0, color='gray', lw=1)  
plt.axhline(y=0, color='gray', lw=1)  
plt.plot([y_val.min(), y_val.max()], [y_val.min(), y_val.max()], 'k--', lw=4)  
plt.show() 

对于绘制图表的一行代码:

plt.plot([y_val.min(), y_val.max()], [y_val.min(), y_val.max()], 'k--', lw=4)  

  • [y_val.min(), y_val.max()] 生成一个包含 y_val(验证集真实值)最小值和最大值的列表,这个列表被用作 x 轴和 y 轴的坐标。
  • 'k--' 指定了线段的样式:'k' 表示黑色(k 是黑色的缩写),'--' 表示线段是虚线。
  • lw=4 设置了线段的线宽为 4。

当这条对角线被绘制在包含模型预测结果(如通过 plt.scatter(X_val_scaled[:, some_feature_index], y_val_pred) 绘制的散点图)的图表上时,它可以帮助评估模型的预测是否偏离了实际值的范围。如果模型的预测点紧密地围绕在对角线周围,那么这通常是一个好迹象,表明模型的预测与实际值非常接近。如果预测点偏离对角线很远,那么可能需要检查模型或数据以了解为什么会发生这种情况。

可视化结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pranaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值