【python机器学习】线性回归--最小二乘法实现(基于波士顿房价数据集)
导入库import numpy as npimport pandas as pd波士顿房价数据集字段说明crim 房屋所在镇的犯罪率zn 面积大于25000平凡英尺住宅所占比例indus 房屋所在镇非零售区域所占比例chas 房屋是否位于河边如果在河边,值1nox 一氧化氮的浓度rm 平均房间数量age 1940年前建成房屋所在比例dis 房屋距离波士顿五大就业中心的加权距离rad 距离房屋最近的
·
导入库
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()
更多推荐
已为社区贡献1条内容
所有评论(0)