预测数值型数据:回归源码分析(1)

2023-10-26

回归模型比较简单,这里先简单介绍下,后面遇到难点再具体分析。

回归的一般方法:
(1)收集数据:采用任意方法收集数据。
(2)准备数据:回归需要数值型数据,标称型数据将被转成二值型数据。
(3)分析数据:绘出数据的可视化二维图将有助于对数据做出理解和分析,在采用缩减法
求得新回归系数之后,可以将新拟合线绘在图上作为对比。
(4)训练算法:找到回归系数。
(5)测试算法:使用幻或者预测值和数据的拟合度,来分析模型的效果。
(6)使用算法:使用回归,可以在给定输入的时候预测出一个数值,这是对分类方法的提
升,因为这样可以预测连续型数据而不仅仅是离散的类别标签。

1. 用简单线性回归找到最佳拟合直线

# -*- coding: utf-8 -*-
"""
Created on Wed Oct 25 16:49:50 2017
"""
from numpy import *
import matplotlib.pyplot as plt


# 数据导入函数
def loadDataSet(fileName):      
    numFeat = len(open(fileName).readline().split('\t')) - 1 # 得到特征数   
    dataMat = []; labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        lineArr =[]
        curLine = line.strip().split('\t')
        for i in range(numFeat):
            lineArr.append(float(curLine[i]))
        dataMat.append(lineArr)
        labelMat.append(float(curLine[-1])) # 得到最后一列目标值
    return dataMat,labelMat

# 标准回归函数
def standRegres(xArr,yArr):
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T*xMat # 计算X'X
    if linalg.det(xTx) == 0.0: # 判断xTX行列式是否为0
        print "This matrix is singular, cannot do inverse"
        return
    ws = xTx.I * (xMat.T*yMat)  # 求得当前w的最优估计值
    return ws

# 局部加权线性回归函数
def lwlr(testPoint,xArr,yArr,k=1.0):
    xMat = mat(xArr); yMat = mat(yArr).T
    m = shape(xMat)[0]
    weights = mat(eye((m))) # 产生对角单位权重矩阵
    for j in range(m):                      # 遍历每一个样本点
        diffMat = testPoint - xMat[j,:]     # 所有的数据离测试点的距离
        weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2)) # 高斯核得到的权重,并且是对角阵
    xTx = xMat.T * (weights * xMat)
    if linalg.det(xTx) == 0.0:
        print "This matrix is singular, cannot do inverse"
        return
    ws = xTx.I * (xMat.T * (weights * yMat))
    return testPoint * ws

# 为数据集每个点调用lwlr()
def lwlrTest(testArr,xArr,yArr,k=1.0):  # testArr,xArr是同一数据列
    m = shape(testArr)[0] # 得到数据样本的个数
    yHat = zeros(m)       # 0矩阵用于存储预测值
    for i in range(m):    # 
        yHat[i] = lwlr(testArr[i],xArr,yArr,k)
    return yHat


# 主函数

xArr,yArr=loadDataSet('ex0.txt')
ws=standRegres(xArr,yArr) # ws是回归系数
xMat=mat(xArr) # 是前两维的数据
yMat=mat(yArr) # 第三维的数据,就是真实值
yHat=xMat*ws    # 得到预测输出的值yHat
fig=plt.figure()
ax=fig.add_subplot(111)
# xMat[:,1].flatten().A[0]得到xMat第二维的数据,yMat.T[:,0].flatten().A[0]是真实值
ax.scatter(xMat[:,1].flatten().A[0],yMat.T[:,0].flatten().A[0]) # 创建出原始的数据图像
xCopy=xMat.copy() # 拷贝
xCopy.sort(0)  # 升排序
yHat=xCopy*ws  # 得到预测值
ax.plot(xCopy[:,1],yHat,'r')  # 画出拟合直线
plt.show()
# 计算相关系数
yHat=xMat*ws
print 'Correlation coefficient:',corrcoef(yHat.T,yMat) #numpy库提供了相关系数的计算方法

