线性回归csv数据集_数据科学的基石:统计学、机器学习、计算机科学(三)——线性回归...
目錄
- 數據科學概述
- 數學基礎:線代、概率論、微積分
- 線性回歸
- 邏輯回歸
- 算法的求解
- 計量經濟學的啟示
- 監督學習
- 無監督學習
- 生成式模型
- 分布式機器學習
- 神經網絡與深度學習
- 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 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從統計學的角度看
整體上的步驟可以概括為:
關注公眾號“格數致知”(ID:Data_SCI)回復“數據科學3”獲取本文的pdf版本
總結
以上是生活随笔為你收集整理的线性回归csv数据集_数据科学的基石:统计学、机器学习、计算机科学(三)——线性回归...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stl 基于哈希的map c++_【C+
- 下一篇: 意外的服务器响应_响应式系统reacti