首页 > 其他分享 >前言以及回归分析

前言以及回归分析

时间:2024-05-01 22:44:20浏览次数:27  
标签:分析 误差 frac 前言 回归 beta import data 模型

统计建模

前言

这次想尝试一下统计建模,准备长三角建模的同时,加强一下自己的数据分析能力,学习的教材是张良均的《Python数据分析与挖掘实战》,这本书后面的实战练习相当不错,值得一做,书长下面这样,zlib里有pdf的,里面涉及的代码和数据在本书中均有给出获得方式。此学习笔记仅供参考,大部分内容和书中的内容相同,代码部分会有一些改进。

image-20240430222612646

这本书第1~5章在讲基础部分,主要是数据的处理方法、python的使用以及一些常用的模型与方法,前四章内容我先前接触过,内容较为简单,这里就先略过,从第五章 挖掘建模开始学习。

第五章 挖掘建模

5.1 分类与预测

分类主要是预测分类标号(离散属性), 而预测主要是建立连续值函数模型,预测给定自变量对应的因变量的值。

5.1.1 实现过程

image-20240430223507137

5.1.2 常用算法

image-20240430223559139

5.1.3 回归分析

回归分析:通过建立模型来研究变量之间相互关系的密切程度、结构状态及进行模型预测的有效工具。研究的范围大致如下:

image-20240430223845012

在数据挖掘环境下,自变量与因变量具有相关关系,自变量的值是已知的,因变量是要预测的。

常用的回归模型见下表:

image-20240430224121750

线性回归模型是相对简单的回归模型,但是通常因变量和自变量之间呈现出某种曲线关系,这就需要建立非线性回归模型。

1. Logistic 回归分析介绍

Logistic 回归属于概率型非线性回归,分为二分类和多分类的回归模型。

( 1 )Logistic 函数

Logistic 回归模型中的因变量只有 1-0(如“是”和“否”、“发生”和“不发生”)两种取值。假设在\(p\)个独立自变量\(x_1,x_2,\cdots,x_p\)的作用下,记\(y\)取 1 的概率是\(p=P(y=1\mid X)\) , 取 0 的概率是 1\(-p\) ,取 1 和取 0 的概率之比为\(\frac p{1-p}\),称为事件的优势比(odds),对odds 取自然对数即得 Logistic 变换 \(\mathrm{Logit}(p)=\ln\left(\frac p{1-p}\right)\circ\)

令 \(\mathrm{Logit}(p)=\ln\left(\frac p{1-p}\right)=z\), 则\(p=\frac1{1+\mathrm{e}^{-z}}\)即为 Logistic 函数,如图所示。

image-20240430231719902
( 2 ) Logistic 回归模型

Logistic 回归模型是建立 \(\ln\left(\frac p{1-p}\right)\)与自变量的线性回归模型。Logistic 回归模型为下式:

\[\ln\biggl(\frac{p}{1-p}\biggr)=\beta_0+\beta_1x_1+\cdots+\beta_px_p+\varepsilon \]

因为\(\ln\left(\frac p{1-n}\right)\)的取值范围是\((-\infty,+\infty)\),这样,自变量 \(x_1,x_2,\cdots,x_p\) 可在任意范围内取值。记\(g(x)=\beta_0+\beta_1x_1+\cdots+\beta_px_p\),得到式\((5-2)\)和式\((5-3)\)。

\[p=P(y=1\mid X)=\frac{1}{1+\mathrm{e}^{-g(x)}} \tag{5-2} \]

\[1-p=P(y=0\mid X)=1-\frac{1}{1+\mathrm{e}^{-g(x)}}=\frac{1}{1+\mathrm{e}^{g(x)}}\tag{5-3} \]

( 3 )Logistic 回归模型的解释

\[\frac p{1-p}=\mathrm{e}^{\beta_0+\beta_1x_1+\cdots+\beta_px_p+\varepsilon}\tag{5-4} \]

