赞
踩
线性 回归
数据集分析
#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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。