线性回归的小例子-预测广告媒体的投入和销售额之间的关系

在实际生产中,人们都希望可以通过合理的投入来获取最大的收益,我们无法准确的知道未来投入多少可以获益多少,只能根据以往的数据来预测。这里我们给定一个数据集如下:
这里写图片描述

我们做的就是从这样的一个数据集中建模,获取一个模型,希望可以很好的预测将来的投入和收益之间的关系。

实现代码如下:

1.导入所需的第三方库

#!/usr/bin/python
# -*- coding:utf-8 -*-


import csv
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from pprint import pprint

2.读入数据集

if __name__ == "__main__":

    # 利用pandas的read_csv()方法读入数据集
    # 将其中的TV、Radio、Newspaper作为X,Sales作为Y
    data = pd.read_csv(u'Advertising.csv')    
    x = data[['TV', 'Radio', 'Newspaper']]
    y = data['Sales']

    #实现在matplotlib中显示中文
    mpl.rcParams['font.sans-serif'] = ['simHei']
    mpl.rcParams['axes.unicode_minus'] = False

    # 绘制关于TV、Radio、Newspaper和Sales的视图
    plt.figure(facecolor='w')
    plt.plot(data['TV'], y, 'ro', label='TV')
    plt.plot(data['Radio'], y, 'g^', label='Radio')
    plt.plot(data['Newspaper'], y, 'mv', label='Newspaer')
    plt.legend(loc='lower right')
    plt.xlabel('广告花费', fontsize=16)
    plt.ylabel('销售额', fontsize=16)
    plt.title('广告花费与销售额对比数据', fontsize=18)
    plt.grid(b=True, ls=':')
    plt.show()

3.调用库来处理数据、生成模型

    #调用sklearn.linear_model中的LinLinearRegression对象,创建实例
    linreg = LinearRegression()

    #使用LinearRegression中的fit方法来拟合训练集,生成模型
    model = linreg.fit(x_train, y_train)

    order = y_test.argsort(axis=0)
    y_test = y_test.values[order]
    x_test = x_test.values[order, :]

    #使用LinearRegression的predict方法传入测试集,预测结果
    y_hat = linreg.predict(x_test)

    #计算平方误差和均值
    mse = np.average((y_hat - np.array(y_test)) ** 2)  # Mean Squared Error
    rmse = np.sqrt(mse)  # Root Mean Squared Error
    print('MSE = ', mse, end=' ')
    print('RMSE = ', rmse)
    print('R2 = ', linreg.score(x_train, y_train))
    print('R2 = ', linreg.score(x_test, y_test))
  1. 视图化结果
    #视图化
    plt.figure(facecolor='w')
    t = np.arange(len(x_test))
    plt.plot(t, y_test, 'r-', linewidth=2, label='真实数据')
    plt.plot(t, y_hat, 'g-', linewidth=2, label='预测数据')
    plt.legend(loc='upper left')
    plt.title('线性回归预测销量', fontsize=18)
    plt.grid(b=True, ls=':')
    plt.show()

实验结果为:
这里写图片描述

从图中我们可以看出,关于TV和Redio的图中,数据的分布大概是在一条线的附近,而Newspaper的数据则相对较没有规律。

这里写图片描述

从生成的线性回归模型效果来看,拟合曲线可以较好的在现有的数据集中拟合数据,故可以使用它来预测未来的数据。

那么这里我们的X包含了三个因素,而Newspaper看起来似乎并没有很好的拟合曲线,如果我们把它去掉再来生成模型,预测数据,结果如何呢?实验结果如下:
这里写图片描述

我们可以看出,效果并没有太大的差别,这也告诉我们,在训练模型时不时特征越多越好,太多了反而会导致过拟的出现。如果我们在训练前可以正确的选择所需的特征,那么模型的可信度就会更好。

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/81585751
今日推荐