梯度下降法实现线性回归, 实例---预测波士顿房价

本文先手动实现一个线性回归模型, 然后用sklearn的线性回归模型作对比

import pandas as pd
df = pd.read_csv('house_data.csv')  #数据集可到网上下载,波士顿房价
df.head()

Out[1]:

 CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATMEDV
00.0063218.02.3100.5386.57565.24.0900129615.3396.904.9824.0
10.027310.07.0700.4696.42178.94.9671224217.8396.909.1421.6
20.027290.07.0700.4697.18561.14.9671224217.8392.834.0334.7
30.032370.02.1800.4586.99845.86.0622322218.7394.632.9433.4
40.069050.02.1800.4587.14754.26.0622322218.7396.905.3336.2

In [2]:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
sns.set(context='notebook')

cols = ['MEDV', 'LSTAT', 'AGE', 'DIS', 'CRIM', 'TAX', 'RM']
sns.pairplot(df[cols], height=2.5)

Out[2]:

<seaborn.axisgrid.PairGrid at 0x111c676d8>

In [3]:

from sklearn import datasets
dataset = datasets.load_boston()  #也可以通过sklearn加载数据集

实现线性回归模型

In [4]:

class LinearRegressionByMyself(object):
    def __init__(self, Learning_rate=0.001, epoch=20):
        self.Learning_rate = Learning_rate
        self.epoch = epoch
        
    def fit(self, X, y):
        self.w = np.zeros(1 + X.shape[1])
        self.cost_list = []
        
        for i in range(self.epoch):
            output = self.Regression_input(X)
            #shape重置, 这里需要注意矩阵的运算问题
            output = output.T.reshape(y.shape)
            
            error = (y - output)
            #shape重置
            self.w[1:] += self.Learning_rate * X.T.dot(error).reshape(-1,)
            
            self.w[0] += self.Learning_rate * error.sum()
            cost = (error ** 2).sum() / 2.0
            self.cost_list.append(cost)
        return self
    
    def Regression_input(self, X):
        return np.dot(X, self.w[1:]) + self.w[0]
    
    def predict(self, X):
        return self.Regression_input(X)
模型写完了, 开始准备数据, 并且做数据的预处理 fit_transform

In [5]:

from sklearn.preprocessing import StandardScaler
X = df[['LSTAT']].values   # 这里只去了一维数据
y = df[['MEDV']].values
y = y.reshape(-1,1)

StandardScaler_x = StandardScaler()
StandardScaler_y = StandardScaler()
X_standard = StandardScaler_x.fit_transform(X)
y_standard = StandardScaler_y.fit_transform(y)

实际开始跑模型

In [6]:

model = LinearRegressionByMyself()
model.fit(X_standard, y_standard)

Out[6]:

<__main__.LinearRegressionByMyself at 0x1172c0898>

画出模型的损失值随着epoch变化的折线图

可见前三次变化很大, 后面趋于稳定

In [7]:

plt.plot(range(1, model.epoch+1), model.cost_list)
plt.ylabel('SSE')
plt.xlabel('Epoch')

Out[7]:

<matplotlib.text.Text at 0x11626e470>

In [8]:

def Regression_plot(X, y, model):
    plt.scatter(X, y, c='blue')
    plt.plot(X, model.predict(X), color='red')
    return None

In [8]:

Regression_plot(X_standard, y_standard, model)

模型已经完成了, 上图看起来效果还不错, 接下来做个实际的预测吧

In [9]:

#这里要注意手动实现的数据, 是做了transform预处理的, 输出实际预测值是还要inverse_transform还原预测值
Rercentage_standard = StandardScaler_x.transform([[23]])
Price_standard = model.predict(Rercentage_standard)
StandardScaler_y.inverse_transform(Price_standard)

Out[9]:

array([ 12.70271311])

使用sklearn构建线性模型

In [10]:

from sklearn.linear_model import LinearRegression
sk_model = LinearRegression()
sk_model.fit(X,y)
print(sk_model.coef_, sk_model.intercept_)
[[-0.95004935]] [ 34.55384088]

sklearn 只需要3行代码就能实现预测了, 很方便, 还不用数据预处理

In [11]:

Regression_plot(X, y, sk_model)

In [12]:

sk_model.predict(23) #实际预测结果

Out[13]:

array([[ 12.70270574]])
好的,我们来一步一步实现使用梯度下降法优化线性回归模型参数并实现波士顿房价预测。 首先,我们需要导入必要的库。在这个实例中,我们将使用 NumPy 和 Pandas 库。 ```python import numpy as np import pandas as pd ``` 接着,我们需要加载数据集。这里我们使用 Scikit-learn 库内置的波士顿房价数据集。 ```python from sklearn.datasets import load_boston boston = load_boston() X = boston.data y = boston.target ``` 数据集中的 X 是一个包含了 13 个特征的矩阵,而 y 则是一个包含 506 个样本的向量。 接下来,我们需要对数据进行预处理,包括对特征进行标准化处理和添加偏置项。 ```python # 标准化处理 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X = scaler.fit_transform(X) # 添加偏置项 X = np.concatenate([np.ones((X.shape[0], 1)), X], axis=1) ``` 现在我们已经完成了数据预处理的步骤,接下来我们需要定义代价函数并使用梯度下降法来最小化代价函数。 ```python # 定义代价函数 def cost_function(X, y, theta): m = len(y) J = np.sum((X @ theta - y) ** 2) / (2 * m) return J # 定义梯度下降函数 def gradient_descent(X, y, theta, alpha, num_iters): m = len(y) J_history = np.zeros(num_iters) for i in range(num_iters): theta = theta - alpha * (X.T @ (X @ theta - y)) / m J_history[i] = cost_function(X, y, theta) return theta, J_history ``` 在定义代价函数和梯度下降函数之后,我们需要初始化模型参数并调用梯度下降函数进行训练。 ```python # 初始化模型参数 theta = np.zeros(X.shape[1]) # 训练模型 alpha = 0.01 num_iters = 1000 theta, J_history = gradient_descent(X, y, theta, alpha, num_iters) ``` 训练完成后,我们可以使用训练好的模型来预测新的房价。 ```python # 预测房价 X_new = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3]) X_new = (X_new - scaler.mean_) / scaler.scale_ X_new = np.concatenate([np.array([1]), X_new]) y_new = X_new @ theta print(f"Predicted house price: ${y_new:.2f}") ``` 以上就是使用梯度下降法优化线性回归模型参数并实现波士顿房价预测的完整代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值