机器学习系列三 -- 最小二乘法实现线性回归(波士顿数据集)

线性 回归
数据集分析
#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()

你可能感兴趣的:(机器学习,python,数据分析)