线性回归房价预测

 房价预测1

# ------------------------------------- 数据读取 以及 处预理 -------------------------------------
start_year = 2000
end_year = 2022
years = [i for i in range(start_year,end_year+1)]
prices = [7000,7100,7400,8000,10000,12000,14000,12000,13000,16000,20000,25000,32000,32000,33000,37000,40000,50000,55000,60000,64000,70000,73000]
assert len(years) == len(prices)
print(len(prices))

# ------------------------------------- 超参数初始化 -------------------------------------
lr = 0.00001
epoch = 10

# ------------------------------------- 模型参数 初始化 -------------------------------------
k = 1
b = -1

# -------------------------------------模型定义 -------------------------------------
# y = kx + b

# ------------------------------------- 训练 -------------------------------------
for e in range(epoch):
    for i in range(end_year-start_year+1):

        # ------------------------------------- batch 数据处理 以及获取 -------------------------------------
        year = years[i]
        price = prices[i]

        # ------------------------------------- 模型 forward -------------------------------------
        pre = k * year + b

        # ------------------------------------- 求解loss -------------------------------------
        loss = (pre - price) ** 2

        # ------------------------------------- 求解更新梯度 (backward) --------------------------
        delta_k = 2 * (pre - price) * year
        delta_b = 2 * (pre- price)

        # ------------------------------------- 更新 模型参数 -------------------------------------
        k = k - lr * delta_k
        b = b - lr * delta_b

        # ------------------------------------- 验证集 -------------------------------------


        # ------------------------------------- 输出指标(验证集) -------------------------------------
        print(f"loss:{loss:.2f}")
这段代码是Python语言中的字符串格式化语句,用于输出格式化后的字符串。具体来说,它使用了f-string(格式化字符串字面量)功能,允许在字符串中嵌入表达式。

    print 是Python中的打印函数,用于将括号中的内容输出到控制台。
    f"..." 表示这是一个f-string,其中的大括号{}用于插入变量或表达式。
    loss 是一个变量,它应该在代码的其他部分被定义。
    :.2f 是格式化指令,表示将loss变量的值格式化为浮点数,保留两位小数。

所以,这行代码的作用是将loss变量的值以两位小数的格式打印出来,例如如果loss的值是3.1415926,打印结果将会是loss:3.14

# ------------------------------------- 输出测试集指标 (批量测试,检测模型性能) -------------------------------------

# ------------------------------------- 模型部署,开放预测接口 (流式,单条,给用户使用) -------------------------------------

房价预测2

房价预测1预测不太准,房价和年份不在一个维度上,一个能达到7万一个才两千,如果关注的是楼层的话,差距就更大。所以我们把年份给归一化,我们归一化有两个目的,第一个就是缩小数据之间的差距,第二个就是让其满足某种分布归一化有两种典型的归一化:z-score  and  linear

import numpy as np
# ------------------------------------- 数据读取 以及 预处理 -------------------------------------
start_year = 2000
end_year = 2022
years = np.array([i for i in range(start_year,end_year+1)])
years = (years-1980) / (2022-1980)


prices = np.array([7000,7100,0,8000,10000,12000,14000,12000,13000,16000,20000,25000,32000,32000,33000,37000,40000,50000,55000,60000,64000,70000,73000])
min_pri = np.min(prices)
max_pri = np.max(prices)
prices = (prices-min_pri) / (max_pri-min_pri)
这里就是在做归一化操作。

assert len(years) == len(prices)
print(len(prices))

# ------------------------------------- 超参数初始化 -------------------------------------
lr = 0.5
epoch = 10

# ------------------------------------- 模型参数 初始化 -------------------------------------
k = 1
b = -1

# -------------------------------------模型定义 -------------------------------------
# y = kx + b

# ------------------------------------- 训练 -------------------------------------
for e in range(epoch):
    for i in range(end_year-start_year+1):

        # ------------------------------------- batch 数据处理 以及获取 -------------------------------------
        year = years[i]
        price = prices[i]

        # ------------------------------------- 模型 forward -------------------------------------
        pre = k * year + b

        # ------------------------------------- 求解loss -------------------------------------
        loss = (pre - price) ** 2
loss其实也可以不写的,他是个标量,我们最重要的是关注于delta——k的更新的,loss只是为了让我们知道模型还在学习。

        # ------------------------------------- 求解更新梯度 (backward) --------------------------
        delta_k =  (pre - price) * year
        delta_b =  (pre- price)
其实在这里看着就可以看到,这里的常数项可以不加的,他的影响会映射到学习率上的

        # ------------------------------------- 更新 模型参数 -------------------------------------
        k = k - lr * delta_k
        b = b - lr * delta_b

        # ------------------------------------- 验证集 -------------------------------------


        # ------------------------------------- 输出指标(验证集) -------------------------------------
        print(f"loss:{loss:.2f}")
print(k,b)
# ------------------------------------- 输出测试集指标 (批量测试,检测模型性能) -------------------------------------
while True:
    org_input_year = int(input("请输入待预测的年份:"))
    input_year = (org_input_year-1980) / (2022-1980)
    pre = input_year * k + b
    print(f"{org_input_year}年房价为:{pre*(max_pri-min_pri) + min_pri:.2f}")
