线性模型实例

线性回归,最小二乘法

x = [2.8 ,2.9, 3.2 ,3.2, 3.4, 3.2, 3.3, 3.7, 3.9, 4.2]
y = [25.3,  27.6,  29.4,   32.3,  34.1,  36.2,  35.3,  39.1,  42,   45]

plt.scatter(x,y)
#plt.plot(x,y)
plt.show()

在这里插入图片描述

def avg(x):
    m=len(x)
    sum=0
    for num in x:
        sum+=num
    return sum/m
def fit(x,y):
	#计算均值
    x_avg=avg(x)
    y_avg=avg(y)
    m=len(x)
    tmp_1=0
    tmp_2=0
    #计算参数a,b
    for i in range(m):
        tmp_1+=(x[i]-x_avg)*(y[i]-y_avg)
        tmp_2+=(x[i]-x_avg)**2
    a=tmp_1/tmp_2
    b=y_avg-a*x_avg
    return a,b
a,b=fit(x,y)
print(a,b)
pre_y=[]
for i in range(len(y)):
    pre_y.append(a*x[i]+b)
plt.scatter(x,y)
plt.plot(x,pre_y)
plt.show()

在这里插入图片描述

梯度下降法

根据前九个小时的空气检测情况预测第十个小时的PM2.5的值。
在这里插入图片描述
数据中纵列表示0-23时空气中各种数据的变化情况,每18横行表示一天的

数据预处理

  • 对于空缺值,可以使用补全法和删除法,补全法一般填补样本均值,数据预处理的作用是将数据转变为模型可识别的数据。
import pandas as pd
import numpy as np

# 数据预处理
def dataProcess(df):
    x_list, y_list = [], []
    # df替换指定元素,将空数据填充为0
    df = df.replace(['NR'], [0.0])
    # astype() 转换array中元素数据类型
    array = np.array(df).astype(float)
    # 将数据集拆分为多个数据帧
    for i in range(0, 4320, 18):
        for j in range(24-9):
            mat = array[i:i+18, j:j+9]
            label = array[i+9, j+9] # 第10行是PM2.5
            x_list.append(mat)
            y_list.append(label)
    x = np.array(x_list)
    y = np.array(y_list)
    return x, y, array

# 更新参数,训练模型
def train(x_train, y_train, epoch):
    bias = 0 # 偏置值初始化
    weights = np.ones(9) # 权重初始化
    learning_rate = 1 # 初始学习率
    reg_rate = 0.001 # 正则项系数
    bg2_sum = 0 # 用于存放偏置值的梯度平方和
    wg2_sum = np.zeros(9) # 用于存放权重的梯度平方和

    for i in range(epoch):
        b_g = 0
        w_g = np.zeros(9)
        # 在所有数据上计算Loss_label的梯度
        for j in range(3200):
            b_g += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-1)
            for k in range(9):
                w_g[k] += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias) * (-x_train[j, 9, k]) #计算梯度
        # 求平均    
        b_g /= 3200
        w_g /= 3200
        #  加上Loss_regularization在w上的梯度
        for m in range(9):
            w_g[m] += reg_rate * weights[m]
        
        # adagrad
        bg2_sum += b_g**2
        wg2_sum += w_g**2
        # 更新权重和偏置
        bias -= learning_rate/bg2_sum**0.5 * b_g
        weights -= learning_rate/wg2_sum**0.5 * w_g

        # 每训练200轮,输出一次在训练集上的损失
        if i%200 == 0:
            loss = 0
            for j in range(3200):
                loss += (y_train[j] - weights.dot(x_train[j, 9, :]) - bias)**2
            print('after {} epochs, the loss on train data is:'.format(i), loss/3200)

    return weights, bias

# 验证模型效果
def validate(x_val, y_val, weights, bias):
    loss = 0
    for i in range(400):
        loss += (y_val[i] - weights.dot(x_val[i, 9, :]) - bias)**2
    return loss / 400

def main():
    # 从csv中读取有用的信息
    # 由于大家获取数据集的渠道不同,所以数据集的编码格式可能不同
    # 若读取失败,可在参数栏中加入encoding = 'gb18030'
    df = pd.read_csv('train.csv', usecols=range(3,27))
    x, y, _ = dataProcess(df)
    #划分训练集与验证集
    x_train, y_train = x[0:3200], y[0:3200]
    x_val, y_val = x[3200:3600], y[3200:3600]
    epoch = 2000 # 训练轮数
    # 开始训练
    w, b = train(x_train, y_train, epoch)
    # 在验证集上看效果
    loss = validate(x_val, y_val, w, b)
    print('The loss on val data is:', loss)

if __name__ == '__main__':
    main()

在这里插入图片描述
上述模型将一天中的18种数据全都作为影响PM2.5的因素,使用梯度下降进行训练。
下面使用sklearn模型中的岭回归进行训练,仅考虑前9个小时PM2.5作为第10个小时的影响因素。

from sklearn import linear_model
import matplotlib.pyplot as plt
import pandas as pd


if __name__=='__main__':
    reg = linear_model.Ridge(alpha=898.21)
    reg.fit(x_data, y_data)
    pre_y_data = reg.predict(x_data)
# 使用广义交叉验证 拟合得到最优alpha参数 = 898.21
# regs = linear_model.RidgeCV(np.linspace(1,1000))
# regs.fit(x_data, y_data)
#
# alpha = regs.alpha_

    # 求得误差
    err = abs(pre_y_data - y_data)

    plt.plot(np.linspace(1, len(err), len(err)), err)
    plt.xlabel(r'$trainingIndex$', fontsize=16)
    plt.ylabel(r'$error$', fontsize=16)
    plt.title('abs trainingError')
    plt.show()

    print(err.sum(axis=0)/len(err)*1.0)

在这里插入图片描述

  1. 在实际训练模型时,首先要将数据转变为模型可识别的数据,对数据的缺失值,不合理值进行预处理。
  2. 选择合适的模型来训练,选择适当的损失函数(如交叉熵、平方损失)
  3. 观察模型的结果是否发生过拟合或者欠拟合的现象,若发生过拟合,应该使用正则化L1或L2正则化项来平衡模型复杂度和误差的关系,还可以采用交叉验证的方法。若欠拟合,应需要更多的数据或者是重新选择模型。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值