\(\beta_0:\)在没有自变量,即\(x_1,x_2,\cdots,x_p\)全部取 0 时,\(y=1\)与\(y=0\)发生概率之比的自然对数;

\(\beta_1:\)某自变量\(x_i\)变化时,即\(x_i=1\)与\(x_i=0\)相比,\(y=1\)优势比的对数值。

image-20240430233117395

2. Logistic 回归建模步骤

image-20240430233506079
( 1 )Code

利用 \(\text{scikit-learn}\) 库对这个数据建立逻辑回归模型

import pandas as pd
from sklearn.linear_model import LogisticRegression as LR
# 参数初始化
filename = '../data/bankloan.xls'
data = pd.read_excel(filename)

x = data.iloc[:,:8]
y = data.iloc[:,8]

lr = LR()  # 建立逻辑回归模型
lr.fit(x, y)  # 用筛选后的特征数据来训练模型
print('模型的平均准确度为:%s' % lr.score(x, y))

模型的平均准确度为:0.8085714285714286

一些参数如下:

image-20240430233813359

  • model.coef_ 得到[\(\beta_1\),\(\beta_2\),\(\cdots\),\(\beta_k\) ]

  • model.intercept_得到\(\beta_0\),截距,默认有截距

5.1.4 决策树

决策树方法在分类、预测、规则提取等领域有着广泛应用。决策树是一种树状结构,它的每一个叶节点对应着一个分类,非叶节点对应着在某个属性上的划分,根据样本在该属性上的不同取值将其划分成若干个子集。对于非纯的叶节点,多数类的标号给出到达这个节点的样本所属的类。构造决策树的核心问题是在每一步如何选择适当的属性对样本做拆分。对一个分类问题,从已知类标记的训练样本中学习并构造出决策树是一个自上而下、分而治之的过程。

image-20240501183116302

1.ID3算法

image-20240501183540591

这个图片中的公式是关于信息熵的一个变体,特别是针对集合 ( A ) 中的事件 \(( a_1, a_2, \ldots, a_k )\) 对某个特定系统状态 \(S\) 的贡献。这个系统状态 \(S\) 可以进一步细分为 \(( S_1, S_2, \ldots, S_k )\)。公式中的 $E(A) $ 表示的是系统状态 $ S $ 下集合 $ A $ 中各事件的信息熵期望值。

公式 \(E(A)\) 定义如下:

\[E(A) = \sum_{j=1}^k \frac{s_{j}}{s} I(s_{j1}, s_{j2}, \ldots, s_{jm_j}) \]

这里:

  • $s_j $ 表示在状态 $S_j $ 下的特定事件的数量。
  • $s $是所有事件的总数。
  • $I(s_{j1}, s_{j2}, \ldots, s_{jm_j}) $是在状态 $S_j $ 下,对应 $ s_j $ 事件集合的信息熵。

简而言之,这个公式计算的是给定系统状态下,各个子状态的加权信息熵总和。每个子状态的信息熵是根据该子状态的事件数量进行加权的。这种方法常用于考虑条件概率或者系统在不同子状态下的不确定性。

image-20240501183708744

2. ID3 算法具体流程

示例较为简单,自行阅读。

image-20240501184835492 image-20240501185006504

( 1 )具体步骤

就是在按照具体流程一步一步计算。

image-20240501185513678 image-20240501185610927 image-20240501185830494

( 2 )Code

import pandas as pd
# 参数初始化
filename = '../data/sales_data.xls'
data = pd.read_excel(filename, index_col = '序号')  # 导入数据

# 数据是类别标签,要将它转换为数据
# 用1来表示“好”“是”“高”这三个属性,用-1来表示“坏”“否”“低”
data[data == '好'] = 1
data[data == '是'] = 1
data[data == '高'] = 1
data[data != 1] = -1
x = data.iloc[:,:3].astype(int)
y = data.iloc[:,3].astype(int)


