一元线性回归


目录

1.概览

2代码实现

2.1一元线性回归python代码

2.2sklearn代码

3示例

3.1波士顿房价预测

3.2北京房价预测


1.概览

2代码实现

2.1一元线性回归python代码

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 19 11:12:27 2018
一元线性回归
数据:一组房屋面积和房价变化的示例数据。x 为房屋面积,单位是平方米; y 为房价,单位是万元。
"""
import numpy as np
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74])
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])
"""一元函数式代码实现
"""
def f(x, w0, w1):
    y = w0 + w1 * x
    return y
"""平方损失函数实现
"""
def square_loss(x, y, w0, w1):
    loss = sum(np.square(y - (w0 + w1*x)))
    return loss
"""最小二乘法代数求解平方损失函数最小值
"""
def w_calculator(x, y):
    n = len(x)
    w1 = (n*sum(x*y) - sum(x)*sum(y))/(n*sum(x*x) - sum(x)*sum(x))
    w0 = (sum(x*x)*sum(y) - sum(x)*sum(x*y))/(n*sum(x*x)-sum(x)*sum(x))
    return w0, w1       #(41.33509168550616, 0.7545842753077117)
w0 = w_calculator(x, y)[0]
w1 = w_calculator(x, y)[1]
"""拟合结果画图展示
"""
x_temp = np.linspace(50,120,100) # 绘制直线生成的临时点
plt.scatter(x, y)
plt.plot(x_temp, x_temp*w1 + w0, 'r')

2.2sklearn代码

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 19 11:38:20 2018
scikit-learn 线性回归拟合
"""
import numpy as np
x = np.array([56, 72, 69, 88, 102, 86, 76, 79, 94, 74])
y = np.array([92, 102, 86, 110, 130, 99, 96, 102, 105, 92])
from sklearn.linear_model import LinearRegression
# 定义线性回归模型
model = LinearRegression()
model.fit(x.reshape(len(x),1) , y) # 训练, reshape 操作把数据处理成 fit 能接受的形状
# 得到模型拟合参数
model.intercept_, model.coef_
print(model.predict([[150]]))#[154.52273298]

3示例

3.1波士顿房价预测

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 19 11:44:25 2018

波士顿房价预测
数据集共计 506 条,其中包含有 13 个与房价相关的特征以及 1 个目标值(房价)。
http://labfile.oss.aliyuncs.com/courses/1081/course-5-boston.csv
"""
import pandas as pd
df = pd.read_csv("course-5-boston.csv")
features = df[['crim', 'rm', 'lstat']]
target = df['medv'] # 目标值数据
#分割
split_num = int(len(features)*0.7) # 得到 70% 位置
train_x = features[:split_num] # 训练集特征
train_y = target[:split_num] # 训练集目标
test_x = features[split_num:] # 测试集特征
test_y = target[split_num:] # 测试集目标
#建模
from sklearn.linear_model import LinearRegression
model = LinearRegression() # 建立模型
model.fit(train_x, train_y) # 训练模型
model.coef_, model.intercept_ # 输出训练后的模型参数和截距项
preds = model.predict(test_x) # 输入测试集特征进行预测
preds # 预测结果
"""误差计算
平均绝对误差(MAE)
均方误差(MSE)
"""
def mae_value(y_true, y_pred):
    n = len(y_true)
    mae = sum(np.abs(y_true - y_pred))/n
    return mae
def mse_value(y_true, y_pred):
    n = len(y_true)
    mse = sum(np.square(y_true - y_pred))/n
    return mse
mae = mae_value(test_y.values, preds)
mse = mse_value(test_y.values, preds)
print("MAE: ", mae)
print("MSE: ", mse)

 输出:

MAE:  13.022063072780165
MSE:  303.8331247223573

3.2北京房价预测

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 19 11:54:49 2018
北京市住房价格预测
http://labfile.oss.aliyuncs.com/courses/1081/challenge-1-beijing.csv
"""

"""读取并预览数据集
"""
import pandas as pd
df = pd.read_csv("challenge-1-beijing.csv")
df.head()
"""将原始数据集切片为所需数据集
"""
features = df[['公交','写字楼','医院','商场','地铁','学校','建造时间','楼层','面积']]
target = df['每平米价格']
"""方法二
"""
#features = df[df.columns.drop(['小区名字','房型','每平米价格'])]
#target = df['每平米价格']
"""分割
"""
split_num = int(len(df)*0.7) # 70% 分割数
train_x = features[:split_num]
train_y = target[:split_num]
test_x = features[split_num:]
test_y = target[split_num:]
#建模
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(train_x, train_y)
"""平均绝对百分比误差  MAPE
"""
import numpy as np
def mape(y_true, y_pred):
    """
    参数:
    y_true -- 测试集目标真实值
    y_pred -- 测试集目标预测值
    返回:
    mape -- MAPE 评价指标
    """
    n = len(y_true)
    mape = 100 * np.sum(np.abs((y_true-y_pred)/y_true)) / n    
    return mape
y_true = test_y.values
y_pred = model.predict(test_x)
print(mape(y_true, y_pred))
"""
  MAPEMAPE  值较大,意味着预测的偏移量较大。在线性回归实验中,

  我们提到预测结果较差的一个原因可能是数据没有经过预处理。除此之外,线性回归本身就是一种非常基础简单的预测方法。
  对于房价这种包含多个特征的预测问题,我们往往要使用更复杂的方法来进行回归预测才能得到更好的结果。
"""

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值