注意:

  • 这里的回归系数是用最小化平方误差得到的,即
    w^=(XTX)1XTy
    和代码中的ws = xTx.I * (xMat.T*yMat)相对应。

  • 通过计算两个序列的相关系数, 可以计算预测值和真实值之间的匹配程度。Numpy库提供了相关系数的计算方法:通过命令corrcoef(yEstimate,yActual)来计算预测和真实值的相关性。

  • 线性回归是得到最佳的回归系数后,再对原始输入样本进行预测,此处的回归系数对于所有的样本都是一样的(yHat=xMat*ws),这点不同于局部线性回归,然后画出原始数据的散点图和回归线。

运行结果:
这里写图片描述

相关系数:

Correlation coefficient: [[ 1.     0.98647356]
                          [ 0.98647356   1.  ]]

2. 局部加权线性回归

线性回归的一个问题是有可能出现欠拟合现象,因为它求的是具有最小均方误差的无偏估计。显而易见,如果模型欠拟合将不能取得最好的预测效果。所以有些方法允许在估计中引人一些偏差,从而降低预测的均方误差。
其中的一个方法是局部加权线性回归(LWLR)。在该算法中,我们给待预测点附近的每个点赋予一定的权重;然后在这个子集上基于最小均方差来进行普通的回归。与KNN一样,这种算法每次预测均需要事先选取出对应的数据子集。该算法解出回归系数 w 的形式如下:
w^=(XTWX)1XTWy
其中 W 是一个矩阵,用来给每个数据点赋予权重。

LWLR使用“核”(与支持向量机中的核类似)来对附近的点赋予更高的权重。最常用的核就是高斯核,高斯核对应的权重如下:
w(i,j)=exp(|xix|2k2)
这样就可以得到要预测的点 x(i) 附近的点的权重值。

把上述的代码中的主函数改为如下:

# 主函数
xArr,yArr=loadDataSet('ex0.txt')
#print 'Weighted prediction:',lwlr(xArr[0],xArr,yArr,1.0)
yHat_1=lwlrTest(xArr,xArr,yArr,1.0)
yHat_2=lwlrTest(xArr,xArr,yArr,0.01)
yHat_3=lwlrTest(xArr,xArr,yArr,0.003)
# 对xArr排序
xMat=mat(xArr) # 转化为矩阵
srtInd=xMat[:,1].argsort(0) # 按升序排列,并返回对应的索引值
xSort=xMat[srtInd][:,0,:]  # 得到二维的矩阵,重新升序后得到的矩阵
#xx=xMat[srtInd]  # 三维的矩阵
fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(xSort[:,1],yHat_1[srtInd])  # 预测值也按相应的坐标
ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0],s=2,c='r')
plt.show()

fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(xSort[:,1],yHat_2[srtInd])  # 预测值也按相应的坐标
ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0],s=2,c='r')
plt.show()

fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(xSort[:,1],yHat_3[srtInd])  # 预测值也按相应的坐标
ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0],s=2,c='r')
plt.show()

运行结果:
这里写图片描述
可以看到从左到右的系数k分别为:1.0,0.01,0.003 的拟合效果。
参数k决定了对待测点附近的点赋予多大的权重,控制着权重衰减的速度。

分析:
其中待预测点附近点的权重的代码:

for j in range(m):                      # 遍历每一个样本点
        diffMat = testPoint - xMat[j,:]     # 所有的数据离测试点的距离
        weights[j,j] = exp(diffMat*diffMat.T/(-2.0*k**2)) # 高斯核得到的权重,并且是对角阵

diffMat*diffMat.T:是每个待测点与样本的每个点的距离。
weights:是基于每个待测点与全部样本点进行计算得到的权重对角阵。
return testPoint * ws :返回待测点的预测值,而每个待测点的权重都要基于全部样本进行计算。
ax.plot(xSort[:,1],yHat_1[srtInd]) :画出回归线
ax.scatter(xMat[:,1].flatten().A[0], mat(yArr).T.flatten().A[0],s=2,c='r'):画出原始数据的散点图。

要注意的语法

srtInd=xMat[:,1].argsort(0) # 按升序排列,并返回对应的索引值
xx=xMat[srtInd]  # 三维的矩阵
xSort=xMat[srtInd][:,0,:]  # 得到二维的矩阵,重新升序后得到的矩阵