from sklearn.tree import DecisionTreeClassifier as DTC
dtc = DTC(criterion='entropy')  # 建立决策树模型,基于信息熵
dtc.fit(x, y)  # 训练模型

# 导入相关函数,可视化决策树。
# 导出的结果是一个dot文件,需要安装Graphviz才能将它转换为pdf或png等格式。
from sklearn.tree import export_graphviz
x = pd.DataFrame(x)

"""
string1 = '''
edge [fontname="NSimSun"];
node [ fontname="NSimSun" size="15,15"];
{
''' 
string2 = '}'
"""
 
with open("../tmp/tree.dot", 'w') as f:
    export_graphviz(dtc, feature_names = x.columns, out_file = f)
    f.close()


from IPython.display import Image  
from sklearn import tree
import pydotplus 

dot_data = tree.export_graphviz(dtc, out_file=None,  #regr_1 是对应分类器
                         feature_names=data.columns[:3],   #对应特征的名字
                         class_names=data.columns[3],    #对应类别的名字
                         filled=True, rounded=True,  
                         special_characters=True)  
graph = pydotplus.graph_from_dot_data(dot_data)  
graph.write_png('../tmp/example.png')    #保存图像
Image(graph.create_png()) 

( 2 )Result

image-20240501190310990

5.1.5 人工神经网络

神经网络本人学习较多,所以此处不加以展开,这里用pytorch重构一下案例代码。

  • 本案例数据量太少只有34条,所以使用神经网络效果肯定是不好的,这边只是实现一下代码。
  • 书中给出的代码,直接在训练集上做测试,简直是不可理喻,但是此题数据量太少了,所以数据分割其实意义也不大,此处结果单纯做一个示范,不要较真。

1.Code

import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import confusion_matrix
import seaborn as sns

# 参数初始化
inputfile = '../data/sales_data.xls'
data = pd.read_excel(inputfile, index_col='序号')  # 导入数据

# 数据是类别标签,要将它转换为数据
# 用1来表示“好”“是”“高”这三个属性,用0来表示“坏”“否”“低”
data[data == '好'] = 1
data[data == '是'] = 1
data[data == '高'] = 1
data[data != 1] = 0

# 分割数据
x_train_data = np.array(data.iloc[1:29, :3].values).astype(float)
y_train_data = np.array(data.iloc[1:29, 3].values).astype(float)
x_eval_data =  np.array(data.iloc[29:35, :3].values).astype(float)
y_eval_data =  np.array(data.iloc[29:35, 3].values).astype(float)

x = torch.Tensor(x_train_data)
y = torch.Tensor(y_train_data)
x_eval = torch.Tensor(x_eval_data)
y_eval = torch.Tensor(y_eval_data)
# 创建TensorDatasets和DataLoader
dataset = TensorDataset(x, y)
dataloader = DataLoader(dataset, batch_size=10, shuffle=False)

# 定义模型
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(3, 10)
        self.fc2 = nn.Linear(10, 1)
        self.relu = nn.ReLU()
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.sigmoid(self.fc2(x))
        return x

model = Net()

# 损失函数和优化器
loss_fn = nn.BCELoss()

optimizer = optim.Adam(model.parameters(),lr=0.01)

# 训练模型
for epoch in range(1000):
    for inputs, labels in dataloader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = loss_fn(outputs.squeeze(), labels)
        loss.backward()
        optimizer.step()

# 预测
with torch.no_grad():
    predictions1 = model(x_eval).squeeze()
    predictions = (predictions1 >= 0.5).float()  # 将输出转换为0或1

# 绘制混淆矩阵
def cm_plot(original, predictions):
    cm = confusion_matrix(original, predictions)
    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
    plt.xlabel('Predicted')
    plt.ylabel('True')
    plt.show()

cm_plot(y_eval, predictions)

2.Result

Figure_1

数据量太少了,此处单纯用来练习可视化,测试数据太少不要较真。

5.1.6 分类与预测算法评价

