1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 线性回归csv数据集_数据科学的基石:统计学 机器学习 计算机科学(三)——线性回归...

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

时间:2018-10-22 15:52:34

相关推荐

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

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

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

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

从机器学习的角度看

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

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

代码实践

# -*- coding: UTF-8 -*-"""此脚本用于展示使用sklearn搭建线性回归模型"""import osimport sysimport numpy as npimport matplotlib.pyplot as pltimport pandas as pdfrom 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

从统计学的角度看

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

假设条件概率估计参数推导参数的分布假设检验与置信区间

"""此脚本用于如何使用统计方法解决模型幻觉"""# 保证脚本与Python3兼容from __future__ import print_functionimport osimport numpy as npimport statsmodels.api as smimport matplotlib.pyplot as pltimport 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版本

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。