线性回归-最小二乘法(波斯顿房价数据集)

 

import numpy as np
import pandas as pd 
data = pd.read_csv("housing.csv")
#s数据信息
data.info()
#检查是否有重复值
data.duplicated().any()
class LinearRegression:
    """(最小二乘法)使用python实现线性回归"""
    def fit(self,X,y):
        """根据提供的训练数据集X,对模型进行训练。
        Parameters
        ----
        X:类似数组类型。形状[样本数量,特征数量]
        特征矩阵,用来对模型进行训练
        y:类似数组类型,形状[样本数量]
        """
        #将x转换成矩阵形式
        #如果X是数组对象的一部分,而不是不完整的对象数据。(例如,X是由其他对象切片传递过来的)
        #则无法完成矩阵的转换。因此这里创建X的copy对象,避免转换矩阵的时候失败
        X = np.asmatrix(X.copy())
        #y是一维结果(行向量或者列向量),一维的结构,可以不用进行拷贝
        #注意:要进行矩阵的运算,需要二维的结构,通过reshape,转换成二维的结构
        y = np.asmatrix(y).reshape(-1,1)
        #通过最小二乘公式,求解最佳的权重值
        #ndarray相乘为对位相乘,如果是矩阵则为点积相乘
        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_
        #将二维的result,转换成一维的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)
#
display(np.mean((result-test_y) ** 2))
#查看模型的权重
display(lr.w_)
#考虑截距的情况
#增加一列,并放在最左边,截距作为w0,为之配上一个x0,x0列在最前面
t = data.sample(len(data),random_state=0)
new_columns = t.columns.insert(0,"Intercept")
#重新安排列的顺序,如果值为空,则使用fill_value参数指定值进行填充
t = t.reindex(columns=new_columns,fill_value=1)
#拆分训练集与测试集
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)
display(np.mean((result - test_y) ** 2))
display(lr.w_)
display(result)
#可视化展示
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()

线性回归-最小二乘法(波斯顿房价数据集)_第1张图片

你可能感兴趣的:(机器学习算法)