分类与预测模型对训练集进行预测而得出的准确率并不能很好地反映预测模型未来的性能,为了有效判断一个预测模型的性能表现,需要一组没有参与预测模型建立的数据集,并在该数据集上评价预测模型的准确率,这组独立的数据集叫测试集。模型预测效果评价,通常用绝对误差与相对误差、平均绝对误差、根均方差、相对平方根误差等指标来衡量。

1. 绝对误差与相对误差

设\(Y\)表示实际值,\(\hat{Y}\)表示预测值,则称\(E\) 为绝对误差(Absolute Error),计算公式如下:

\[E=Y-\hat{Y} \]

\(e\)为相对误差(Relative Error),计算公式如下:

\[e=\frac{Y-\hat{Y}}Y \]

有时相对误差也用百分数表示,如下式所示。

\[e=\frac{Y-\hat{Y}}Y\times100\% \]

这是一种直观的误差表示方法。

2.平均绝对误差

平均绝对误差( Mean Absolute Error, MAE),计算公式如下所示:

\[\mathrm{MAE}=\frac1n\sum_{i=1}^n\mid E_i\mid=\frac1n\sum_{i=1}^n\mid Y_i-\hat{Y_i}\mid \]

式中,\(\rm{MAE}\) 表示平均绝对误差,\(E_i\)表示第\(i\)个实际值与预测值的绝对误差,\(Y_{i}\)表示第\(i\)个实际值,\(\hat{Y}_i\)表示第\(i\)个预测值。由于预测误差有正有负,为了避免正负相抵消,故取误差的绝对值进行综合并取其平均数,这是误差分析的综合指标法之一。

3.均方误差

均方误差(Mean Squared Error, MSE),计算公式如下式所示:

\[\mathrm{MSE}=\frac1n\sum_{i=1}^nE_i^2=\frac1n\sum_{i=1}^n(Y_i-\hat{Y}_i)^2 \]

式中,\(\rm{MSE}\) 表示均方差。本方法用于还原平方失真程度。均方误差是预测误差平方之和的平均数,它避免了正负误差不能相加的问题。由于对误差\(E\)进行了平方,加强了数值大的误差在指标中的作用,从而提高了这个指标的灵敏性,是一大优点。均方误差是误差分析的综合指标法之一。

4.均方根误差

均方根误差(Root Mean Squared Error, RMSE)计算公式如下式所示。

\[\mathrm{RMSE}=\sqrt{\frac1n\sum_{i=1}^nE_i^2}=\sqrt{\frac1n\sum_{i=1}^n\left(Y_i-\hat{Y}_i\right)^2} \]

式中,\(\rm{RMSE}\) 表示均方根误差。这是均方误差的平方根,代表了预测值的离散程度,也叫标准误差,最佳拟合情况
为 \(\rm{RMSE}=0\)。均方根误差也是误差分析的综合指标之一。

5.平均绝对百分误差

平均绝对百分误差( Mean Absolute Percentage Error, MAPE)计算公式如下式所示。

\[\mathrm{MAPE}=\frac{1}{n}\sum_{i=1}^{n}\mid E_{i}\:/\:Y_{i}\mid=\frac{1}{n}\sum_{i=1}^{n}\mid(Y_{i}-\hat{Y}_{i})\:/\:Y_{i}\mid \]

式中,\(\rm{MAPE}\) 表示平均绝对百分误差。一般认为 MAPE 小于 10 时,预测精度较高。

6. Kappa 统计

image-20240501222749747

7. 识别准确度

image-20240501222817114 image-20240501222827639

8. 识别精确率

image-20240501222921016

9. 反馈率

image-20240501222942872

10. ROC 曲线

image-20240501223133656

11. 混淆矩阵

image-20240501223158052 image-20240501223329242

神经网络那个例子里的结果就是混淆矩阵,看一下就明白了。

5.1.7 Python 分类预测模型特点

image-20240501223556624

标签:分析,误差,frac,前言,回归,beta,import,data,模型
From: https://www.cnblogs.com/mercuryadore/p/18169761

