一、一句话掌握线性回归算法
简单说,就是在一堆训练数据中,找到一条直线(或者平面/超平面)代表这些训练数据的趋势,预测的是一个连续的数据。这条线到这每个点的距离都是最近的,误差最小的。
网络说法:
线性回归算法是一种统计分析方法,用于确定两种或两种以上变量间相互依赖的定量关系。它的核心思想是通过最小二乘法找到自变量和因变量之间的最佳拟合直线(或超平面),使得预测值与真实值之间的误差最小
二、线性回归算法核心
1)假设有一堆数据,我们在这里找到一个最契合的直线模拟这堆数据;假设这条直线
是
接下来就是求解 数值 a和数值b;
- 你会怎么求解呢?
2)最小二乘求解:
对于数据集中不同的点,我们试图:
如何计算最优的 𝑤 和 𝑏,关键在于如何衡量 𝑓(𝑥) 与 y 之间的差别。最小二乘法就是试图找到一条直线,使所有样本到直线的欧式距离之和最小。欧式距离与均方误差相对应,即:
求解 𝑤 和 𝑏 的过程,称为线性回归模型的最小二乘“参数估计”
3)当y=ax+b的解决不了这个问题呢?
实际应用中,往往y不止和一个x产生相关性;当x有i个时,计算的方式如下:
假设模型如下:
其中,y为预测的因变量,w为系数,x为自变量,n为自变量的个数。
1、矩阵格式:
2、损失函数:
普通形式:
其中,r为因变量的真实值。
矩阵形式:
三、线性回归算法实践
代码实现:
import numpy as np
import pandas as pd
df =pd.read_csv('work/hw1_data/train.csv',encoding='big5')
print(df)
df.drop(["日期","测试"],axis=1,inplace=True)
print(df)
col=df["测试"].unique()
#print(col)
new_train=pd.DataFrame(np.zeros([18,24*240]),index=col)
#print(new_train)
for i in col:
df1=df[df["测试"]==i]
df1.drop(["测试"],axis=1,inplace=True)
df1=np.array(df1) #数组
#print(df1)
df1[df1=="NR"]="0" #将数组中nr的值成0
df1=df1.astype("float")
df1=df1.reshape(1,5760)
#print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
new_train.loc[i]=df1 #形成整行插入一维数组,也可以转化成整列插入,设置new_train为(24*240,18),则new—train[i]=df1
print(new_train)
#接下来提取训练集的标签
label=np.array(new_train.loc["PM2.5",9:],dtype='float32') #提取训练集的标签
label=label.reshape(5751,1) #构成5751*1的列矩阵
print(label)
#接下来训练模型,得出w
label=label.astype("float") #数组所有的值转化成float型,标签
#print(label)
m=len(label)
#print(m)
eta=0.00001
w=np.ones((10,1))
for t in range(100):
for v in range(m):
x=np.array(new_train.loc["PM2.5",v:v+8]) #样本的所有特征值
x=np.insert(x,0,1.0) #在9个特征值前加一个1.0,方便处理偏置b
h=np.dot(x,w)
err=label[v]-h #第一次更新label-wx
x=x.reshape(10,1) #装置x变成10*1
w+=eta*x*err #每次变更w向量
print(w)
#接下来提取测试集的标签,并预测
df2=pd.read_csv('work/hw1_data/test.csv',encoding='big5') #提取测试集的特征值,接下来预测
#print(df2)
test=df2.iloc[:,2:]
test=np.array(test)
test[test=="NR"]="0" #替换非数字的字符
test=test.astype("float") #转化成数值
print(test)
print(test.shape)
t=9
test1=[]
for i in range(240): #提取240个测试集
test1.append([1.0,*test[t]])
#print(test1)
t=t+18
#print(test1)
test1=np.array(test1) #将测试集变成数组
print(test1.shape) #打印数组shape
t_label=[]
print("预测值:")
for k in range (240): #遍历测试集
test_label=np.dot(test1[k],w)
print(test_label)
t_label.append(test_label)
#t_label=np.array(t_label) #转化成一维数组
#t_label=t_label.reshape(240,1) #转化成240*1的列数组
#print(t_label)#打印列数组
线性回归在生活中有很多应用场景,如经济学(分析GDP与失业率、物价与消费者支出等关系)、市场营销(分析广告投入与销售额、产品价格与销量等关系)、医学研究(分析药物剂量与治疗效果、生活方式与健康指标等关系)、教育评估(分析学习时间与考试成绩、教育投入与学生表现等关系)和人力资源管理(分析员工培训时间与绩效、工资与员工满意度等关系);
四、总结说明
线性回归(Linear Regression)是一种用于预测数值型数据的监督学习算法。它的核心思想是通过拟合一条最佳直线(或超平面,对于多维数据),使得这条直线能够尽可能地接近样本点。线性回归模型简单、易于理解,并且在许多实际问题中都能取得不错的效果。
注意事项
- 特征选择:选择合适的特征对于线性回归模型的性能至关重要。通常需要进行特征工程,如特征缩放、多项式特征生成等,以提高模型的性能。
- 过拟合与欠拟合:过拟合是指模型在训练数据上表现良好,但在测试数据上表现较差的情况。欠拟合则是指模型在训练数据和测试数据上表现都较差的情况。为了避免过拟合和欠拟合,可以使用正则化技术(如岭回归、Lasso 回归)、交叉验证等方法。
- 异常值处理:异常值可能会对线性回归模型的参数估计产生较大影响。因此,在建模前需要对数据进行清洗和预处理,以去除或减小异常值的影响。
回归分析是用来描述一组数据的趋势和预测未来数据的方法。在线性回归中,我们需要利用一些数据和统计方法来建立自变量和因变量之间的关系。具体来说,我们需要找到自变量和因变量之间的线性关系,并使用最小二乘法求得最佳拟合直线,从而预测未来的数据。