学习笔记 | 机器学习 | 线性回归应用-房价预测模型

借助pandas库使用外部导入的数据进行线性拟合

〇、pandas库使用

1.数据读取

import pandas as pd

df=pd.read_csv('your_path')
#由于read_csv是针对于全局的操作,所以要使用pd.来调用

2.选择特征与结果进行向量化

pd的value方法
注意选取列的方法,多个列选取需要使用列表再括一层

import pandas as pd
import numpy as np;

X=df[["feature1","feature2","feature3"]].values
y=df[["price"]].values
# 转换多列的时候df方括号要使用列表
#转换单个列为标量的时候也这样,否则还要reshape

#尽量维度验证
print(X.shape)
print(y.shape)

易错

(m,) 是一维向量:表示 m 个标量的有序序列(数学中的向量本质)。
(m,1) 是二维列矩阵:表示 m 行 1 列的矩阵(数学中的列向量需显式定义为矩阵)。

  1. 一维向量 (m,)
    维度数量:1 维(仅有一个轴 axis=0)。
    数学意义:
    表示 标量序列(如 [y₁, y₂, ..., yₘ]),等价于数学中的向量。
    例如:y = [320, 480, 350] 是 3 个标量的集合,而非矩阵。
  2. 二维列矩阵 (m,1)
    维度数量:2 维(轴 axis=0 为行,axis=1 为列)。
    数学意义:
    表示 m×1 的矩阵(如 [[y₁], [y₂], ..., [yₘ]]),本质是二维张量。
    例如:y = [[320], [480], [350]] 是 3 行 1 列的矩阵。

所以对于y的转换要使用df[["price"]].value而非df["price"].values,否则还要df["price"].values.reshape(-1,1)使得单列series转换为单列dataframe类型

一、房价预测中出现的细节问题

标准化:不同的指标由于单位问题相差巨大,需要使用标准化工具使得标准统一

由于不同的指标之间可能差异巨大,从而要让他不震荡所需的学习率非常小,并且让模型以为较大的量纲所对应的指标比较重要,所以采用正态分布标准化思想 (每个指标值-平均值)/该指标数量,使得所有指标量纲统一

使用函数 StandardScaler
from sklearn.preprocessing import StandardScaler
X_scaler = StandardScaler()
y_scaler = StandardScaler()  # 单独为y创建标准化器

X_scaled = X_scaler.fit_transform(X)  # (m,5)
y_scaled = y_scaler.fit_transform(y)   # (m,1) ← 转换为均值为0、标准差为1的无量纲值

m, n = X_scaled.shape  # 动态获取样本数
### 二、完整的房价预测代码
```python
#线性回归模型 损失函数使用平方均值 优化算法采用梯度下降
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
df=pd.read_csv("file.csv")



X=df[["TotalSqFt","Bedrooms","Bathrooms","YearBuilt","LotArea"]].values
y=df[["Price"]].values

print(X.shape)
print(y.shape)
X_scaler = StandardScaler()
y_scaler = StandardScaler()  # 单独为y创建标准化器

X_scaled = X_scaler.fit_transform(X)  # (m,5)
y_scaled = y_scaler.fit_transform(y)   # (m,1) ← 转换为均值为0、标准差为1的无量纲值

m, n = X_scaled.shape  # 动态获取样本数
m,n=X_scaled.shape
#设置线性参数 w,b
w=np.zeros((n,1))
b=0.0

#设置学习率、循环次数
lr=0.01
epochs=5000

#计算误差
for i in range(epochs):
    y_pred=X_scaled@w+b

    loss=np.mean((y_pred-y_scaled)**2)
#计算梯度
    w_grad=1/m*X_scaled.T@(y_pred-y_scaled)
    b_grad=1/m*np.sum(y_pred-y_scaled)
#更新
    w=w-lr*w_grad
    b=b-lr*b_grad

    if i % 50 == 0:
        print(f"Epoch {i}, Loss: {loss:.4f}")

print(f"Final w: {w.ravel()}, b: {b}")   # .ravel() 展平打印
    
posted @ 2026-07-04 16:48  Ihsinchao  阅读(3)  评论(0)    收藏  举报