机器学习[7]-多变量线性回归的学习

多变量线性回归的机器学习跟单变量基本一样,只是在展示数据的相关性的时候不能单纯的用二维形式绘制,常见的有直方图、箱线图、相关系数热力图与散点图矩阵等图形。

下面还是用波士顿房价的数据集演示:

# -*- coding: utf-8 -*
# 以波士顿房屋价格为例演示多变量线性回归

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn import metrics     # 评价模块
from pandas.plotting import scatter_matrix  # 散点图矩阵


def main():
    boston = load_boston()              # 读取数据
    print(boston.keys())                # 数据中包含的内容
    print(boston.feature_names)         # data变量名

    bos = pd.DataFrame(boston.data)     # 将data数据转换为DataFrame格式以便展示
    x = bos.iloc[:, 0:3]                # 使用前三列数据
    bos_target = pd.DataFrame(boston.target)    # MEDV(房价)
    y = bos_target
    df = pd.concat([y, x], axis=1)
    df.columns = ['MEDV', 'CRIM', 'ZN', 'INDUS']
    print(df)

    # 直方图
    # xlabelsize=12:整体x轴的尺寸;ylabelsize=12:整个y轴的尺寸;figsize=(12, 7):整个图形的尺寸
    df.hist(xlabelsize=12, ylabelsize=12, figsize=(12, 7))
    plt.show()

    # 密度图
    # kind='density':密度图;subplots=True:绘制多个子图;layout=(2, 2):子图数量2×2;sharex=False:不共享x坐标轴
    # fontsize=8:图形字体大小;figsize=(12, 7):整个图形的尺寸
    df.plot(kind='density', subplots=True, layout=(2, 2), sharex=False, fontsize=8, figsize=(12, 7))
    plt.show()

    # 箱线图
    # 参数同密度图
    df.plot(kind='box', layout=(2, 2), sharex=False, sharey=False, fontsize=8, figsize=(12, 7))
    plt.show()

    # 多变量相关系数热力图
    names = ['MEDV', 'CRIM', 'ZN', 'INDUS']
    correlations = df.corr()     # 计算变量之间的相关系数矩阵
    fig = plt.figure()
    ax = fig.add_subplot(111)
    cax = ax.matshow(correlations, vmin=0.3, vmax=1)
    fig.colorbar(cax)
    ticks = np.arange(0, 4, 1)
    ax.set_xticks(ticks)
    ax.set_yticks(ticks)
    ax.set_xticklabels(names)
    ax.set_yticklabels(names)
    plt.show()

    # 散点图矩阵
    scatter_matrix(df, figsize=(8, 8), c='b')
    plt.show()

    x = df.iloc[:, 1:4]
    y = df['MEDV']
    # 划分训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
    print(x_train.shape)
    print(x_test.shape)
    print(y_train.shape)
    print(y_test.shape)

    # 训练,打印截距和系数
    lr = LinearRegression()
    lr.fit(x_train, y_train)
    print(lr.intercept_)
    print(lr.coef_)

    # 使用模型进行预测
    y_pred = lr.predict(x_test)

    # 模型评价,作图
    t = np.arange(len(x_test))
    plt.plot(t, y_test, color='red', linewidth=1.0, linestyle='-', label='y_test')
    plt.plot(t, y_pred, color='green', linewidth=1.0, linestyle='-', label='y_pred')
    plt.legend()
    plt.grid(True)
    plt.show()

    # 模型评价,指标计算
    r2 = lr.score(x_test, y_test)
    mae = metrics.mean_absolute_error(y_test, y_pred)
    mse = metrics.mean_squared_error(y_test, y_pred)
    rmse = np.sqrt(mse)
    print('r2 = ', r2)
    print('mae = ', mae)
    print('mse = ', mse)
    print('rmse = ', rmse)


if __name__ == '__main__':
    main()

最后做出的图表如下:

训练的结果不是特别的理想,究其原因是因为数据的相关性不是特别强,从散点图矩阵中可以比较清楚的看出来,所以对于数据的选取和预处理是非常重要的。不过没关系,还是基本掌握了多变量线性回归机器学习的步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值