赞
踩
import numpy as np
import pandas as pd
波士顿房价数据集字段说明
本文基于波士顿房价数据集实现
数据集:数据集网盘下载
提取码: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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。