xMat[索引值][:,0,;]其得到的是:二维的矩阵,而xMat[索引值]得到的是三维的形式,效果如下:

In [21]: xSort
Out[21]: 
matrix([[ 1.      ,  0.014855],
        [ 1.      ,  0.015371],
        [ 1.      ,  0.033859],
        ..., 
        [ 1.      ,  0.990947],
        [ 1.      ,  0.993888],
        [ 1.      ,  0.995731]])

In [22]: xx
Out[22]: 
matrix([[[ 1.      ,  0.014855]],

        [[ 1.      ,  0.015371]],

        [[ 1.      ,  0.033859]],

        ..., 
        [[ 1.      ,  0.990947]],

        [[ 1.      ,  0.993888]],

        [[ 1.      ,  0.995731]]])

In [23]: shape(xx)
Out[23]: (200L, 1L, 2L)

In [24]: shape(xSort)
Out[24]: (200L, 2L)

In [25]: 

3. 预测鲍鱼的年龄

添加计算误差大小的函数,并改变主函数如下:

# 计算预测误差的大小
def rssError(yArr,yHatArr): # yArr和yHatArr都需要是数组
    return ((yArr-yHatArr)**2).sum()

# 主函数

abX,abY=loadDataSet('abalone.txt')
yHat01=lwlrTest(abX[0:99],abX[0:99],abY[0:99],0.1) 
yHat1=lwlrTest(abX[0:99],abX[0:99],abY[0:99],1)
yHat10=lwlrTest(abX[0:99],abX[0:99],abY[0:99],10)
print 'k=0.1 :',rssError(abY[0:99],yHat01.T)  # 不同的核的预测预测误差结果
print 'k=1 :',rssError(abY[0:99],yHat1.T)
print 'k=10 :',rssError(abY[0:99],yHat10.T)
# 测试新数据的表现
print 'Forecast new data....'
yHat01=lwlrTest(abX[100:199],abX[0:99],abY[0:99],0.1) # 此处的权重计算是基于前100个样本的,但预测的是另100个
yHat1=lwlrTest(abX[100:199],abX[0:99],abY[0:99],1)
yHat10=lwlrTest(abX[100:199],abX[0:99],abY[0:99],10)
print 'k=0.1 :',rssError(abY[100:199],yHat01.T)
print 'k=1 :',rssError(abY[100:199],yHat1.T)
print 'k=10 :',rssError(abY[100:199],yHat10.T)
# 和简单的线性回归对比
print 'compare to Simple regression:....'
ws=standRegres(abX[0:99],abY[0:99])
yHat=mat(abX[100:199])*ws
print 'Simple regression:',rssError(abY[100:199],yHat.T.A)

运行结果:

k=0.1 : 56.7836322443
k=1 : 429.89056187
k=10 : 549.118170883
Forecast new data....
k=0.1 : 14651.309989
k=1 : 573.52614419
k=10 : 517.571190538
compare to Simple regression....
Simple regression: 518.636315325

分析:

  • 使用较小的核将得到较低的误差。那么,为什么不在所有数据集上都使用最小的核呢?这是因为使用最小的核将造成过拟合,对新数据不一定能达到最好的预测效果
  • 简单线性回归达到了与局部加权线性回归类似的效果。这也表明一点,必须在未知数据上比较效果才能选取到最佳模型。那么最佳的核大小是10吗?或许是,但如果想得到更好的效果,应该用10个不同的样本集做10次测试来比较结果。
  • 预测鲍鱼的年龄的例子展示了如何使用局部加权线性回归来构建模型,可以得到比普通线性回归更好的效果。局部加权线性回归的问题在于,每次必须在整个数据集上运行。也就是说为了做出预测,必须保存所有的训练数据。这是其劣势所在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

