数据科学家们常说,所有的模型都是错的,但是,其中一些是有用的。如果一个“有用”的模型能够过滤掉数据中哪些不重要的细枝末节,抓住其主要的内在关系,从而帮助我们更好地理解数据。很多情况下,线性回归就是这样一个“有用”模型,本篇我们从机器学习以及统计学两个角度去探索《线性回归》。以下内容来自于笔者阅读各类数据科学相关书籍的读书摘录笔记,希望能够对数据分析行业从业者起到点滴帮助,由于笔者水平能力有限,整理的不妥之处请各位大佬批评指正!如涉版权问题请及时联系删除,谢谢!欢迎转发分享学习!——2019年12月15日

目录

  • 数据科学概述
  • 数学基础:线代、概率论、微积分
  • 线性回归
  • 逻辑回归
  • 算法的求解
  • 计量经济学的启示
  • 监督学习
  • 无监督学习
  • 生成式模型
  • 分布式机器学习
  • 神经网络与深度学习
  • Python利器:Pandas、StatsModel、Sklearn、Tensorflow、XGBoost、Pyspark
  • 特征工程:滑动窗口、时域特征、频域特征

线性回归概述

从初中学过的二元一次方程看起,因变量与自变量的关系可以用一条直线表示(这就是“线性”的含义)

我们所谓的建模过程,其实就是找到一个模型,最大程度的拟合我们的数据。 在简单线回归问题中,模型就是我们的直线方程:y = ax + b 。

数学函数理论的世界是精确的:代入一个自变量就能得到唯一的因变量。但现实世界中的数据就像这个散点图,我们只能尽可能地在杂乱中寻找规律。用数学的模型去拟合现实的数据,这就是统计。统计不像数学那么精确,统计的世界不是非黑即白的,它有“灰色地带”,但是统计会将理论与实际间的差别表示出来,也就是“误差”。因此,统计世界中的公式会有一个小尾巴 ,用来代表误差,即:

损失函数

要想最大的拟合数据,本质上就是找到没有拟合的部分,也就是损失的部分尽量小,就是损失函数(loss function)(也有算法是衡量拟合的程度,称函数为效用函数(utility function)):

因此,推导思路为:

通过分析问题,确定问题的损失函数或者效用函数;然后通过最优化损失函数或者效用函数,获得机器学习的模型

近乎所有参数学习算法都是这样的套路,区别是模型不同,建立的目标函数不同,优化的方式也不同。

回到简单线性回归问题,目标:已知训练数据样本

,找到

的值,使

尽可能小

这是一个典型的最小二乘法问题(最小化误差的平方)

通过最小二乘法可以求出a、b的表达式:

在机器学习中,所有的算法模型其实都依赖于最小化或最大化某一个函数,我们称之为“目标函数”。

最小化的这组函数被称为“损失函数”。什么是损失函数呢?

损失函数描述了单个样本预测值和真实值之间误差的程度。用来度量模型一次预测的好坏。

损失函数是衡量预测模型预测期望结果表现的指标。损失函数越小,模型的鲁棒性越好。。

常用损失函数有:

0-1损失函数:用来表述分类问题,当预测分类错误时,损失函数值为1,正确为0

平方损失函数:用来描述回归问题,用来表示连续性变量,为预测值与真实值差值的平方。(误差值越大、惩罚力度越强,也就是对差值敏感)

绝对损失函数:用在回归模型,用距离的绝对值来衡量

对数损失函数:是预测值Y和条件概率之间的衡量。事实上,该损失函数用到了极大似然估计的思想。P(Y|X)通俗的解释就是:在当前模型的基础上,对于样本X,其预测值为Y,也就是预测正确的概率。由于概率之间的同时满足需要使用乘法,为了将其转化为加法,我们将其取对数。最后由于是损失函数,所以预测正确的概率越高,其损失值应该是越小,因此再加个负号取个反。

以上损失函数是针对于单个样本的,但是一个训练数据集中存在N个样本,N个样本给出N个损失,如何进行选择呢?

这就引出了风险函数。

期望风险

期望风险是损失函数的期望,用来表达理论上模型f(X)关于联合分布P(X,Y)的平均意义下的损失。又叫期望损失/风险函数。

经验风险

模型f(X)关于训练数据集的平均损失,称为经验风险或经验损失。

其公式含义为:模型关于训练集的平均损失(每个样本的损失加起来,然后平均一下)

经验风险最小的模型为最优模型。在训练集上最小经验风险最小,也就意味着预测值和真实值尽可能接近,模型的效果越好。公式含义为取训练样本集中对数损失函数平均值的最小。

经验风险最小化和结构风险最小化

期望风险是模型关于联合分布的期望损失,经验风险是模型关于训练样本数据集的平均损失。根据大数定律,当样本容量N趋于无穷时,经验风险趋于期望风险。

