线性 回归
数据集分析
#CRIM:城镇人均犯罪率。
ZN:住宅用地超过 25000 sq.ft. 的比例。
INDUS:城镇非零售商用土地的比例。
CHAS:查理斯河空变量(如果边界是河流,则为1;否则为0)。
NOX:一氧化氮浓度。
RM:住宅平均房间数。
AGE:1940 年之前建成的自用房屋比例。
#DIS:到波士顿五个中心区域的加权距离。
#RAD:辐射性公路的接近指数。
#TAX:每 10000 美元的全值财产税率。
#PTRATIO:城镇师生比例。
B:1000(Bk-0.63)^ 2,其中 Bk 指代城镇中黑人的比例。
#LSTAT:人口中地位低下者的比例。
#MEDV:自住房的平均房价,以千美元计。
预测平均值的基准性能的均方根误差(RMSE)是约 9.21 千美元。
读取数据集
import numpy as np
import pandas as pd
data = pd.read_csv('data.csv')
# print(data)
data.duplicated().any()
线性回归类
class LinearRegression:
# 最小二乘法实现线性回归
def fit(self,X,y):
# 根据提供的训练数据X,对模型进行训练。
# X: 类数组类型 形状:[样本数量,特征数量] 特征矩阵,用于对模型进行训练
# y : 类数组类型 形状:[样本数量]
# y = w1x1 + w2x2 + .... + wnxn
# 如果x是数组对象的一部分 而不是完整的数组对象数据
# 创建x的拷贝对象 避免转换矩阵的失败
X = np.asmatrix(X.copy())
# y 是一维结构 可以不用进行拷贝
# 进行矩阵运算 , 需要二维结构 通过reshape方法进行转换
y = np.asmatrix(y).reshape(-1,1)
# 通过最小二乘公式 求出最佳权重值
self.w_ = (X.T * X ).I * X.T * y
def predict(self,X):
# 传入样本 对样本数据进行预测
# X: 类数组类型 形状:[样本数量,特征数量]
# 待预测彻底样本特征
# return : 数组类型 预测的结果
X = np.asmatrix(X.copy())
result = X * self.w_
# 将矩阵转换为 ndarray数组 进行扁平化处理 然后返回结果
# 使用reval将数据进行扁平化处理
return np.array(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)
# print(result)
# display(result)
# print(lr.w_)
# print(np.mean((result - test_y) ** 2))
考虑截距
# 考虑截距的情况 增加一列 该列的所有值为1
t = data.sample(len(data),random_state=0)
# 截距作为w0,为之配上一个x0,x0列在最前面
new_columns = t.columns.insert(0,"Intercept")
# 重新安排列的顺序,如果值为空,则使用fill_value参数指定值进行填充
t = t.reindex(columns=new_columns,fill_value=1)
rain_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)
# print(result)
# display(result)
# print(lr.w_)
# print(np.mean((result - test_y) ** 2))
可视化
import matplotlib as mpl
import matplotlib.pyplot as plt
# 设置中文显示
mpl.rcParams['font.family'] = "SimHei"
# 设置负号显示
mpl.rcParams['axes.unicode_minus'] = False
# 设置图表大小
plt.figure(figsize=(10, 10))
# 绘制预测值
plt.plot(result, 'ro-', label="预测值")
plt.plot(test_y.values, 'go--', label="真实值")
plt.title("线性回归-最小二乘法")
plt.xlabel("样本序号")
plt.ylabel("预测房价")
plt.legend()
plt.show()