zoukankan      html  css  js  c++  java
  • 数据挖掘实践(18):算法基础(一)线性回归

    1 基本函数确立

    1.1 回归的形式—标记/label

    • 回归模型可预测连续值。例如,回归模型做出的预测可回答如下问题:

      • 加利福尼亚州一栋房产的价值是多少?

      • 用户点击此广告的概率是多少?

    • 例如,下表显示了从包含加利福尼亚州房价信息的数据集中抽取的 5 个有标签样本:

     

    1.2 代码实验

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.linear_model import LinearRegression
    
     
    # 100个数,1列,rand表示均匀分布,在0~1之间
    X = 2 * np.random.rand(100, 1)
    # print(X)
    # y表示认为设置真实的一列Y,np.random.randn(100,1)表示error,randn表示标准正太分布
    y = 3 + 6 * X + np.random.randn(100, 1)
    # print(y)
    lin_reg = LinearRegression()
    
    lin_reg.fit(X, y)
    print("θ = ",lin_reg.coef_)
    print("---------------------------------")
    print("截距项 = ",lin_reg.intercept_)
    
    print("---------------------------------")
    
    X_new = np.array([[0], [2]])
    y_predict = lin_reg.predict(X_new)
    print(y_predict)
    
    θ =  [[6.394389]]
    ---------------------------------
    截距项 =  [2.63594646]
    ---------------------------------
    [[ 2.63594646]
     [15.42472446]]
    # 可视化
    plt.plot(X_new, y_predict, 'r-')
    plt.plot(X, y, 'k.')
    plt.axis([0, 2, 0, 15])
    plt.show()

    • 机器学习的所有算法,系统都是学的是参数theta;咱们不仅要代码实现出来,在学习算法的时候呀,咱们也要进行“参数估计”

    2 目标函数如何建立

    2.1 叙谈基本函数

    • 基本函数:人为假设的,让(x,y)这样的符合y=f(x;θ)的假设函数
    # 可视化
    plt.plot(X_new, y_predict, 'r-')
    plt.plot(X, y, 'k.')
    plt.axis([0, 2, 0, 15])
    plt.show()

    • 目标函数与最优方法

     

    2.2 目标函数推导

    2.2.1 矩阵推导

     2.2.2 目标函数推导

    • 试推导一下当theta多少时,J(theta)最小呢?

    3 确立最优函数

    最优方法/工具:梯度下降算法

     4.案例:广告与多媒体之间的预测

    #!/usr/bin/python
    # -*- coding:utf-8 -*-
    
    import csv
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import pandas as pd
    from sklearn.model_selection import train_test_split
    from sklearn.linear_model import LinearRegression
    
    
    if __name__ == "__main__":
        
        path = './data/Advertising.csv'
        # pandas读入
        # 一、加载数据集
        data = pd.read_csv(path)    # TV、Radio、Newspaper、Sales
        x = data[['TV', 'Radio', 'Newspaper']] # 建立特征矩阵 200 * 4 
        y = data['Sales'] # 建立 标签矩阵 200 * 1 
        print(x)
        print(y)
    
            TV  Radio  Newspaper
    0    230.1   37.8       69.2
    1     44.5   39.3       45.1
    2     17.2   45.9       69.3
    3    151.5   41.3       58.5
    4    180.8   10.8       58.4
    ..     ...    ...        ...
    195   38.2    3.7       13.8
    196   94.2    4.9        8.1
    197  177.0    9.3        6.4
    198  283.6   42.0       66.2
    199  232.1    8.6        8.7
    
    [200 rows x 3 columns]
    0      22.1
    1      10.4
    2       9.3
    3      18.5
    4      12.9
           ... 
    195     7.6
    196     9.7
    197    12.8
    198    25.5
    199    13.4
    Name: Sales, Length: 200, dtype: float64
    # 设置字符集,防止中文乱码
    # mpl.rcParams["font.sans-serif"] = [u'simHei'] #Win自带的字体
    
    plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] #Mac自带的字体
    mpl.rcParams["axes.unicode_minus"] = False
        #  绘制1
        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.title("线性回归对于多媒体与广告的销售数据", fontsize=16)
        plt.legend(loc='lower right')
        plt.grid()
        plt.show()

        # 绘制2
        plt.figure(figsize=(9,12))
        plt.subplot(311)
        plt.plot(data['TV'], y, 'ro')
        plt.title('TV')
        plt.grid()
        
        plt.subplot(312)
        plt.plot(data['Radio'], y, 'g^')
        plt.title('Radio')
        plt.grid()
        
        plt.subplot(313)
        plt.plot(data['Newspaper'], y, 'b*')
        plt.title('Newspaper')
        plt.grid()
        plt.tight_layout()
        plt.show()

     

     

        # 二、分割数据集
        x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)
        # print(x_train, y_train)
        # 三、选择/建立模型
        linreg = LinearRegression()
        # 四、训练模型
        model = linreg.fit(x_train, y_train)
        
        print("linereg的theta = ",linreg.coef_)
        print()
        print("linreg的截距项 = "  ,linreg.intercept_)
    linereg的theta =  [0.04656457 0.17915812 0.00345046]
    
    linreg的截距项 =  2.8769666223179318
        # 五、验证模型
        y_hat = linreg.predict(np.array(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)
        
        print()
        
        print(mse, rmse)
    MSE =  1.9730456202283366
    
    1.9730456202283366 1.4046514230328948

    from sklearn.metrics import r2_score
    r2_score(y_test, y_hat)
    0.9156213613792232

        t = np.arange(len(x_test))
        plt.plot(t, y_test, 'r-', linewidth=2, label='Test')
        plt.plot(t, y_hat, 'g-', linewidth=2, label='Predict')
        plt.title("线性回归对于多媒体与广告的销售数据", fontsize=16)
        plt.legend(loc='upper right')
        plt.grid()
        plt.show()

    • 线性回归的定义,是利用最小二乘函数对一个或多个自变量之间关系进行建模的方法
    • 多元回归的分析思路(参数估计)都与一元回归完全相同

    5、总结

    5.1 什么是线性回归

    线性:两个变量之间的关系是一次函数关系的——图象是直线,叫做线性。 非线性:两个变量之间的关系不是一次函数关系的——图象不是直线,叫做非线性。 回归:人们在测量事物的时候因为客观条件所限,求得的都是测量值,而不是事物真实的值,为了能够得到真实值,无限次的进行测量,最后通过这些测量数据计算回归到真实值,这就是回归的由来。

     

    5.2 能够解决什么样的问题

    对大量的观测数据进行处理,从而得到比较符合事物内部规律的数学表达式。也就是说寻找到数据与数据之间的规律所在,从而就可以模拟出结果,也就是对结果进行预测。解决的就是通过已知的数据得到未知的结果。例如:对房价的预测、判断信用评价、电影票房预估等。

     

    5.3 过拟合、欠拟合如何解决

    使用正则化项,也就是给loss function加上一个参数项,正则化项有L1正则化、L2正则化、ElasticNet。加入这个正则化项好处:

    控制参数幅度,不让模型“无法无天”。 限制参数搜索空间 解决欠拟合与过拟合的问题。  

  • 相关阅读:
    (五)消费Dubbo服务
    (四)Dubbo Admin管理控制台
    (三)发布Dubbo服务
    (二)zookeeper安装
    (一)Dubbo简介
    解决tomcat 启动 一闪而过
    Redis的数据结构之哈希
    Redis的数据结构之字符串
    Jedis 连接池实例
    linux/centos定时任务cron
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14359109.html
Copyright © 2011-2022 走看看