因此很自然地想到用经验风险去估计期望风险。但是由于训练样本个数有限,可能会出现过度拟合的问题,即决策函数对于训练集几乎全部拟合,但是对于测试集拟合效果过差。因此需要对其进行矫正:

结构风险最小化:当样本容量不大的时候,经验风险最小化容易产生“过拟合”的问题,为了“减缓”过拟合问题,提出了结构风险最小理论。结构风险最小化为经验风险与复杂度同时较小。

通过公式可以看出,结构风险:在经验风险上加上一个正则化项(regularizer),或者叫做罚项(penalty) 。正则化项是J(f)是函数的复杂度再乘一个权重系数(用以权衡经验风险和复杂度)

损失函数:单个样本预测值和真实值之间误差的程度。

期望风险:是损失函数的期望,理论上模型f(X)关于联合分布P(X,Y)的平均意义下的损失。

经验风险:模型关于训练集的平均损失(每个样本的损失加起来,然后平均一下)。

结构风险:在经验风险上加上一个正则化项,防止过拟合的策略。

从机器学习的角度看

整体上的步骤可以概括为:

  1. 确定问题场景类型
  2. 提取特征
  3. 根据模型形式估计参数
  4. 评估模型效果

代码实践

# -*- coding: UTF-8 -*-
"""
此脚本用于展示使用sklearn搭建线性回归模型
"""import os
import sysimport numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import linear_modeldef evaluateModel(model, testData, features, labels):"""计算线性模型的均方差和决定系数参数----model : LinearRegression, 训练完成的线性模型testData : DataFrame,测试数据features : list[str],特征名列表labels : list[str],标签名列表返回----error : np.float64,均方差score : np.float64,决定系数"""# 均方差(The mean squared error),均方差越小越好error = np.mean((model.predict(testData[features]) - testData[labels]) ** 2)# 决定系数(Coefficient of determination),决定系数越接近1越好score = model.score(testData[features], testData[labels])return error, scoredef visualizeModel(model, data, features, labels, error, score):"""模型可视化"""# 为在Matplotlib中显示中文,设置特殊字体plt.rcParams['font.sans-serif']=['SimHei']# 创建一个图形框fig = plt.figure(figsize=(6, 6), dpi=80)# 在图形框里只画一幅图ax = fig.add_subplot(111)# 在Matplotlib中显示中文,需要使用unicode# 在Python3中,str不需要decodeif sys.version_info[0] == 3:ax.set_title(u'%s' % "线性回归示例")else:ax.set_title(u'%s' % "线性回归示例".decode("utf-8"))ax.set_xlabel('$x$')ax.set_ylabel('$y$')# 画点图,用蓝色圆点表示原始数据# 在Python3中,str不需要decodeif sys.version_info[0] == 3:ax.scatter(data[features], data[labels], color='b',label=u'%s: $y = x + epsilon$' % "真实值")else:ax.scatter(data[features], data[labels], color='b',label=u'%s: $y = x + epsilon$' % "真实值".decode("utf-8"))# 根据截距的正负,打印不同的标签if model.intercept_ > 0:# 画线图,用红色线条表示模型结果# 在Python3中,str不需要decodeif sys.version_info[0] == 3:ax.plot(data[features], model.predict(data[features]), color='r',label=u'%s: $y = %.3fx$ + %.3f'% ("预测值", model.coef_, model.intercept_))else:ax.plot(data[features], model.predict(data[features]), color='r',label=u'%s: $y = %.3fx$ + %.3f'% ("预测值".decode("utf-8"), model.coef_, model.intercept_))else:# 在Python3中,str不需要decodeif sys.version_info[0] == 3:ax.plot(data[features], model.predict(data[features]), color='r',label=u'%s: $y = %.3fx$ - %.3f'% ("预测值", model.coef_, abs(model.intercept_)))else:ax.plot(data[features], model.predict(data[features]), color='r',label=u'%s: $y = %.3fx$ - %.3f'% ("预测值".decode("utf-8"), model.coef_, abs(model.intercept_)))legend = plt.legend(shadow=True)legend.get_frame().set_facecolor('#6F93AE')# 显示均方差和决定系数# 在Python3中,str不需要decodeif sys.version_info[0] == 3:ax.text(0.99, 0.01, u'%s%.3fn%s%.3f'% ("均方差:", error, "决定系数:", score),style='italic', verticalalignment='bottom', horizontalalignment='right',transform=ax.transAxes, color='m', fontsize=13)else:ax.text(0.99, 0.01, u'%s%.3fn%s%.3f'% ("均方差:".decode("utf-8"), error, "决定系数:".decode("utf-8"), score),style='italic', verticalalignment='bottom', horizontalalignment='right',transform=ax.transAxes, color='m', fontsize=13)# 展示上面所画的图片。图片将阻断程序的运行,直至所有的图片被关闭# 在Python shell里面,可以设置参数"block=False",使阻断失效。plt.show()def trainModel(trainData, features, labels):"""利用训练数据,估计模型参数参数----trainData : DataFrame,训练数据集,包含特征和标签features : 特征名列表labels : 标签名列表返回----model : LinearRegression, 训练好的线性模型"""# 创建一个线性回归模型model = linear_model.LinearRegression()# 训练模型,估计模型参数model.fit(trainData[features], trainData[labels])return modeldef linearModel(data):"""线性回归模型建模步骤展示参数----data : DataFrame,建模数据"""features = ["x"]labels = ["y"]# 划分训练集和测试集trainData = data[:15]testData = data[15:]# 产生并训练模型model = trainModel(trainData, features, labels)# 评价模型效果error, score = evaluateModel(model, testData, features, labels)# 图形化模型结果visualizeModel(model, data, features, labels, error, score)def readData(path):"""使用pandas读取数据"""data = pd.read_csv(path)return dataif __name__ == "__main__":homePath = os.path.dirname(os.path.abspath(__file__))# Windows下的存储路径与Linux并不相同if os.name == "nt":dataPath = "%sdatasimple_example.csv" % homePathelse:dataPath = "%s/data/simple_example.csv" % homePathdata = readData(dataPath)linea

