学习笔记 | 机器学习 | 线性回归应用-房价预测模型
借助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 列的矩阵(数学中的列向量需显式定义为矩阵)。
- 一维向量 (m,)
维度数量:1 维(仅有一个轴 axis=0)。
数学意义:
表示 标量序列(如 [y₁, y₂, ..., yₘ]),等价于数学中的向量。
例如:y = [320, 480, 350] 是 3 个标量的集合,而非矩阵。 - 二维列矩阵 (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() 展平打印

浙公网安备 33010602011771号