线性回归csv数据集_数据科学的基石:统计学、机器学习、计算机科学(三)——线性回归...
目錄
- 數(shù)據(jù)科學(xué)概述
- 數(shù)學(xué)基礎(chǔ):線代、概率論、微積分
- 線性回歸
- 邏輯回歸
- 算法的求解
- 計(jì)量經(jīng)濟(jì)學(xué)的啟示
- 監(jiān)督學(xué)習(xí)
- 無(wú)監(jiān)督學(xué)習(xí)
- 生成式模型
- 分布式機(jī)器學(xué)習(xí)
- 神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)
- Python利器:Pandas、StatsModel、Sklearn、Tensorflow、XGBoost、Pyspark
- 特征工程:滑動(dòng)窗口、時(shí)域特征、頻域特征
線性回歸概述
從初中學(xué)過(guò)的二元一次方程看起,因變量與自變量的關(guān)系可以用一條直線表示(這就是“線性”的含義)
我們所謂的建模過(guò)程,其實(shí)就是找到一個(gè)模型,最大程度的擬合我們的數(shù)據(jù)。 在簡(jiǎn)單線回歸問題中,模型就是我們的直線方程:y = ax + b 。
數(shù)學(xué)函數(shù)理論的世界是精確的:代入一個(gè)自變量就能得到唯一的因變量。但現(xiàn)實(shí)世界中的數(shù)據(jù)就像這個(gè)散點(diǎn)圖,我們只能盡可能地在雜亂中尋找規(guī)律。用數(shù)學(xué)的模型去擬合現(xiàn)實(shí)的數(shù)據(jù),這就是統(tǒng)計(jì)。統(tǒng)計(jì)不像數(shù)學(xué)那么精確,統(tǒng)計(jì)的世界不是非黑即白的,它有“灰色地帶”,但是統(tǒng)計(jì)會(huì)將理論與實(shí)際間的差別表示出來(lái),也就是“誤差”。因此,統(tǒng)計(jì)世界中的公式會(huì)有一個(gè)小尾巴 ,用來(lái)代表誤差,即:
損失函數(shù)
要想最大的擬合數(shù)據(jù),本質(zhì)上就是找到?jīng)]有擬合的部分,也就是損失的部分盡量小,就是損失函數(shù)(loss function)(也有算法是衡量擬合的程度,稱函數(shù)為效用函數(shù)(utility function)):
因此,推導(dǎo)思路為:
通過(guò)分析問題,確定問題的損失函數(shù)或者效用函數(shù);然后通過(guò)最優(yōu)化損失函數(shù)或者效用函數(shù),獲得機(jī)器學(xué)習(xí)的模型
近乎所有參數(shù)學(xué)習(xí)算法都是這樣的套路,區(qū)別是模型不同,建立的目標(biāo)函數(shù)不同,優(yōu)化的方式也不同。
回到簡(jiǎn)單線性回歸問題,目標(biāo):已知訓(xùn)練數(shù)據(jù)樣本
、
,找到
和
的值,使
盡可能小
這是一個(gè)典型的最小二乘法問題(最小化誤差的平方)
通過(guò)最小二乘法可以求出a、b的表達(dá)式:
在機(jī)器學(xué)習(xí)中,所有的算法模型其實(shí)都依賴于最小化或最大化某一個(gè)函數(shù),我們稱之為“目標(biāo)函數(shù)”。
最小化的這組函數(shù)被稱為“損失函數(shù)”。什么是損失函數(shù)呢?
損失函數(shù)描述了單個(gè)樣本預(yù)測(cè)值和真實(shí)值之間誤差的程度。用來(lái)度量模型一次預(yù)測(cè)的好壞。損失函數(shù)是衡量預(yù)測(cè)模型預(yù)測(cè)期望結(jié)果表現(xiàn)的指標(biāo)。損失函數(shù)越小,模型的魯棒性越好。。
常用損失函數(shù)有:
0-1損失函數(shù):用來(lái)表述分類問題,當(dāng)預(yù)測(cè)分類錯(cuò)誤時(shí),損失函數(shù)值為1,正確為0
平方損失函數(shù):用來(lái)描述回歸問題,用來(lái)表示連續(xù)性變量,為預(yù)測(cè)值與真實(shí)值差值的平方。(誤差值越大、懲罰力度越強(qiáng),也就是對(duì)差值敏感)
絕對(duì)損失函數(shù):用在回歸模型,用距離的絕對(duì)值來(lái)衡量
對(duì)數(shù)損失函數(shù):是預(yù)測(cè)值Y和條件概率之間的衡量。事實(shí)上,該損失函數(shù)用到了極大似然估計(jì)的思想。P(Y|X)通俗的解釋就是:在當(dāng)前模型的基礎(chǔ)上,對(duì)于樣本X,其預(yù)測(cè)值為Y,也就是預(yù)測(cè)正確的概率。由于概率之間的同時(shí)滿足需要使用乘法,為了將其轉(zhuǎn)化為加法,我們將其取對(duì)數(shù)。最后由于是損失函數(shù),所以預(yù)測(cè)正確的概率越高,其損失值應(yīng)該是越小,因此再加個(gè)負(fù)號(hào)取個(gè)反。
以上損失函數(shù)是針對(duì)于單個(gè)樣本的,但是一個(gè)訓(xùn)練數(shù)據(jù)集中存在N個(gè)樣本,N個(gè)樣本給出N個(gè)損失,如何進(jìn)行選擇呢?
這就引出了風(fēng)險(xiǎn)函數(shù)。
期望風(fēng)險(xiǎn)
期望風(fēng)險(xiǎn)是損失函數(shù)的期望,用來(lái)表達(dá)理論上模型f(X)關(guān)于聯(lián)合分布P(X,Y)的平均意義下的損失。又叫期望損失/風(fēng)險(xiǎn)函數(shù)。
經(jīng)驗(yàn)風(fēng)險(xiǎn)
模型f(X)關(guān)于訓(xùn)練數(shù)據(jù)集的平均損失,稱為經(jīng)驗(yàn)風(fēng)險(xiǎn)或經(jīng)驗(yàn)損失。
其公式含義為:模型關(guān)于訓(xùn)練集的平均損失(每個(gè)樣本的損失加起來(lái),然后平均一下)
經(jīng)驗(yàn)風(fēng)險(xiǎn)最小的模型為最優(yōu)模型。在訓(xùn)練集上最小經(jīng)驗(yàn)風(fēng)險(xiǎn)最小,也就意味著預(yù)測(cè)值和真實(shí)值盡可能接近,模型的效果越好。公式含義為取訓(xùn)練樣本集中對(duì)數(shù)損失函數(shù)平均值的最小。
經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化和結(jié)構(gòu)風(fēng)險(xiǎn)最小化
期望風(fēng)險(xiǎn)是模型關(guān)于聯(lián)合分布的期望損失,經(jīng)驗(yàn)風(fēng)險(xiǎn)是模型關(guān)于訓(xùn)練樣本數(shù)據(jù)集的平均損失。根據(jù)大數(shù)定律,當(dāng)樣本容量N趨于無(wú)窮時(shí),經(jīng)驗(yàn)風(fēng)險(xiǎn)趨于期望風(fēng)險(xiǎn)。
因此很自然地想到用經(jīng)驗(yàn)風(fēng)險(xiǎn)去估計(jì)期望風(fēng)險(xiǎn)。但是由于訓(xùn)練樣本個(gè)數(shù)有限,可能會(huì)出現(xiàn)過(guò)度擬合的問題,即決策函數(shù)對(duì)于訓(xùn)練集幾乎全部擬合,但是對(duì)于測(cè)試集擬合效果過(guò)差。因此需要對(duì)其進(jìn)行矯正:
結(jié)構(gòu)風(fēng)險(xiǎn)最小化:當(dāng)樣本容量不大的時(shí)候,經(jīng)驗(yàn)風(fēng)險(xiǎn)最小化容易產(chǎn)生“過(guò)擬合”的問題,為了“減緩”過(guò)擬合問題,提出了結(jié)構(gòu)風(fēng)險(xiǎn)最小理論。結(jié)構(gòu)風(fēng)險(xiǎn)最小化為經(jīng)驗(yàn)風(fēng)險(xiǎn)與復(fù)雜度同時(shí)較小。
通過(guò)公式可以看出,結(jié)構(gòu)風(fēng)險(xiǎn):在經(jīng)驗(yàn)風(fēng)險(xiǎn)上加上一個(gè)正則化項(xiàng)(regularizer),或者叫做罰項(xiàng)(penalty) 。正則化項(xiàng)是J(f)是函數(shù)的復(fù)雜度再乘一個(gè)權(quán)重系數(shù)(用以權(quán)衡經(jīng)驗(yàn)風(fēng)險(xiǎn)和復(fù)雜度)
損失函數(shù):單個(gè)樣本預(yù)測(cè)值和真實(shí)值之間誤差的程度。
期望風(fēng)險(xiǎn):是損失函數(shù)的期望,理論上模型f(X)關(guān)于聯(lián)合分布P(X,Y)的平均意義下的損失。
經(jīng)驗(yàn)風(fēng)險(xiǎn):模型關(guān)于訓(xùn)練集的平均損失(每個(gè)樣本的損失加起來(lái),然后平均一下)。
結(jié)構(gòu)風(fēng)險(xiǎn):在經(jīng)驗(yàn)風(fēng)險(xiǎn)上加上一個(gè)正則化項(xiàng),防止過(guò)擬合的策略。
從機(jī)器學(xué)習(xí)的角度看
整體上的步驟可以概括為:
代碼實(shí)踐
# -*- 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):"""計(jì)算線性模型的均方差和決定系數(shù)參數(shù)----model : LinearRegression, 訓(xùn)練完成的線性模型testData : DataFrame,測(cè)試數(shù)據(jù)features : list[str],特征名列表labels : list[str],標(biāo)簽名列表返回----error : np.float64,均方差score : np.float64,決定系數(shù)"""# 均方差(The mean squared error),均方差越小越好error = np.mean((model.predict(testData[features]) - testData[labels]) ** 2)# 決定系數(shù)(Coefficient of determination),決定系數(shù)越接近1越好score = model.score(testData[features], testData[labels])return error, scoredef visualizeModel(model, data, features, labels, error, score):"""模型可視化"""# 為在Matplotlib中顯示中文,設(shè)置特殊字體plt.rcParams['font.sans-serif']=['SimHei']# 創(chuàng)建一個(gè)圖形框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$')# 畫點(diǎn)圖,用藍(lán)色圓點(diǎn)表示原始數(shù)據(jù)# 在Python3中,str不需要decodeif sys.version_info[0] == 3:ax.scatter(data[features], data[labels], color='b',label=u'%s: $y = x + epsilon$' % "真實(shí)值")else:ax.scatter(data[features], data[labels], color='b',label=u'%s: $y = x + epsilon$' % "真實(shí)值".decode("utf-8"))# 根據(jù)截距的正負(fù),打印不同的標(biāo)簽if model.intercept_ > 0:# 畫線圖,用紅色線條表示模型結(jié)果# 在Python3中,str不需要decodeif sys.version_info[0] == 3:ax.plot(data[features], model.predict(data[features]), color='r',label=u'%s: $y = %.3fx$ + %.3f'% ("預(yù)測(cè)值", model.coef_, model.intercept_))else:ax.plot(data[features], model.predict(data[features]), color='r',label=u'%s: $y = %.3fx$ + %.3f'% ("預(yù)測(cè)值".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'% ("預(yù)測(cè)值", model.coef_, abs(model.intercept_)))else:ax.plot(data[features], model.predict(data[features]), color='r',label=u'%s: $y = %.3fx$ - %.3f'% ("預(yù)測(cè)值".decode("utf-8"), model.coef_, abs(model.intercept_)))legend = plt.legend(shadow=True)legend.get_frame().set_facecolor('#6F93AE')# 顯示均方差和決定系數(shù)# 在Python3中,str不需要decodeif sys.version_info[0] == 3:ax.text(0.99, 0.01, u'%s%.3fn%s%.3f'% ("均方差:", error, "決定系數(shù):", 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, "決定系數(shù):".decode("utf-8"), score),style='italic', verticalalignment='bottom', horizontalalignment='right',transform=ax.transAxes, color='m', fontsize=13)# 展示上面所畫的圖片。圖片將阻斷程序的運(yùn)行,直至所有的圖片被關(guān)閉# 在Python shell里面,可以設(shè)置參數(shù)"block=False",使阻斷失效。plt.show()def trainModel(trainData, features, labels):"""利用訓(xùn)練數(shù)據(jù),估計(jì)模型參數(shù)參數(shù)----trainData : DataFrame,訓(xùn)練數(shù)據(jù)集,包含特征和標(biāo)簽features : 特征名列表labels : 標(biāo)簽名列表返回----model : LinearRegression, 訓(xùn)練好的線性模型"""# 創(chuàng)建一個(gè)線性回歸模型model = linear_model.LinearRegression()# 訓(xùn)練模型,估計(jì)模型參數(shù)model.fit(trainData[features], trainData[labels])return modeldef linearModel(data):"""線性回歸模型建模步驟展示參數(shù)----data : DataFrame,建模數(shù)據(jù)"""features = ["x"]labels = ["y"]# 劃分訓(xùn)練集和測(cè)試集trainData = data[:15]testData = data[15:]# 產(chǎn)生并訓(xùn)練模型model = trainModel(trainData, features, labels)# 評(píng)價(jià)模型效果error, score = evaluateModel(model, testData, features, labels)# 圖形化模型結(jié)果visualizeModel(model, data, features, labels, error, score)def readData(path):"""使用pandas讀取數(shù)據(jù)"""data = pd.read_csv(path)return dataif __name__ == "__main__":homePath = os.path.dirname(os.path.abspath(__file__))# Windows下的存儲(chǔ)路徑與Linux并不相同if os.name == "nt":dataPath = "%sdatasimple_example.csv" % homePathelse:dataPath = "%s/data/simple_example.csv" % homePathdata = readData(dataPath)linea從統(tǒng)計(jì)學(xué)的角度看
整體上的步驟可以概括為:
關(guān)注公眾號(hào)“格數(shù)致知”(ID:Data_SCI)回復(fù)“數(shù)據(jù)科學(xué)3”獲取本文的pdf版本
總結(jié)
以上是生活随笔為你收集整理的线性回归csv数据集_数据科学的基石:统计学、机器学习、计算机科学(三)——线性回归...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stl 基于哈希的map c++_【C+
- 下一篇: datagrid如何获取一行数据中的某个