从统计学的角度看

整体上的步骤可以概括为:

  1. 假设条件概率
  2. 估计参数
  3. 推导参数的分布
  4. 假设检验与置信区间
"""
此脚本用于如何使用统计方法解决模型幻觉
"""# 保证脚本与Python3兼容
from __future__ import print_functionimport osimport numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt
import pandas as pddef generateRandomVar():""""""np.random.seed(4873)return np.random.randint(2, size=20) def evaluateModel(res):"""分析线性回归模型的统计性质"""# 整体统计分析结果print(res.summary())# 用f test检测x对应的系数a是否显著print("检验假设z的系数等于0:")print(res.f_test("z=0"))# 用f test检测常量b是否显著print("检测假设const的系数等于0:")print(res.f_test("const=0"))# 用f test检测a=1, b=0同时成立的显著性print("检测假设z和const的系数同时等于0:")print(res.f_test(["z=0", "const=0"]))def trainModel(X, Y):"""训练模型"""model = sm.OLS(Y, X)res = model.fit()return resdef confidenceInterval(data):""""""features = ["x"]labels = ["y"]Y = data[labels]_X = data[features]# 加入新的随机变量,次变量的系数应为0_X["z"] = generateRandomVar()# 加入常量变量X = sm.add_constant(_X)res = trainModel(X, Y)evaluateModel(res)def generateData():"""生成模型数据"""np.random.seed(5320)x = np.array(range(0, 20)) / 2error = np.round(np.random.randn(20), 2)y = 0.05 * x + error# 新加入的无关变量z恒等于1z = np.zeros(20) + 1return pd.DataFrame({"x": x, "z": z, "y": y})def wrongCoef():"""由于新变量的加入,正效应变为负效应"""features = ["x", "z"]labels = ["y"]data = generateData()X = data[features]Y = data[labels]# 没有多余变量时,x系数符号估计正确,为正model = sm.OLS(Y, X["x"])res = model.fit()print("没有加入新变量时:")print(res.summary())# 加入多余变量时,x系数符号估计错误,为负model1 = sm.OLS(Y, X)res1 = model1.fit()print("加入新变量后:")print(res1.summary())def readData(path):"""使用pandas读取数据"""data = pd.read_csv(path)return dataif __name__ == "__main__":homePath = os.path.dirname(os.path.abspath(__file__))# Windows下的存储路径与Linux并不相同if os.name == "nt":dataPath = "%sdatasimple_example.csv" % homePathelse:dataPath = "%s/data/simple_example.csv" % homePathdata = readData(dataPath)print("***************************************************")# 在Windows下运行此脚本需确保Windows下的命令提示符(cmd)能显示中文print("加入不相关的新变量,新变量的系数被错误估计为不等于0")print("***************************************************")confidenceInterval(data)print("**********************************************")print("加入不相关的新变量,旧变量系数的符号被错误估计")print("**********************************************

关注公众号“格数致知”(ID:Data_SCI)回复“数据科学3”获取本文的pdf版本