这里要做反归一化。
# ------------------------------------- 模型部署,开放预测接口 (流式,单条,给用户使用) -------------------------------------

 房价预测3

在房价预测3中我们批量运算,直接对一个矩阵进行操作。

这样的操作,还是看数据,我们数据中如果有脏数据的话,我们一个一个的拿数据可能会影响模型的学习,但是后面我们数据量大起来的时候,一下给他扔进去又不现实,所以后面我们会一个batch一个batch的取数据,处理数据,学习数据。

上面的方法叫做随机小批量梯度下降,这种效果好的原因,他不会被脏数据影响,还能考虑到个性的存在。

eg:班长带我们吃饭,是直接同意吃还是各自发言吃,那就一批一批的吃,每个团队都有自己的方向。

import numpy as np
# ------------------------------------- 数据读取 以及 预处理 -------------------------------------
start_year = 2000
end_year = 2022
years = np.array([i for i in range(start_year,end_year+1)])
years = (years-1980) / (2022-1980)


prices = np.array([7000,7100,7400,8000,10000,12000,14000,12000,13000,16000,20000,25000,32000,32000,33000,37000,40000,50000,55000,60000,64000,70000,73000])
min_pri = np.min(prices)
max_pri = np.max(prices)
prices = (prices-min_pri) / (max_pri-min_pri)

assert len(years) == len(prices)
print(len(prices))

# ------------------------------------- 超参数初始化 -------------------------------------
lr = 0.5
epoch = 100

# ------------------------------------- 模型参数 初始化 -------------------------------------
k = 1
b = -1

# -------------------------------------模型定义 -------------------------------------
# y = kx + b

# ------------------------------------- 训练 -------------------------------------
for e in range(epoch):
    pre = k * years + b
    loss = np.mean((pre-prices)**2)

    delta_k = np.mean((pre-prices)*years)
    delta_b = np.mean((pre-prices))

    k = k - delta_k*lr
    b -= delta_b*lr
    print(f"loss:{loss:.3f}")


# ------------------------------------- 输出测试集指标 (批量测试,检测模型性能) -------------------------------------
while True:
    org_input_year = int(input("请输入待预测的年份:"))
    input_year = (org_input_year-1980) / (2022-1980)
    pre = input_year * k + b
    print(f"{org_input_year}年房价为:{pre*(max_pri-min_pri) + min_pri:.2f}")
# ------------------------------------- 模型部署,开放预测接口 (流式,单条,给用户使用) -------------------------------------


房价预测4

import matplotlib
import matplotlib.pyplot as plt
import numpy as np

# matplotlib.
print(matplotlib.get_backend())
# ------------------------------------- 数据读取 以及 预处理 -------------------------------------
start_year = 2000
end_year = 2022
years = np.array([i for i in range(start_year,end_year+1)])
years = (years-1980) / (2022-1980)


prices = np.array([7000,7100,73000,8000,10000,12000,14000,12000,13000,16000,20000,25000,32000,32000,33000,37000,40000,50000,55000,60000,64000,70000,73000])
min_pri = np.min(prices)
max_pri = np.max(prices)
prices = (prices-min_pri) / (max_pri-min_pri)

assert len(years) == len(prices)
print(len(prices))

# ------------------------------------- 超参数初始化 -------------------------------------
lr = 0.5
epoch = 100

# ------------------------------------- 模型参数 初始化 -------------------------------------
k = 1
b = -4
batch_size = 1
batch_num = int(np.ceil(len(years) / batch_size))
ceil是向上取整,但是取出来的数字是浮点型,我们要转化一下。
for e in range(epoch):
    for bt in range(batch_num):
        batch_year = years[bt*batch_size:(bt+1)*batch_size]
        batch_pri = prices[bt*batch_size:(bt+1)*batch_size]

        pre = k * batch_year + b
        loss = np.mean((pre-batch_pri)**2)

        delta_k = np.mean((pre-batch_pri)*batch_year)
        delta_b = np.mean((pre-batch_pri))

        k = k - delta_k*lr
        b -= delta_b*lr
        print(f"loss:{loss:.3f}")
    if e % 10 == 0:
        plt.plot(years,prices,"r.")画点
        plt.plot([0,1],[b,k+b],'g-')画线,x=0的时候,y=b x=1的时候,y=k+b
        plt.xlim(0.4, 1)
        plt.ylim(0, 1)
        plt.pause(0.01)

print(k,b)
# ------------------------------------- 输出测试集指标 (批量测试,检测模型性能) -------------------------------------
while True:
    org_input_year = int(input("请输入待预测的年份:"))
    input_year = (org_input_year-1980) / (2022-1980)
    pre = input_year * k + b
    print(f"{org_input_year}年房价为:{pre*(max_pri-min_pri) + min_pri:.2f}")
# ------------------------------------- 模型部署,开放预测接口 (流式,单条,给用户使用) -------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值