预测数值型数据:回归源码分析(1) 的相关文章

  • 线性回归实现人脸识别——ORL数据集

    今天写一个比较简单的机器学习例子 使用线性回归实现人脸识别 使用的数据集是ORL数据集 算法描述 输入 图片矩阵img 标签信息label 测试图片test 对每一个类 第一步 从图片矩阵中读出来一类图片 划分为训练集 X 与测试集 y 第
  • 【线性回归——从简单构建到实现数据预测】

    深度学习与神经网络day03 线性回归 一 简单的线性回归 1 1 数据集的构建 1 2 模型构建 1 3 损失函数 1 4 模型优化 1 5 模型训练 1 6 模型评估 1 7 样本数量和正则化系数的影响 二 多项式回归 1 1 数据集的
  • 拓端tecdat

    最近我们被要求撰写关于ARIMA ARCH的研究报告 包括一些图形和统计输出 时间序列分析模型 ARIMA ARCH GARCH模型分析股票价格数据 相关视频 在Python和R语言中建立EWMA ARIMA模型预测时间序列 简介 时间序列
  • 我的机器学习--线性回归

    1 最小二乘法 上述方法可以直接得到线性回归方程 import numpy as np import matplotlib pyplot as plt x 2 np random rand 100 1 y 4 3 x np random r
  • 线性回归模型及K-score归一化方法Python3实现杂文

    Python3 线性回归模型及K score归一化方法实现 前言 本文是博主参考吴恩达的机器学习课程记录的杂文笔记 主要内容是线性回归的代码实现和K score归一化方法的代码实现 以及线性回归的主要公式内容 鉴于博主水平 如有错误 请帮忙
  • 查缺补漏:集和与非平凡属性

    查缺补漏 集和与非平凡属性 前面的习题和知识点补充 Conjunctive normal form CNF 是布尔逻辑的一种方法 它将公式表示为带有AND或or的子句的连词 由连词or AND连接的每个子句必须是文字或包含析取or运算符 子
  • 【机器学习实战】5、Logistic 回归

    文章目录 5 1 基于Logistic回归和Sigmoid函数的分类 5 2 基于最优化方法的最佳回归系数确定 5 2 1 梯度上升法 5 3 python实战 5 3 1 查看数据集分布情况 5 3 2 训练 5 3 3 绘制决策边界 5
  • 【机器学习实战】4、基于概率论的分类方法:朴素贝叶斯

    文章目录 4 1 基于贝叶斯决策理论的分类方法 4 1 1 贝叶斯决策理论 4 1 2 条件概率 4 1 3 全概率公式 4 1 4 贝叶斯推断 4 1 5 朴素贝叶斯 4 2 使用朴素贝叶斯进行文档分类 4 3 总结 4 4 朴素贝叶斯改
  • 【机器学习实战系列】读书笔记之利用SVD简化数据(一)

    本文详细说明机器学习实战这本书中的示例 餐厅菜肴推荐引擎的算法 5 1 推荐未尝过的菜肴 推荐系统的工作过程是 给定一个用户 系统会为此用户返回N个最好的推荐菜 为了实现这一点 则需要做到 寻找用户没有评级的菜肴 即在用户 物品矩阵中的0值
  • 机器学习之单变量线性回归

    1 线性回归基础概念 回归模型 regression model 数据集 包含feature 输入变量 和与之对应的target 输出变量 训练集 training set 输入数据 x feature or input feature 输
  • 深度学习基础:线性回归、感知机、反向传播和梯度下降法

    当代机器学习领域中 线性回归和多层感知机是最常用的基本模型 在深度学习中 这些模型通常是由多个神经网络层次组成 其中前向传播和反向传播是两个非常重要的步骤 本文将介绍线性回归 多层感知机 前向传播和反向传播的基本原理 线性回归 线性回归是一
  • 基于线性回归对神经网络的解释以及梯度下降鞍点与局部最优的产生原理

    首先 机器学习的本质是让计算机找到一个函数来解决问题 这种函数非常复杂以至于人类无法直接手写出来 本文参考李宏毅教授视频ML 2021 Spring 神经网络是解决线性不可分问题 你可以引入多条线来分割当然我们也可以引入激活函数 非线性函数
  • 机器学习基础学习-多元线性回归问题(梯度下降法实现)

    1 基本概念 在之前的博客当中描述了怎样模拟出了梯度下降的过程 如果是多维情况 theta其实是一个向量 那么对其求导的损失函数也是向量 梯度就是损失函数对每个方向的theta求偏导 和之前的一维线性回归相比 我们对只是对w这个数字进行求导
  • 多层多输入的CNN-LSTM时间序列回归预测(卷积神经网络-长短期记忆网络)——附代码

    目录 摘要 卷积神经网络 CNN 的介绍 长短期记忆网络 LSTM 的介绍 CNN LSTM Matlab代码运行结果 本文Matlab代码 数据分享 摘要 本文使用CNN LSTM混合神经网络对时间序列数据进行回归预测 本模型的输入数据个
  • Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softmax回归

    Scikit Learn 机器学习笔记 线性回归 逻辑回归 softmax回归 参考文档 handson ml import numpy as np from matplotlib import pyplot as plt 创建线性回归数据
  • 机器学习之多元线性回归

    1 多元线性回归模型 定义 具有多个特征的线性回归模型 多元线性回归模型 见下图 多元线性回归总结 参数 模型 损失函数 梯度下降算法 见下图 注意 梯度下降算法每次都是同时更新wj和b 2 多维特征 多维特征 x1 x2 xn 其中xj表
  • 【数学建模】预测模型——多元回归分析 SPSS实现

    线性回归介绍 回归分析是研究变量之间因果关系的一种统计模型 因变量就是结果 自变量就是原因 基于结果变量 因变量 的种类 回归分析可分为 线性回归 因变量为连续变量 logistic回归 因变量为分类变量 柏松回归 因变量为计数变量 这三种
  • R语言绘图:实现数据点的线性拟合,进行显著性分析(R-squared、p-value)、添加公式到图像

    最近在做关于数据点线性拟合相关的研究 感觉R语言在这方面很方便 而且生成的图片很漂亮 所以在这里和大家分享一下代码 这是别人所绘制的拟合图像 很漂亮 自己也用iris鸢尾花数据集进行一个线性拟合看看 拟合线性模型最基本的函数就是lm 格式为
  • 『sklearn学习』多种模型预测脸的下半部分的结果对比

    预测脸的下半部分 import numpy as np import matplotlib pyplot as plt from sklearn datasets import fetch olivetti faces from sklea
  • Python机器学习从零开始(五)算法审查

    目录 1 审查分类算法 1 1线性算法审查 1 2非线性算法审查 2 审查回归算法 2 1线性算法审查 2 2非线性算法审查 3 算法比较 总结 程序测试是展现BUG存在的有效方式 但令人绝望的是它不足以展现其缺位 艾兹格 迪杰斯特拉 Ed

