Python:统计分析(一)

939 阅读7分钟

一、统计学习、机器学习和深度学习

1、学习背景

统计学发展的整体流程是从简单到复杂,但是在该过程中,人类专家的专业知识经验会逐步得到解放,代之以算法或参数,该过程根据数据量和使用场景将算法分为1.0-4.0,每个领域有自身的特点和解决问题的范式。

2、模型的应用场景和算法间的关系

  • 统计学:以回归为中心。主要解决线性问题,需要更多人类专家和专业知识的参与;统计推断重解释。
  • 机器学习:以神经网络为中心。擅长结合线性和非线性计数,可以看做广义线性问题,并解放了部分专业知识;机器学习重预测。
  • 深度学习:完全是非线性学习,很少有专业知识的参与;机器学习加深了隐含层由模型自动抽取特征,参数量大训练时间长,弱化了解释性,对数据依赖性更强,更擅长处理高维大数据。

3、scikit-learn算法选择路径图

二、统计分析包

1.numpy和pandas:numpy是由C++语言编写的高性能计算库;pandas整合了numpy和matplotlib功能,提供数值处理和图形分析功能,包括绘图、basestat功能。

2.statsmodels:假设检验和统计模型的功能,主要研究结构性归因问题,不强调预测功能,主要为推论统计小数据服务。

3.scipy:科学计算的高性能实现,包括方法类的傅里叶变换、数值优化算法、图形处理、数理统计、函数拟合等。

4.sklearn:提供数据挖掘模型功能,主要研究预测性问题,为大数据服务,以探讨速度问题为特征。

5.seaborn:基于matplotlib的可视化功能,matplotlib是绘图基础包,seaborn是高级包。

6.opencv_python:图片视频库,可以有效实现图像编码、人脸识别技术等。

7.keras:深层神经网络库,可以以tensorflow、theano、CNTK为后端运行,通常作为tensorflow的高层运行,具有模块化和分析流的特点,可与tensorflow代码互通,因此,调用深层神经网络可以用keras,开发算法可以用tensorflow。

注1:sklearn是一个机器学习包,包含以下分析方法:

  • 分类:SVM、K近邻、随机森林、逻辑回归等
  • 回归:Lasso、岭回归
  • 聚类:K-means、谱聚类
  • 降维:PCA、特征选择、矩阵分解
  • 模型选择:网格搜索、交叉验证、指标矩阵
  • 预处理:特征提取、正态化

注2:

  • 回归模型:线性回归、通用线性回归、鲁邦线性模型、线性混合效应模型
  • 方差分析(ANOVA)
  • 时间序列分析:AR、ARMA、ARIMA、VAR
  • 非参数方法:核密度估计、核回归
  • 统计模型结果可视化

三、案例:线性回归的三种算法(OLS/梯度下降/正则)

1、数据来源:

  • 指标:因变量——体重(数值型,单位:千克),自变量——饮食(分类数据:加餐/不加参)、性别(分类:男/女)、亲缘(分类:很高/高/相当/低,即亲属的体重是否很重)、运动时间(数值型,单位:小时)、骑行时间(数值型,单位:小时)
  • 注:相关自变量的编码如下,饮食:不加餐1/加餐2,性别:男1/女2,亲缘:很高/高/相当/低——4/3/2/1

2、目的:

  • 研究体重与饮食、性别、亲缘、运动时间、骑行时间之间的关系,建立体重预的测回归方程。

3、python代码分析过程

#导包
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from sklearn import linear_model
import seaborn as sns
import matplotlib.pyplot as plt

#画图魔法和中文显示
%matplotlib inline
plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False

#读数据
data=pd.read_excel("C:\\运动.xlsx")

#绘制运动时间和体重的散点图(气泡图尺寸、透明度)
#散点图:看胖瘦——弯的/椭圆;看趋势;看异常——异常值很多则不能建立线性模型
plt.scatter(x="运动时间",y="体重",s=100,data=data,alpha=0.3)
plt.xlabel("运动时间")
plt.ylabel("体重")

