线性回归基础

image-20220511101717046

什么是线性回归

举个例子,我们去市场买牛肉,一斤牛肉52块钱,两斤牛肉104块钱,三斤牛肉156块钱,以此类推。也是说牛肉的价格随着牛肉斤数的增加而有规律地增加,这种规律可以用下图表示:

image-20220511102038773

可以看到上述规律可以用一条直线来表述,这就是一个线性模型。用 x表示牛肉斤数,

用 y 表示价格,就得到方程: y=52x

这个方程就叫做回归方程,52叫做回归系数,求解回归系数的过程叫做回归

线性回归首先假设自变量和因变量是线性关系,然后通过对现有样本进行回归,进而计算出回归系数以确定线性模型,最后使用这个模型对未知样本进行预测

  • 一元线性回归模型:f(x)=wx+b
  • 多元线性回归模型:f(x)=w~1~ x~1~+w~2~ x~2~+…+w~n~ x~n~+b
最小二乘法
  • 求解线性回归中的未知参数:最小二乘法
  • 构造一个函数:理论值与观测值之差的平方和
  • 目标:选择未知参数,使得观测值与理论值之差的平方和达到最小

以一元线性回归为例:

image-20220511103332824

线性回归的衡量指标
  • MSE(Mean Squared Error):均方误差

1m∑i=1m(ytest(i)−y^test(i))2

  • RMSE(Root Mean Squared Error):均方根误差

1m∑i=1m(ytest(i)−y^test(i))2

  • MAE(Mean Absolute Error):平均绝对误差

1m∑i=1m|ytest(i)−y^test(i)|

  • R方指标(R Squared)

    R2=1−MSE(y^,y)var(y)

    • R^2^ <= 1
    • R^2^越大越好。当预测模型没有任何错误时,R^2^等于1
    • 引入R^2^衡量指标的原因:可以对不同回归问题的模型准确度进行统一衡量(例如:房价线性回归问题和学生成绩线性回归问题)

实战——波士顿房价的线性回归模型

sklearn中实现线性回归使用sklearn.linear_model.LinearRegression

根据波士顿历史房价数据建立回归模型,并检测模型准确率

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets


boston = datasets.load_boston() # 加载波士顿房子数据集
print(boston.DESCR) # 查看数据描述
X = boston.data  # 特征
y = boston.target  # 标签


plt.scatter(X[:,5],y) # 从图中发现,房价超过50万的样本可能有异常
plt.show()


X = X[y<50.0]  # 选择房价小于50万的样本特征
y = y[y<50.0]  # 选择房价小于50万的样本标签


from sklearn.model_selection import train_test_split


# 拆分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)


# 特征标准化处理
from sklearn.preprocessing import StandardScaler


std = StandardScaler()
# 对训练样本集进行特征标准化处理
X_train_standard = std.fit_transform(X_train)
# 对测试样本集进行特征标准化处理,要注意这里不能fit了!
X_test_standard = std.transform(X_test)


from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
# 使用标准化后的训练样本集进行拟合学习(建立合适的线性回归模型)
lin_reg.fit(X_train_standard,y_train) 
# 在测试集上测试模型的优劣,使用的是R^2标准
print(lin_reg.score(X_test_standard,y_test))

实战——能源效能数据的相关分析与线性回归模型

image-20220511152651629

数据来自于UIC数据集中的能效数据集,该数据集用来分析建筑的供热负荷能效和制冷负荷能效,其中自变量有8个,主要分析8个自变量和供热负荷Y1之间的回归模型

根据效能数据绘制数据相关系数热力图,并建立回归模型,并检测模型准确率

import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns 
from sklearn import datasets
import pandas as pd
# 解决绘图中文乱码问题
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决绘图负号问题
matplotlib.rcParams['axes.unicode_minus']=False
# 设置绘图字体
sns.set(font= "Kaiti",style="ticks",font_scale=1.4)




# 读取用于多元回归的数据
enbdf = pd.read_excel("ENB.xlsx") 
# 对每个变量的取值进行标准化
enbdf_n = (enbdf-enbdf.mean())/enbdf.std()
enbdf_n.head()


# 使用相关系数热力图可视化变量之间的相关性
datacor = enbdf_n.corr()
# 热力图可视化相关系数
plt.figure(figsize=(8,8))
# annot参数:默认为False,为True的话,会在格子上显示数字
ax = sns.heatmap(datacor,square=True,annot=True,fmt=".2f",
      linewidths=.5,cmap="YlGnBu")
ax.set_title("数据变量相关性")
plt.show()


X = np.array(enbdf_n)[:,:-1] # 样本特征
y = np.array(enbdf_n)[:,-1]  # 样本标签




from sklearn.model_selection import train_test_split
# 拆分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)


from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X_train,y_train) # 使用训练集拟合模型
print(lin_reg.score(X_test,y_test)) # 使用测试集测试模型的优劣

工作年限与收入的线性回归模型

image-20230131150342219

背景介绍

