
介绍:这是一个教育对收入影响的数据,从图像的走势来看,它是具有一个线性关系,即受教育年限越长收入越高,这样我们可以通直线来抽象出它们的关系。
接下来,我们将会介绍一些方法,分别是单变量线性回归算法、成本函数与损失函数、梯度下降算法。
首先要提到的是单变量线性回归算法,我们有这样一个函数f(x)=w*x+b;即x代表,f(x)代表收入我们使用f(x)这个函数来映射输入特征值和输出值。这个时候问题就转化为了,这条直线需要画在什么地方才合适,或者我们说w和b该取什么样的值呢?
然后是,成本函数与损失函数,使用均方差作为成本函数,也就是预测值和真实值之间的平方取均值,我们的优化目标(y代表实际的收入)是找到合适的w和b,使得(f(x)-y)**2越小越好,这样我们获得的直线会更好些。
最后是使用梯度下降算法,转而求解参数w,b,后面我会再着重讲解这里,大家只要明白这里会用到这个方法即可。
现在,我们可以读取文件,使用matplotlib函数来绘制散点图。
下面是代码,我这里是用的是pandas,当然,如果你自己有能力也可以手写一个。
- import torch
-
- import pandas as pd
- import numpy
- import matplotlib.pyplot as plt
-
- data=pd.read_csv("./dataset/Income1.csv")
- data.info() #返回这个文件的一些信息
- print(data)
- plt.scatter(data.Education,data.Income)
- plt.xlabel("Education"),plt.ylabel("Income")
- plt.show()
RangeIndex: 30 entries, 0 to 29
Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Unnamed: 0 30 non-null int64
1 Education 30 non-null float64
2 Income 30 non-null float64
dtypes: float64(2), int64(1)
memory usage: 848.0 bytes
此为info方法获得的信息,下面是用matplotlib所画的散点图。

- from torch import nn
- import torch
-
- import pandas as pd
- import numpy
- import matplotlib.pyplot as plt
- import numpy as np
-
- data=pd.read_csv("./dataset/Income1.csv")
-
- # x=data.Education
- # print(x) #返回的是原来的列
- # x=data.Education.values
- # print(x)
-
-
- # x=data.Education.values.reshape(-1,1).shape
- # print(x) #(30,1)指,30个数据
- #
- # x=data.Education.values.reshape(-1,1).astype(np.float64)
- # print(x)
-
- X=torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float64))
- print(X)
-
- Y=torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float64))
- print(Y)
-
- model=nn.Linear(1,1) #out=w@input+b Linear表示随机生成一个权重(有w,b)
- #这时就是指input和out都是1 ,w@input+b等价于 model(input)
-
- #计算均方误差
- loss_fn=nn.MSELoss() #损失函数
- #优化算法
- opt=torch.optim.SGD(model.parameters(),lr=0.0001)
关于预处理部分,我简单说说,调用data.Education返回的是一个原来csv文件的那一列数据,这并不是我们想要的,所以在这里,我先将其转化为了numpy的数据类型ndarrary数组类型,用的是(data.Education.values)方式,我希望我的数据能够一个输入一个输出,所以又添加了reshape方法,将其shape变为(30,1),而torch.from_numpy显而易见是将numpy的ndarrary类型转化为pytorch所用的tensor类型。
这里对于X,Y处理过后,采用nn.Linear()方式随机生成一个权重,一输入一输出。对于损失函数我们可以用nn,MSELoss(),那么建立模型还有一步是进行优化,pytorch当然也提供了,只不过它是在torch当中,torch.optim.SGD(model.parameters(),lr=0.0001),model.parameters()返回需要优化参数,lr为学习速率,具体是什么,我会在后面讲到,这里只需要知道要用就对了。
- import pandas as pd
- import numpy
- import matplotlib.pyplot as plt
- import numpy as np
-
- from torch import nn
- import torch
-
- data=pd.read_csv("./dataset/Income1.csv")
- X = torch.from_numpy(data.Education.values.reshape(-1, 1)).type(torch.FloatTensor)
- # print(X)
-
- Y = torch.from_numpy(data.Income.values.reshape(-1, 1)).type(torch.FloatTensor)
- # print(Y)
-
- model=nn.Linear(1,1)
-
- #计算均方误差
- loss_fn=nn.MSELoss() #损失函数
- #优化算法
- opt = torch.optim.SGD(model.parameters(), lr=0.0001)
-
- for epoch in range(5000):
- for x,y in zip(X,Y):
- y_pred = model(x) #使用模型预测
- loss=loss_fn(y,y_pred) #根据预测结果计算损失
- opt.zero_grad() #把变量的梯度清零
- loss.backward() #反向传播算法,求解梯度
- opt.step() #优化模型参数
- print(model.weight,model.bias)
- plt.scatter(data.Education,data.Income)
- plt.xlabel("Education"),plt.ylabel("Income")
- plt.plot(X.numpy(),model(X).data.numpy(),c='r')
- plt.show()
打印weight,bias值
tensor([[4.9757]], requires_grad=True)
tensor([-28.3907], requires_grad=True)

较好的拟合了本次数据,那么这就是创建模型,训练模型和使用模型的过程。
博客的相关代码与csv文件已上传至
如果大家觉得有用,在GitHub里面点击收藏即可。