#分别用OLS法、梯度下降法(SGD)和正则化法(拉索回归)建立模型
#从sklearn包导入linearegression、lasso、sgdregressor算法包
from sklearn.linear_model import LinearRegression,Lasso,SGDRegressor
x,y=data.iloc[:,1:],data.iloc[:,0]

reg=LinearRegression().fit(x,y)
print("OLS法:准确度%s,系数%s" %(reg.score(x,y),reg.coef_))

sgd_reg=SGDRegressor(max_iter=1000).fit(x,y)
print("梯度下降法:准确度%s,系数%s" %(sgd_reg.score(x,y),sgd_reg.coef_))

lasso=Lasso(alpha=0.2,max_iter=100).fit(x,y)
print("正则化法:准确度%s,系数%s" %(lasso.score(x,y),lasso.coef_))

四、线性回归的算法

(一)三种算法

  • 1、最小二乘法OLS:核心思想就是找到让误差平方和最小的β组合。
  • 2、梯度下降法——速度与内存优化
  • 说明1:梯度下降法分为批量梯度下降(BGD)和随机梯度下降(SGD),都是迭代法,给定一个β在梯度下降最快的方向调整β(通过减去(取偏导数*\n合适的学习率α)),经过N次迭代后找到极值,即局部最小值或全局最小值。
  • 说明2:(1)**批量梯度下降(BGD)**每迭代一步都要用到训练集的所有数据,优点是能保证最后收敛于极值点,得到的是全局最优解;缺点是每次学习的时间过长,易消耗大量内存,且不能进行在线模型参数更新。 (2)**随机梯度下降(SGD)**是通过每个样本来迭代更新一次,优点是样本很大的时候可能用到其中一部分样本就迭代到最优了,虽然不是每次迭代都朝着全局最优方向,但是大的整体方向是向着全局最优的,结果往往在全局最优的附近。
  • 3、正则化——岭回归和Lasso回归:从共线性到稀疏数据的处理
  • 正则化是用来防止过拟合的方法,一般原理是在代价函数后面加上一个对参数的约束项(叫正则化项)。线性回归模型中,通常有两种不同的正则化项:
  • 加上所有参数(不含β0)的绝对值之和,即l1范数,叫Lasso回归;
  • 加上所有参数(不含β0)的平方和,即l2范数,叫岭回归。 Lasso回归和岭回归都实现了约束参数从而防止过拟合的效果,但是Lasso回归还有另一个重要性:能够将一些作用较小的参数训练为0从而获得稀疏解,在训练模型的时候实现了降维目的(特征筛选)。
  • 4、弹性网 弹性网络是结合了岭回归和Lasso回归,由两者加权平均所得。据介绍这种方法在特征数大于训练集样本数或有些特征之间高度相关时比Lasso更加稳定。 代价函数:

(二)三种算法的特征汇总

  • 1、最小二乘法:
    (1)多元回归中ols可以处理多个自变量的情况,寻求残差平方和最小化;
    (2)将数据视为矩阵,利用线性代数寻求系数最优化,对内存要求很高;
    (3)大数据场景下,存在线性和内存约束问题
    (4)小数据情况的常用算法

  • 2、梯度下降法:
    (1)以迭代的方式,最小化模型误差有效处理多维问题;
    (2)参数学习率alpha控制每次迭代的步长;
    (3)大型的行和列不会写入内存极大地缓解内存压力
    (4)擅长结合正则功能处理稀疏数据问题。

  • 3、正则化法:
    (1)一方面寻求最小化模型误差,另一方面可以减少模型复杂度(取L1绝对值),如变量个数很多的时候,选择较少的重要变量来表示模型 ;
    (2)有利于消除共线性和过拟合现象;
    (3)高维及数据稀疏问题得以极大的缓解,但内存问题仍然是主要的缺点。