通常来说,IT行业收入都会随着工作年限的增长而增长,本节通过一元线性回归模型来

探寻工作年限对收入的影响,也即搭建收入预测模型。

分析步骤

  1. 读取数据
  2. 绘制工龄与薪水的散点关系图
  3. 模型搭建
  4. 模型可视化
  5. 线性回归方程构造

代码实现

import pandas as pd
# 读取数据
df = pd.read_excel('IT行业收入表.xlsx')
df.head()


# 提取特征(工龄)与标签(薪水)
X = df[['工龄']]
y = df['薪水']


# 绘制散点图
from matplotlib import pyplot as plt
# 用来正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.scatter(X,y)
plt.xlabel('工龄')
plt.ylabel('薪水')
plt.show()


# 模型搭建
from sklearn.linear_model import LinearRegression
regr = LinearRegression() 
regr.fit(X,y) # 训练模型


# 模型可视化
plt.scatter(X,y)
plt.plot(X, regr.predict(X), color='red') 
plt.xlabel('工龄')
plt.ylabel('薪水')
plt.show()


# 线性回归方程构造
print('系数a为:' + str(regr.coef_[0]))
print('截距b为:' + str(regr.intercept_))

客户价值预测模型

image-20230101115110431

背景介绍

以信用卡客户的客户价值来解释下客户价值预测的具体含义:

  • 客户价值预测就是指客户未来一段时间能带来多少利润,其利润的来源可能来自于信用卡的年费、取现手续费、分期手续费、境外交易手续费用等

  • 分析出客户的价值后,在进行营销、电话接听、催收、产品咨询等各项服务时,就可以

    针对高价值的客户进行区别于普通客户的服务

  • 客户价值预测模型有助于进一步挖掘这些高价值客户的价值,并提高这些高价值客户的忠诚度

分析步骤

  1. 读取数据
  2. 划分特征变量和目标变量
  3. 划分训练集和测试集
  4. 模型训练
  5. 线性回归方程系数
  6. 模型评估

代码实现

# 读取数据
import pandas as pd
df = pd.read_excel('客户价值数据表.xlsx')
df.head() # 显示前5行数据


# 划分特征变量和目标变量
X = df[['历史贷款金额', '贷款次数', '学历', '月收入', '性别']]
y = df['客户价值']


# 划分训练集和测试集
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=1) 


# 模型训练
from sklearn.linear_model import LinearRegression
regr = LinearRegression()
regr.fit(X_train,y_train)


# 线性回归方程系数
regr.coef_ # 系数
regr.intercept_ # 截距


# 模型评估
regr.score(X_test,y_test)
# 另一种评估方法
from sklearn.metrics import r2_score
r2_score(y_test,regr.predict(X_test))

梯度下降法介绍

image-20220518091255237

什么是梯度下降法

在机器学习中,对于很多监督学习模型,需要对原始的模型构建损失函数 J,接下来便

是通过优化算法对损失函数J进行优化,最小化损失函数,以便寻找到最优的参数theta.

于是,基于搜索的梯度下降法就产生了。

梯度下降法的含义是通过当前点的梯度(偏导数)的反方向寻找到新的迭代点,并从当

前点移动到新的迭代点继续寻找新的迭代点,直到找到最优解。

image-20220518091852439

梯度下降法参数更新

θj:=θj−α∂∂θjJ(θ)

其中:α是学习率,偏导是梯度

三种梯度下降法

两个小概念

  • 轮次:epoch,训练数据集学习的轮数
  • 批次:batch,如果训练数据集较大,一轮要学习太多数据,那就把一轮次要学习的 数据分成多个批次,一批一批数据地学习
  • 批量梯度下降法(Batch Gradient Descent,BGD):每次迭代时(每次计算梯度)使用所有样本来进行梯度的更新。

  • 随机梯度下降法(Stochastic Gradient Descent,SGD):每次迭代的过程中,仅通过随机选择的一个样本计算梯度

  • 小批量梯度下降法(Mini-Batch Gradient Descent,MBGD):对BGD和SGD进行了折中,

    每次迭代时,抽取一部分(batch-size)训练样本,进行梯度的运算

实战——梯度下降法在线性回归中的使用

image-20220518125802844

线性回归的梯度

image-20220518130030671

其中:

image-20220518130312502

线性回归梯度的代码实现
# 计算梯度(针对一组theta参数的偏导数)
def dJ(X_b,y,theta):
  return X_b.T.dot(X_b.dot(theta) - y) / len(y)

性回归

image-20220518131713003

scikit-learn使用SGD实现线性回归使用了:

sklearn.linear_model.SGDRegressor

from sklearn.linear_model import SGDRegressor


# 创建对象,该对象可以使用SGD搜索线性回归中的最佳参数
sgd = SGDRegressor() 
sgd.fit(X_train_std,y_train) # 在训练集上进行拟合
r2 = sgd.score(X_test_std,y_test) # 在测试集上计算R方指标
print("在测试集上的R2指标为:",r2)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