随机推荐

  • 2023年CPU&GPU天梯图(最新版)

    在当今计算机世界 CPU GPU和显卡的性能成为了衡量计算机性能的重要指标 今天深入了解CPU GPU和显卡天梯图 首先 CPU作为计算机的大脑 负责处理各种任务 它的性能主要由核心数 主频和缓存大小决定 其中 核心数和主频决定了CPU的处
  • 我的2016--"狗血"

    偶然看到了CSDN的 我的2016 主题征文活动 突然感慨一番 今年又快结束了 而我这一年的经历 可以浓缩为两个字 狗血 然而 我能用上如此不羁的词汇 并未能掩盖我木讷的内心 这才真的是狗血 感觉像在梦游 走了好远的路 一睁开眼睛却还在原地
  • Qt5和Qt6在线安装的问题

    在线安装我的梯子怎么都安装不快 如果只是时间长也行啊 但是经常蹦出来一个 下载xxx无响应 你还得去盯着它 不然就给你自动退出了 着实有些烦人 得下载14个小时 有一个方法是更换镜像源 也就是 在cmd命令行如下执行 qt unified
  • 第一个CUDA程序-addVector

    本文主要通过对两个浮点数组中的数据进行相加 并将其结果放入第三个数组中 其算法分别在CPU GPU上分别执行 并比较了所需时间 强烈感受到GPU的并行计算能力 这里 每个数组的元素大小为30000000个 一 实现代码 cpp view p
  • 对比学习simSiam(一)--Exploring Simple Siamese Representation Learning总体理解

    1 从名字上把握 sim是我们熟知的相似的那个单词 这个Siam是孪生的意思 这里使用这个来命名应该是为了指出孪生的重要性 这里的核心其实是在提出一个思想 对比学习这种由孪生网络结构构成的无监督学习的关键其实是孪生网络 两个网络有其中一方停
  • PyQt入门(8)-常用控件(下)

    目录 1 QListWidget 2 QTreeWidget 3 QTableWidget 1 QListWidget QListWidget是一个QListView的便捷类 提供一个列表视图 大数据量的情况下QListView确实更加灵活
  • Java 第一个程序 HelloWorld

    目录 1 常用 DOS 命令 2 Path 环境变量的配置 3 HelloWorld 编写和执行 4 HelloWorld 详解 1 常用 DOS 命令 在接触集成开发环境之前 我们需要使用命令行窗口对 Java 程序进行编译和运行 所以需
  • LeetCode每日一题2021.11.21—12.01

    2021 11 21 559 N叉树的最大深度 题目 思路 深度遍历 广度优先遍历 每次出队要把队列所有的元素拿出来 代码 Definition for a Node class Node public int val vector
  • 常用的C语言学习网站

    1 C语言网 C语言网 www dotcpp com 不仅提供C语言 还包括C java 算法与数据结构等课程在内的各种入门教程 视频录像 编程经验 编译器教程及软件下载 题解博客 源码分享等优质资源 提倡边学边练边分享 同时提供对口的IT
  • windows 通过ssh连接到Linux主机

    windows 通过ssh连接到Linux主机 文章目录 windows 通过ssh连接到Linux主机 1 ssh的认识 2 ssh的安全验证 3 连接方法 4 windows 通过ssh连接到Linux主机 1 ssh的认识 SSH 为
  • pixelBook2017原系统ChromeOS改windows

    部分内容引用于CSDN博主 行走的病毒 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net DZTlaila article details 103843172
  • redis

    django redis 使用 结合 django redis 配置 django settings CACHES default BACKEND django redis cache RedisCache LOCATION redis 1
  • 手机连不上 mac 的解决办法

    原文地址 http mobile 51cto com aprogram 386942 htm http www miui com thread 1413676 1 1 html 小米2及其他Android手机无法连接mac解决方案 2013
  • Intellij IDEA运行报Command line is too long解法

    报错内容 Error running ServiceStarter Command line is too long Shorten command line for ServiceStarter or also for Applicati
  • 向女性程序员致敬!

    今天是3月8日 国际妇女节 先祝我娘节日快乐 再祝广大女性们节日快乐 这里特别祝福一下程序媛们 你们冒着脱发 单身 没周末 xxxxxx等各种高风险在互联网事业中与程序猿们同甘共苦 一起撑起了互联网的半边天 而且听闻历史上第一位程序员也是女
  • 【Android开发】用户界面设计-在代码中控制UI界面

    效果图 实现方法 MainActivity package com example test import android app ActionBar LayoutParams import android app Activity imp
  • 三种电源防反接电路(二极管、PMOS)

    最近偶然看到PMOS防反接电路 感觉挺实用的 做个记录 软件 LTspice 二极管串联 以常用的5V 2A为例 常用二极管串联在电路中 在电源反接时 二极管承担所有的电压 有效防止电源反接损坏后级设备 但是 二极管上压降较大 损耗较高 使
  • 了解Golang基本数据类型

    文章目录 前言 一 整数数字 二 浮点数字 请注意 与前面的代码一样 Go 会从使用的值推断其数据类型 三 布尔型 四 字符串 五 常见转义字符 五 默认值 六 类型转换 总结 前言 Go 是一种强类型语言 这意味着你声明的每个变量都绑定到
  • Springboot日志级别

    一 开启Springboot详细日志 在application properties文件中添加以下代码 logging level root debug 二 sql打印在控制台 在application properties文件中添加以下代
  • 预测数值型数据:回归源码分析(1)

    回归模型比较简单 这里先简单介绍下 后面遇到难点再具体分析 回归的一般方法 1 收集数据 采用任意方法收集数据 2 准备数据 回归需要数值型数据 标称型数据将被转成二值型数据 3 分析数据 绘出数据的可视化二维图将有助于对数据做出理解和分析