相关文章

  • ZORICH数学分析
    ZORICH数学分析CHAPTER1一些通用的数学概念与记号§1.逻辑符号1.关系与括号\[L\impliesP\\\text{表示L蕴含P}\]\[L\iffP\\\text{表示L与P等价}\]\[((L\impliesP)\land(\negP))\implies(\negL)\\\text{表示若P由L推出,而P不真,则L不真}\]\[\neg((L\iffG)\l......
  • 容器网络流量转发分析
    1、docker容器bridge网络模式【docker】#同一节点不同容器流量转发1.1、通过iptables-tnat-nvL|grep6008查看端口服务的转发规则,可查到对应的容器ip、端口和网卡1.2、查看容器路由表,172.17.0.x目标网段,流量会从eth0出去和进来【veth网络设备接口的一端】 1.3、查看......
  • 【排课小工具】面向对象分析探索领域模型
    用户向系统中输入课表模板、课程信息以及教师责任信息,系统以某种格式输出每个班级的课表。该用例中的主要参与者包括用户以及系统,除了上述两个主要参与者外,我们从该用例中抽取出可能有价值的名词:课表模板、课程、教师职责、班级以及课表。现在我们只知道下面图示的关系:在上一篇......
  • xhs全参xs,xt,xscommon逆向分析
    声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!目标网站aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tL2V4cGxvcmUvNjYyNDcxYzkwMDAwMDAwMDA0MDE5ZGYwTrace[x......
  • 26-Spring源码分析(一)
    1.Spring架构设计Spring框架是一个分层架构,他包含一系列的功能要素,并被分为大约20个模块。1.1设计理念Spring是面向Bean的编程(BOP:BeanOrientedProgramming),Bean在Spring中才是真正的主角。Bean在Spring中作用就像Object对OOP的意义一样,没有对象的概念就像......
  • R语言结合新冠疫情COVID-19对股票价格预测:ARIMA,KNN和神经网络时间序列分析
    原文链接:http://tecdat.cn/?p=24057原文出处:拓端数据部落公众号1.概要本文的目标是使用各种预测模型预测Google的未来股价,然后分析各种模型。Google股票数据集是使用R中的Quantmod软件包从YahooFinance获得的。2.简介预测算法是一种试图根据过去和现在的数据预测未来值的过......
  • Matlab用BUGS马尔可夫区制转换Markov switching随机波动率SV模型、序列蒙特卡罗SMC、M
    原文链接:http://tecdat.cn/?p=24498原文出处:拓端数据部落公众号在这个例子中,我们考虑马尔可夫转换随机波动率模型。统计模型让  是因变量和  未观察到的对数波动率 .随机波动率模型定义如下 区制变量  遵循具有转移概率的二态马尔可夫过程 表示均值的正态分布......
  • public void add(int index, E element)的方法源码分析
    publicclassArrayList<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{publicvoidadd(intindex,Eelement){rangeCheckForAdd(index);//校验数组是否越界......
  • 振弦采集仪在岩土工程监测中的长期稳定性评估与趋势分析
    振弦采集仪在岩土工程监测中的长期稳定性评估与趋势分析河北稳控科技振弦采集仪是岩土工程监测中常用的一种测量设备,它通过测量振弦的振动频率和振动幅度来获取地下介质的力学性质。在长期监测中,评估振弦采集仪的稳定性,并进行趋势分析是非常重要的,可以帮助工程师更好地了解地下介......
  • BOSHIDA AC/DC电源模块的电磁兼容性分析与方案设计
    BOSHIDAAC/DC电源模块的电磁兼容性分析与方案设计BOSHIDAAC/DC电源模块是一种将交流电转换为直流电的电源模块,常用于各种电子设备中。然而,由于电磁干扰可能会对设备的正常运行造成影响,因此需要对AC/DC电源模块的电磁兼容性进行分析和方案设计。 首先,我们需要对AC/DC电源模......