线性回归csv数据集_数据科学的基石:统计学、机器学习、计算机科学(三)——线性回归...相关推荐

  1. 线性回归csv数据集_测试数据科学家线性回归的30个问题

    你的目标是数据科学家吗?那你对线性回归了解有多深入呢,下面的30道题,可以帮助你或者测试别人是否真的达到的数据科学家的水平,关注回复,答案在评论区: 1)是非题:线性回归是一种受监督的机器学习算法. ...

  2. 线性回归csv数据集_用mxnet的gluon线性回归训练只有两个特征的数据集

    前言 自从上次试着用最基础的线性回归训练一个有80个特征的数据集,梯度爆炸之后,今天拿一个简单到不能再简单的数据集试试能不能成功收敛.途中我们又会遇到什么问题? 数据集 来自吴恩达机器学习课程第二周的 ...

  3. 如何准备机器学习数据集_数据准备技术及其在机器学习中的重要性

    如何准备机器学习数据集 什么是数据? (What is Data?) Data refers to examples of cases from the domain that characteriz ...

  4. python 最小二乘回归 高斯核_数据科学中最简单也最重要的算法:线性回归

    全文共1794字,预计学习时长15分钟 线性回归是数据科学中最简单也是最重要的算法.无论面试的工作领域是数据科学.数据分析.机器学习或者是量化研究,都有可能会遇到涉及线性回归的具体问题.要想熟练掌握线 ...

  5. 多元高斯分布异常检测代码_数据科学 | 异常检测的N种方法,阿里工程师都盘出来了...

    ↑↑↑↑↑点击上方蓝色字关注我们! 『运筹OR帷幄』转载 作者:黎伟斌.胡熠.王皓 编者按: 异常检测在信用反欺诈,广告投放,工业质检等领域中有着广泛的应用,同时也是数据分析的重要方法之一.随着数据量 ...

  6. Python 数据科学入门教程:机器学习:回归

    Python 数据科学入门教程:机器学习:回归 原文:Regression - Intro and Data 译者:飞龙 协议:CC BY-NC-SA 4.0 引言和数据 欢迎阅读 Python 机器 ...

  7. 【科普】一文把数据科学、人工智能与机器学习讲清楚

    目录 什么是数据科学? 什么是人工智能? 什么是机器学习? 数据科学.人工智能.机器学习的关系 数据科学.人工智能.机器学习的区别 数据科学.人工智能.机器学习工作 尽管"数据科学" ...

  8. 数据科学、人工智能与机器学习傻傻分不清楚,看这篇就够了

    数据科学.人工智能与机器学习的区别 什么是数据科学? 什么是人工智能? 什么是机器学习? 数据科学.人工智能.机器学习的关系 数据科学.人工智能.机器学习的区别 数据科学.人工智能.机器学习工作 尽管 ...

  9. 数据科学+python+R+数据库+机器学习+(速查表)cheat sheets大全

    数据科学+python+R+数据库+机器学习+(速查表)cheat sheets大全 Learn, compete, hack and get hired! 学习.竞争.精进.996. 东西永远学不完 ...

最新文章

  1. 使用 Google Gears 开发离线应用
  2. Python学习-基础篇3-函数篇(2)
  3. Hadoop记录-metastore jmx配置
  4. clang 搭建和编译boost 和zero ICE库 (Ubuntu10 64)
  5. php domdocument getattribute,PHP DOMElement getAttribute()用法及代码示例
  6. Android中利用HttpClient建立一次持久的连接
  7. (9) ab测试工具安装与使用
  8. NOMURA Programming Contest 2021(AtCoder Regular Contest 121)
  9. 如何获取url中的参数并传递给iframe中的报表
  10. CVPR最佳作者新作!无监督学习可变形3D对象
  11. 8位并行左移串行转换电路_74ls194串行数据到并行数据的转换
  12. 如何将namedtuples序列化为JSON
  13. 报表软件公司高价悬赏BUG,100块1个我真是醉了
  14. HTML示例07---图像与超链接
  15. matlab 模拟滤波器,基于MATLAB的模拟滤波器设计
  16. WireShark抓包后数据分析
  17. 腾讯微云下载慢解决办法
  18. 计算机中数据的计量单位
  19. 计算机容斥原理,三集合容斥原理解题技巧
  20. 运维是做什么的?史上最全互联网Linux工作规划!十分钟找到linux运维工程师职业方向!...

热门文章

  1. ICCV 2015 《Understanding and Diagnosing Visual Tracking Systems》论文笔记
  2. MATLAB入门级知识
  3. 使用VMware进行基于Ubuntu16.04LTS的Spark集群搭建
  4. AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
  5. linux隐藏软件程序,如何使用GNOME Shell隐藏的屏幕录像工具
  6. protobuf message定义_巧用 Protobuf 反射来优化代码,拒做 PB Boy
  7. 上海大学计算机工程与科学学院官网,上海大学计算机工程与科学学院.PDF
  8. mysql insert 1062_一则 insert 报 ERROR 1062 (23000): Duplicate entry 'xxx' for key,请帮忙看看...
  9. Task2.特征提取
  10. USACO1.3.4 Prime Cryptarithm 牛式 解题报告(模拟)