导入库
import numpy as np
import pandas as pd

波士顿房价数据集字段说明

  • crim 房屋所在镇的犯罪率
  • zn 面积大于25000平凡英尺住宅所占比例
  • indus 房屋所在镇非零售区域所占比例
  • chas 房屋是否位于河边 如果在河边,值1
  • nox 一氧化氮的浓度
  • rm 平均房间数量
  • age 1940年前建成房屋所在比例
  • dis 房屋距离波士顿五大就业中心的加权距离
  • rad 距离房屋最近的公路
  • tax 财产税收额度
  • ptratio 房屋所在镇师生比例
  • black 计算公式:1000*(房屋所在镇非美籍人口所在比例 - 0.63)**2
  • lsta 弱势群体人口所占比例
  • medv 房屋平均价格

本文基于波士顿房价数据集实现
数据集:数据集网盘下载
提取码:p2v9

数据集查看&简单预处理

data = pd.read_csv(r"dataset/boston.csv")
#data
#查看数据基本信息,同时也可以用来查看,各个特征列是否存在缺失值。
#data.info() #结果显示,并无缺失值
#查看是否有重复值
#data.duplicated().any() #Flase

在这里插入图片描述

在这里插入图片描述

线性回归–最小二乘法算法实现

class linearRegression:
    """使用python实现线性回归。(最小二乘法)"""
    
    def fit(self,X,y):
        """根据提供的训练数据,对模型进行训练
        
        Parameters:
        -----------------
        X:类数组类型。形状:[样本数量,特征数量]
           特征矩阵,用来对模型进行训练。
        y:类数组类型,形状:[样本数量]
        """
        # 说明:如果X是数组对象的一部分,而不是完成的对象数据(例如:X由其他对象通过切片传递过来的)
        # 则无法完成矩阵的转换。
        # 这里创建X的拷贝对象,避免转换成矩阵时出错
        X = np.asmatrix(X.copy())
        # y 一维结构(行向量或列向量),一维结构可以不用拷贝。
        # 注意:我们现在要进行矩阵的运算,因此需要是二维的结构,我们通过reshap方法进行。
        y = np.asmatrix(y).reshape(-1,1)
        
        # 通过最小二乘公式求出最佳权重
        self.w_ = (X.T * X).I * X.T * y
        
    def predict(self,X):
        """根据参数传递的样本X,对样本数据进行预测
        
         Parameters:
        -----------------
        X:类数组类型。形状:[样本数量,特征数量]
           待预测样本特征(属性),用来预测。
        
        Returns:
         -----------------
        result : 数组类型
                预测的结果
        """
        # 将X转换成矩阵,注意:需要对X进行拷贝
        X = np.asmatrix(X.copy())
        result = X * self.w_
        # 将矩阵转换成ndarray数组,进行扁平化处理(使用ravel())。
        return np.asarray(result).ravel()
        

不考虑截距

# 不考虑截距的情况
t = data.sample(len(data),random_state=0)
train_X = t.iloc[:400,:-1]
train_y = t.iloc[:400,-1]
test_X = t.iloc[400:,:-1]
test_y = t.iloc[400:,-1]

lr = linearRegression()
lr.fit(train_X,train_y)
result = lr.predict(test_X)
# result
display(np.mean((result - test_y)**2))
# 查看模型权重
display(lr.w_)

考虑截距

# 考虑截距的情况,增加一列,该列所有值都是1
t = data.sample(len(data),random_state=0)
# 可以这样增加一列
#t["Intercept"] = 1
# 按照习惯,截距作为w0,我们为它配上x0,x0列放在最前面
new_columns = t.columns.insert(0,"Intercept")
# 从新安排列的顺序,如果值为空,则使用fill_value的值填充
t = t.reindex(columns=new_columns,fill_value=1)
#t
train_X = t.iloc[:400,:-1]
train_y = t.iloc[:400,-1]
test_X = t.iloc[400:,:-1]
test_y = t.iloc[400:,-1]

lr = linearRegression()
lr.fit(train_X,train_y)
result = lr.predict(test_X)
# result
display(np.mean((result - test_y)**2))
# 查看模型权重
display(lr.w_)

可视化

import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams["font.family"] = "SimHei"
mpl.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(10,8))
# 绘制预测值
plt.plot(result,"ro-",label="预测值")
# 绘制真实值
plt.plot(test_y.values,"go--",label="真实值")
plt.xlabel("样本序号")
plt.ylabel("房价")
plt.title("线性回归预测--最小二乘法")
plt.legend()
plt.show()

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