日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

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

發(fā)布時(shí)間:2025/3/13 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线性回归csv数据集_数据科学的基石:统计学、机器学习、计算机科学(三)——线性回归... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
數(shù)據(jù)科學(xué)家們常說(shuō),所有的模型都是錯(cuò)的,但是,其中一些是有用的。如果一個(gè)“有用”的模型能夠過(guò)濾掉數(shù)據(jù)中哪些不重要的細(xì)枝末節(jié),抓住其主要的內(nèi)在關(guān)系,從而幫助我們更好地理解數(shù)據(jù)。很多情況下,線性回歸就是這樣一個(gè)“有用”模型,本篇我們從機(jī)器學(xué)習(xí)以及統(tǒng)計(jì)學(xué)兩個(gè)角度去探索《線性回歸》。以下內(nèi)容來(lái)自于筆者閱讀各類數(shù)據(jù)科學(xué)相關(guān)書籍的讀書摘錄筆記,希望能夠?qū)?shù)據(jù)分析行業(yè)從業(yè)者起到點(diǎn)滴幫助,由于筆者水平能力有限,整理的不妥之處請(qǐng)各位大佬批評(píng)指正!如涉版權(quán)問題請(qǐng)及時(shí)聯(lián)系刪除,謝謝!歡迎轉(zhuǎn)發(fā)分享學(xué)習(xí)!——2019年12月15日

目錄

  • 數(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í)的角度看

整體上的步驟可以概括為:

  • 確定問題場(chǎng)景類型
  • 提取特征
  • 根據(jù)模型形式估計(jì)參數(shù)
  • 評(píng)估模型效果
  • 代碼實(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é)的角度看

    整體上的步驟可以概括為:

  • 假設(shè)條件概率
  • 估計(jì)參數(shù)
  • 推導(dǎo)參數(shù)的分布
  • 假設(shè)檢驗(yàn)與置信區(qū)間
  • """ 此腳本用于如何使用統(tǒng)計(jì)方法解決模型幻覺 """# 保證腳本與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):"""分析線性回歸模型的統(tǒng)計(jì)性質(zhì)"""# 整體統(tǒng)計(jì)分析結(jié)果print(res.summary())# 用f test檢測(cè)x對(duì)應(yīng)的系數(shù)a是否顯著print("檢驗(yàn)假設(shè)z的系數(shù)等于0:")print(res.f_test("z=0"))# 用f test檢測(cè)常量b是否顯著print("檢測(cè)假設(shè)const的系數(shù)等于0:")print(res.f_test("const=0"))# 用f test檢測(cè)a=1, b=0同時(shí)成立的顯著性print("檢測(cè)假設(shè)z和const的系數(shù)同時(shí)等于0:")print(res.f_test(["z=0", "const=0"]))def trainModel(X, Y):"""訓(xùn)練模型"""model = sm.OLS(Y, X)res = model.fit()return resdef confidenceInterval(data):""""""features = ["x"]labels = ["y"]Y = data[labels]_X = data[features]# 加入新的隨機(jī)變量,次變量的系數(shù)應(yīng)為0_X["z"] = generateRandomVar()# 加入常量變量X = sm.add_constant(_X)res = trainModel(X, Y)evaluateModel(res)def generateData():"""生成模型數(shù)據(jù)"""np.random.seed(5320)x = np.array(range(0, 20)) / 2error = np.round(np.random.randn(20), 2)y = 0.05 * x + error# 新加入的無(wú)關(guān)變量z恒等于1z = np.zeros(20) + 1return pd.DataFrame({"x": x, "z": z, "y": y})def wrongCoef():"""由于新變量的加入,正效應(yīng)變?yōu)樨?fù)效應(yīng)"""features = ["x", "z"]labels = ["y"]data = generateData()X = data[features]Y = data[labels]# 沒有多余變量時(shí),x系數(shù)符號(hào)估計(jì)正確,為正model = sm.OLS(Y, X["x"])res = model.fit()print("沒有加入新變量時(shí):")print(res.summary())# 加入多余變量時(shí),x系數(shù)符號(hào)估計(jì)錯(cuò)誤,為負(fù)model1 = sm.OLS(Y, X)res1 = model1.fit()print("加入新變量后:")print(res1.summary())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)print("***************************************************")# 在Windows下運(yùn)行此腳本需確保Windows下的命令提示符(cmd)能顯示中文print("加入不相關(guān)的新變量,新變量的系數(shù)被錯(cuò)誤估計(jì)為不等于0")print("***************************************************")confidenceInterval(data)print("**********************************************")print("加入不相關(guān)的新變量,舊變量系數(shù)的符號(hào)被錯(cuò)誤估計(jì)")print("**********************************************

    關(guān)注公眾號(hào)“格數(shù)致知”(ID:Data_SCI)回復(fù)“數(shù)據(jù)科學(xué)3”獲取本文的pdf版本

    總結(jié)

    以上是生活随笔為你收集整理的线性回归csv数据集_数据科学的基石:统计学、机器学习、计算机科学(三)——线性回归...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。