美文网首页线性回归
《机器学习》第3章

《机器学习》第3章

作者: andyham | 来源:发表于2019-01-17 18:02 被阅读5次

    回归和分类的区别

    对连续型变量做预测叫回归,对离散型变量做预测叫分类(好瓜坏瓜)

    线性回归

    1、 线性回归的任务

    线性回归试图学得一个属性的线性组合来进行预测的函数(其中w表示各属性在预测中的重要性),即

    image

    例如下面的函数表示通过色泽、根蒂和敲声来判断是否好瓜,其中根蒂最重要,再者敲声,最后色泽

    image

    2、简单的线性回归

    在这里我们只讨论一种最简单的情形:只有一个属性。对离散属性,若属性之间存在”序“关系,可通过连续化将其转化为连续值。例如二值属性“身高”的取值高和矮可转化为{1.0,0.0},三值属性“高度”取值高、中、低可转化为{1.0,0.5,0.0},若属性之间不存在序关系,假定由k个属性值则转化为k维向量,例如“瓜类”的取值西瓜、南瓜、黄瓜可转化为(0,0,1),(0,1,0),(1,0,0)。

    线性回归试图学得

    image

    我们试图让均方误差最小化来确定w和b。均方误差是回归任务中最常用的性能度量。即

    image

    基于均方误差最小化来进行模型求解的方法称为“最小二乘法”,在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧式距离之和最小。

    求解w和b使上面公式最小化的过程,称为线性回归模型的最小二乘“参数估计”,分别对w和b求导可得

    image

    令上面两条公式为零可得到w和b最优解的闭式解,即

    image

    这里举一个例子:这个例子是预测住房价格的,我们要使用一个数据集。在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集。比方说,如果你朋友的房子是1250平方尺大小,你要告诉他们这房子能卖多少钱。那么,你可以做的一件事就是构建一个模型,也许是条直线,从这个数据模型上来看,也许你可以告诉你的朋友,他能以大约220000(美元)左右的价格卖掉这个房子。

    image

    3、简单的线性回归实现(即只有一个变量的线性回归)

    import numpy as np
    
    def fitSLR(x, y):
        '''
        训练简单线性模型
        '''
        n = len(x)      # 获取数据集长度
        dinominator = 0 # 分母
        numerator = 0   # 分子
        for i in range(0, n):
            numerator += (x[i] - np.mean(x))*y[i] 
            dinominator += (x[i] - np.mean(x))**2
        b1 = numerator/float(dinominator) # 回归线斜率
        b0 = np.mean(y)-b1*np.mean(x)     # 回归线截距
        return b0, b1
    
    def predict(x, b0, b1):
        '''
        根据学习算法做预测
        '''
        return b0 + x*b1
    
    x = [1, 3, 2, 1, 3]
    y = [14, 24, 18, 17, 27]
    
    b0, b1 = fitSLR(x, y)
    
    print("intercept:", b0, " slope:", b1)
    
    x_test = 6
    
    y_test = predict(6, b0, b1)
    
    print("y_test:", y_test)
    
    #输出
    #intercept: 10.0  slope: 5.0
    #y_test: 40.0
    

    我们也可以画图看看

    # 画图
    import matplotlib.pyplot as plt
    
    y_perd = b0 + b1*np.array(x)
    
    plt.scatter(x, y)  #散点图
    plt.plot(x, y_perd, color='black')
    plt.xlabel("x")
    plt.ylabel("y")
    plt.axis([0, 6, 0, 30])  # 设置横纵坐标的范围
    plt.show()
    
    image

    4、多元线性回归

    更多的情形,样本是由多个属性描述的,此时,我们试图学得

    image

    类似的可利用最小二乘法来对w和b进行估计。

    5、使用UCI大学公开的数据,跑线性回归

    数据的介绍:http://archive.ics.uci.edu/ml/datasets/Combined+Cycle+Power+Plant

    数据的下载地址:http://archive.ics.uci.edu/ml/machine-learning-databases/00294/

    下载的是一个压缩包,我们把他解压后,是一个xlsx,我们可以先用excel把他打开,然后另存为.csv格式,方便我们读取。

    里面是一个循环发电场的数据,共有9568个样本数据,每个数据有5列,分别是:AT(温度), V(压力), AP(湿度), RH(压强), PE(输出电力)。我们的问题是得到一个线性的关系,对应PE是样本输出,而AT/V/AP/RH这4个是样本特征, 机器学习的目的就是得到一个线性回归模型,即:

    PE=θ0+θ1∗AT+θ2∗V+θ3∗AP+θ4∗RH。而需要学习的,就是θ0,θ1,θ2,θ3,θ4这5个参数。
    用pandas来读取数据

    import numpy as np
    import pandas as pd
    
    pd.set_option('display.max_columns', None)  # 输出结果显示全部列
    
    # 读取数据,从第1行开始
    data = pd.read_csv(r"ccpp.csv", header=0)
    

    验证一下看是否读取成功,输出数据的前5行

    # 显示数据的前五行,如果是最后五行,用data.tail(),默认为5行
    print(data.head())
    # 查看描述性统计,只能看数值型数据.
    #print(data.describe())
    
    image.png

    准备运行算法的数据

    # 显示数据的维度
    print(data.shape)
    # 现在我们开始准备样本特征X,我们用AT, V,AP和RH这4个列作为样本特征
    x = data[['AT', 'V', 'AP', 'RH']]
    # 接着我们准备样本输出y, 我们用PE作为样本输出
    y = data[['PE']]
    

    划分训练集和数据集

    # 划分训练集和测试集
    from sklearn.model_selection import train_test_split
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
    # 查看训练集和测试集的维度
    # print('x_train.shape:', x_train.shape)
    # print('x__test.shape:', x_test.shape)
    # print('y_train.shape:', y_train.shape)
    # print('y_test.shape:', y_test.shape)
    

    运行scikit-learn的线性模型

    # 从sklearn库中导入线性回归函数
    from sklearn.linear_model import LinearRegression
    # 执行函数获得一个线性回归模型
    LR = LinearRegression()  # 这是一个未经训练的机器学习模型
    # 对模型传入输入数据x_train和输出数据y_train
    LR.fit(x_train, y_train)  # 这是一个经过训练的机器学习模型
    
    # 输出线性回归的截距和各个系数
    print('LR.intercept_:', LR.intercept_)
    print('LR.coef_:', LR.coef_)
    

    输出如下:
    LR.intercept_: [452.84103716]
    LR.coef_: [[-1.97313099 -0.23649993 0.06387891 -0.15807019]]
    也就是说PE与其他的4个变量的关系如下:
    PE=452.84103716−1.97313099∗AT−0.23649993∗V+0.06387891∗AP−0.15807019∗RH

    评价模型
    MSE (Mean Squared Error)叫做均方误差

    image.png
    RMSE(Root Mean Squard Error)均方根误差。
    image.png
    # 评价模型。这里使用MSE和RMSE来评价模型的好坏
    y_pred = LR.predict(x_test)
    # 引入sklearn模型评价工具库
    from sklearn import metrics
    print("MSE: ", metrics.mean_squared_error(y_test, y_pred))
    print("RMSE: ", np.sqrt(metrics.mean_squared_error(y_test, y_pred)))
    

    输出如下:
    MSE: 19.73369930349765
    RMSE: 4.442262858442491

    画图观察结果

    这里画图显示真实值和预测值的变化关系,离中间的直线y=x直接越近的点代表预测损失越低。

    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    # 画散点图
    ax.scatter(y_test, y_pred)
    ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
    # 设置标题
    ax.set_title('Plot')
    # 设置X轴标签
    ax.set_xlabel('Measured')
    # 设置Y轴标签
    ax.set_ylabel('Predicted')
    # 显示所画的图
    plt.show()
    
    image
    参考简书
    完整的代码可以去我的码云查看。

    相关文章

      网友评论

        本文标题:《机器学习》第3章

        本文链接:https://www.haomeiwen.com/subject/wlxwdqtx.html