摘要:為了建立線性回歸模型,我要用到里非常重要的兩個機器學習相關(guān)的庫和。使用逐步回歸建立一個健壯的模型一個強大的線性回歸模型必須選取有意義的重要的統(tǒng)計指標的指標作為預測指標。
概述
??這篇文章我們接著前一篇文章,使用Weather Underground網(wǎng)站獲取到的數(shù)據(jù),來繼續(xù)探討用機器學習的方法預測內(nèi)布拉斯加州林肯市的天氣
??上一篇文章我們已經(jīng)探討了如何收集、整理、清洗數(shù)據(jù)。這篇文章我們將使用上一篇文章處理好的數(shù)據(jù),建立線性回歸模型來預測天氣。為了建立線性回歸模型,我要用到python里非常重要的兩個機器學習相關(guān)的庫:Scikit-Learn和StatsModels 。
??第三篇文章我們將使用google TensorFlow來建立神經(jīng)網(wǎng)絡模型,并把預測的結(jié)果和線性回歸模型的結(jié)果做比較。
??這篇文章中會有很多數(shù)學概念和名詞,如果你理解起來比較費勁,建議你先google相關(guān)數(shù)據(jù)概念,有個基礎的了解。
??在這個Github倉庫,有個名為Underground API.ipynb的?Jupyter Notebook文件,這個文件記錄了我們這篇文章和下一篇文章要用到的數(shù)據(jù)的獲取、整理步驟。你還會發(fā)現(xiàn)一個名為end-part1_df.pkl的文件,如果你自己沒有處理好數(shù)據(jù),可以直接用這個文件,然后使用下面的代碼來把數(shù)據(jù)轉(zhuǎn)成Pandas DataFrame類型。
import pickle with open("end-part1_df.pkl", "rb") as fp: df = pickle.load(fp)
如果運行上面的代碼遇到錯誤:No module named "pandas.indexes",那么說明你用的pandas庫的版本和我的(v0.18.1)不一致,為了避免這樣的錯誤發(fā)生,我還準備了個csv文件,你可以從上述的Github倉庫獲取,然后使用下面的代碼讀入數(shù)據(jù)。
import pandas as pd df = pd.read_csv("end-part2_df.csv").set_index("date")線性回歸算法
??線性回歸模型的目標是使用一系列線性相關(guān)的數(shù)據(jù)和數(shù)字技術(shù)來根據(jù)預測因素X(自變量)來預測可能的結(jié)果Y(因變量),最終建立一個模型(數(shù)學公式)來預測給定任意的預測因素X來計算對應的結(jié)果Y。
??線性回歸的一般公式為:
? = β0 + β1 * x1 + β2 * x2 + ... + β(p-n) x(p-n) + Ε
關(guān)于公式的詳細解釋,查看百度百科-線性回歸模型
為模型選取特征數(shù)據(jù)??線性回歸技術(shù)要求的關(guān)鍵假設是,因變量和每個自變量之間有一個線性關(guān)系。針對我們的數(shù)據(jù),就是溫度和其他變量,然后計算Pearson相關(guān)系數(shù)。Pearson相關(guān)系數(shù)(r)是輸出范圍為-1到1的值的等長陣列之間的線性相關(guān)量的量度。范圍從0到1的相關(guān)值表示越來越強的正相關(guān)性。 這意味著當一個數(shù)據(jù)序列中的值與另一個序列中的值同時增加時,兩個數(shù)據(jù)序列呈正相關(guān),并且由于它們兩者的上升幅度越來越相等,Pearson相關(guān)值將接近1。從0到-1的相關(guān)值被認為是相反或負相關(guān)的,因為當一個系列的值增加相反系列減小的相應值時,但是當系列之間的幅度變化相等(相反的方向)時, 相關(guān)值將接近-1。 緊密地跨越零的Pearson相關(guān)值暗示著具有弱的線性關(guān)系,隨著值趨近于零而變?nèi)酢?br>??關(guān)于相關(guān)系數(shù)的強度界定,統(tǒng)計學家和統(tǒng)計書籍中的觀點各不相同。 但是,我發(fā)現(xiàn)一個普遍接受的關(guān)聯(lián)強度分類集合如下:
為了評估這個數(shù)據(jù)中的相關(guān)性,我將調(diào)用Pandas DataFrame對象的corr()方法。通過corr()函數(shù)的調(diào)用,我可以選擇我感興趣的數(shù)據(jù)(meantempm),然后再對返回的結(jié)果(Pandas Series object)調(diào)用sort_values()函數(shù),這將輸出從最負相關(guān)到最正相關(guān)的相關(guān)值。
df.corr()[["meantempm"]].sort_values("meantempm")
??在選擇包括在這個線性回歸模型中的特征時,我想在包含具有中等或較低相關(guān)系數(shù)的變量時略微寬容一些。 所以我將刪除相關(guān)值的絕對值小于0.6的特征。 此外,由于“mintempm”和“maxtempm”變量與預測變量“meantempm”同一天,我也將刪除這些(即,如果我已經(jīng)知道最高和最低溫度,那么我已經(jīng)有了我的答案)。有了這些信息,我現(xiàn)在可以創(chuàng)建一個新的DataFrame,它只包含我感興趣的變量。
predictors = ["meantempm_1", "meantempm_2", "meantempm_3", "mintempm_1", "mintempm_2", "mintempm_3", "meandewptm_1", "meandewptm_2", "meandewptm_3", "maxdewptm_1", "maxdewptm_2", "maxdewptm_3", "mindewptm_1", "mindewptm_2", "mindewptm_3", "maxtempm_1", "maxtempm_2", "maxtempm_3"] df2 = df[["meantempm"] + predictors]可視化展示數(shù)據(jù)關(guān)系
因為大多數(shù)人,包括我自己在內(nèi),都更習慣于用視覺來評估和驗證模式,所以我將繪制每個選定的預測因子來證明數(shù)據(jù)的線性關(guān)系。 要做到這一點,我將利用matplotlib的pyplot模塊。
對于這個圖,我希望將因變量“meantempm”作為沿所有18個預測變量圖的一致y軸。 一種方法是創(chuàng)建一個的網(wǎng)格。 Pandas的確有一個有用的繪圖函數(shù)叫做scatter_plot(),但是通常只有當大約只有5個變量時才使用它,因為它將繪圖變成一個N×N的矩陣(在我們的例子中是18×18) 變得難以看到數(shù)據(jù)中的細節(jié)。 相反,我將創(chuàng)建一個六行三列的網(wǎng)格結(jié)構(gòu),以避免犧牲圖表的清晰度。
import matplotlib import matplotlib.pyplot as plt import numpy as np # manually set the parameters of the figure to and appropriate size plt.rcParams["figure.figsize"] = [16, 22] # call subplots specifying the grid structure we desire and that # the y axes should be shared fig, axes = plt.subplots(nrows=6, ncols=3, sharey=True) # Since it would be nice to loop through the features in to build this plot # let us rearrange our data into a 2D array of 6 rows and 3 columns arr = np.array(predictors).reshape(6, 3) # use enumerate to loop over the arr 2D array of rows and columns # and create scatter plots of each meantempm vs each feature for row, col_arr in enumerate(arr): for col, feature in enumerate(col_arr): axes[row, col].scatter(df2[feature], df2["meantempm"]) if col == 0: axes[row, col].set(xlabel=feature, ylabel="meantempm") else: axes[row, col].set(xlabel=feature) plt.show()
從上面的圖中可以看出,所有其余的預測變量與響應變量(“meantempm”)顯示出良好的線性關(guān)系。 此外,值得注意的是,這些關(guān)系都是均勻隨機分布的。 我的意思是,在沒有任何扇形或圓錐形狀的情況下,數(shù)值的擴散似乎有相對相等的變化。 使用普通最小二乘算法的線性回歸的另一個重要假設是沿點的均勻隨機分布。
??一個強大的線性回歸模型必須選取有意義的、重要的統(tǒng)計指標的指標作為預測指標。 為了選擇統(tǒng)計上顯著的特征,我將使用Python statsmodels庫。然而,在使用statsmodels庫之前,我想先說明采取這種方法的一些理論意義和目的。
??在分析項目中使用統(tǒng)計方法(如線性回歸)的一個關(guān)鍵方面是建立和測試假設檢驗,以驗證所研究數(shù)據(jù)假設的重要性。 有很多假設檢驗已經(jīng)被開發(fā)來測試線性回歸模型對各種假設的穩(wěn)健性。 一個這樣的假設檢驗是評估每個包含的預測變量的顯著性。
??βj參數(shù)意義的假設檢驗的正式定義如下:
H0:βj= 0,零假設表明預測變量對結(jié)果變量的值沒有影響
Ha:βj≠0,可選假設是預測變量對結(jié)果變量的值有顯著影響
通過使用概率測試來評估每個βj在選定閾值Α處超過簡單隨機機會的顯著性的可能性,我們可以在選擇更嚴格數(shù)據(jù),以保證模型的魯棒性。
??然而在許多數(shù)據(jù)集中,數(shù)據(jù)間的相互影響會導致一些簡單的假設檢驗不符合預期。 為了在線性回歸模型中測試相互作用對任何一個變量的影響,通常應用被稱為逐步回歸的技術(shù)。 通過增加或者刪除變量來評估每個變量的變化,對產(chǎn)生的模型的影響。在本文中,我將使用一種稱為“后向消除”的技術(shù),從一個包含我感興趣數(shù)據(jù)的模型開始。
??后向消除工作流程如下:
選擇一個重要的階段A,能夠確定一個數(shù)據(jù)是否能通過建設檢驗。
把預測數(shù)據(jù)填入模型
評估βj系數(shù)的p值和p值最大的p值,如果p值>Α進行到第4步,如果不是,則得到最終模型
刪除步驟3中確定的預測變量
再次安裝模型,但這次沒有刪除變量,然后循環(huán)回到第3步
??下面我們使用statsmodels按照上面的步驟,來構(gòu)建我們的模型。
# import the relevant module import statsmodels.api as sm # separate our my predictor variables (X) from my outcome variable y X = df2[predictors] y = df2["meantempm"] # Add a constant to the predictor variable set to represent the Bo intercept X = sm.add_constant(X) X.ix[:5, :5]
# (1) select a significance value alpha = 0.05 # (2) Fit the model model = sm.OLS(y, X).fit() # (3) evaluate the coefficients" p-values model.summary()
調(diào)用summary()函數(shù)輸出的數(shù)據(jù)如下:
好的,我認識到,對summary()的調(diào)用只是把大量的信息打印在屏幕上。在這篇文章中,我們只關(guān)注2-3個值:
P>| T | - 這是我上面提到的p值,我將用它來評估假設檢驗。 這是我們要用來確定是否消除這個逐步反向消除技術(shù)的變量的價值。
R平方 - 一個衡量標準,我們的模型可以解釋結(jié)果的整體變化的多少
ADJ。 R平方 - 與R平方相同,但是,對于多元線性回歸,根據(jù)包含的變量數(shù)來解釋過度擬合水平,該值會受到懲罰。
這并不是說在這個輸出中的其他價值是沒有價值的,恰恰相反,它們涉及到線性回歸的更深奧的特質(zhì),我們現(xiàn)在根本沒有時間考慮到。對于他們的完整解釋,我會推遲到高級回歸教科書,如Kutner的應用線性回歸模型,第五版。 以及statsmodels文件。
# (3) cont. - Identify the predictor with the greatest p-value and assess if its > our selected alpha. # based off the table it is clear that meandewptm_3 has the greatest p-value and that it is # greater than our alpha of 0.05 # (4) - Use pandas drop function to remove this column from X X = X.drop("meandewptm_3", axis=1) # (5) Fit the model model = sm.OLS(y, X).fit() model.summary()
關(guān)于您的閱讀時間,為了保持文章的合理長度,我將省略構(gòu)建每個新模型所需的剩余消除周期,評估p值并刪除最不重要的值。 相反,我會跳到最后一個周期,并為您提供最終的模型。 畢竟,這里的主要目標是描述過程和背后的推理。下面你會發(fā)現(xiàn)我應用反向消除技術(shù)后收斂的最終模型的輸出。 您可以從輸出中看到,所有其余的預測變量的p值顯著低于我們的0.05。 另外值得注意的是最終輸出中的R平方值。 這里需要注意兩點:(1)R平方和Adj。 R平方值是相等的,這表明我們的模型被過度擬合的風險最小,(2)0.894的值被解釋為使得我們的最終模型解釋了結(jié)果變量中觀察到的變化的大約90% ,“meantempm”。
model = sm.OLS(y, X).fit() model.summary()
??現(xiàn)在我們已經(jīng)完成了選擇具有統(tǒng)計意義的預測指標(特征)的步驟,我們可以使用SciKit-Learn創(chuàng)建預測模型并測試其預測平均溫度的能力。 SciKit-Learn是一個非常完善的機器學習庫,在工業(yè)界和學術(shù)界廣泛使用。關(guān)于SciKit-Learn的一件事非常令人印象深刻的是,它在許多數(shù)值技術(shù)和算法中保持了一個非常一致的“適應”,“預測”和“測試”API,使得使用它非常簡單。除了這個一致的API設計,SciKit-Learn還提供了一些有用的工具來處理許多機器學習項目中常見的數(shù)據(jù)。
??我們將通過使用SciKit-Learn從sklearn.model_selection模塊中導入train_test_split()函數(shù)來開始將我們的數(shù)據(jù)集分割成測試和訓練集。我將把訓練和測試數(shù)據(jù)集分成80%的訓練和20%的測試,并且分配一個12的random_state,以確保你將得到和我一樣的隨機選擇數(shù)據(jù)。這個random_state參數(shù)對結(jié)果的可重復性非常有用。
from sklearn.model_selection import train_test_split # first remove the const column because unlike statsmodels, SciKit-Learn will add that in for us X = X.drop("const", axis=1) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=12)
接下來的操作是使用訓練數(shù)據(jù)集建立回歸模型。 為此,我將從sklearn.linear_model模塊導入并使用LinearRegression類。 正如前面提到的,scikit-learn分數(shù)通過通用的fit()和predict()這兩個函數(shù)計算得到。
from sklearn.linear_model import LinearRegression # instantiate the regressor class regressor = LinearRegression() # fit the build the model by fitting the regressor to the training data regressor.fit(X_train, y_train) # make a prediction set using the test set prediction = regressor.predict(X_test) # Evaluate the prediction accuracy of the model from sklearn.metrics import mean_absolute_error, median_absolute_error print("The Explained Variance: %.2f" % regressor.score(X_test, y_test)) print("The Mean Absolute Error: %.2f degrees celsius" % mean_absolute_error(y_test, prediction)) print("The Median Absolute Error: %.2f degrees celsius" % median_absolute_error(y_test, prediction)) The Explained Variance: 0.90 The Mean Absolute Error: 2.69 degrees celsius The Median Absolute Error: 2.17 degrees celsius
正如你可以在上面幾行代碼中看到的那樣,使用scikit-learn構(gòu)建線性回歸預測模型非常簡單。
為了獲得關(guān)于模型有效性的解釋性理解,我使用了回歸模型的score()函數(shù)來確定該模型能夠解釋在結(jié)果變量(平均溫度)中觀察到的約90%的方差。 此外,我使用sklearn.metrics模塊的mean_absolute_error()和median_absolute_error()來確定平均預測值約為3攝氏度關(guān)閉,一半時間關(guān)閉約2攝氏度。
總結(jié)在本文中,我演示了基于上一篇文章收集的數(shù)據(jù)如何使用線性回歸機器學習算法來預測未來的平均天氣溫度。在本文中,我演示了如何使用線性回歸機器學習算法來預測未來的平均天氣溫度,基于上一篇文章收集的數(shù)據(jù)。 我演示了如何使用statsmodels庫來根據(jù)合理的統(tǒng)計方法選擇具有統(tǒng)計顯著性的預測指標。 然后,我利用這些信息來擬合基于Scikit-Learn的LinearRegression類的訓練子集的預測模型。 然后使用這個擬合的模型,我可以根據(jù)測試子集的輸入預測預期值,并評估預測的準確性。
相關(guān)文章使用機器學習預測天氣(第一部分)
點擊查看英文原文
轉(zhuǎn)自我的博客:捕蛇者說文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41181.html
摘要:概述這是使用機器學習預測平均氣溫系列文章的最后一篇文章了,作為最后一篇文章,我將使用的開源機器學習框架來構(gòu)建一個神經(jīng)網(wǎng)絡回歸器。請注意,我把這個聲明推廣到整個機器學習的連續(xù)體,而不僅僅是神經(jīng)網(wǎng)絡。 概述 ??這是使用機器學習預測平均氣溫系列文章的最后一篇文章了,作為最后一篇文章,我將使用google的開源機器學習框架tensorflow來構(gòu)建一個神經(jīng)網(wǎng)絡回歸器。關(guān)于tensorflow...
摘要:概述本章是使用機器學習預測天氣系列教程的第一部分,使用和機器學習來構(gòu)建模型,根據(jù)從收集的數(shù)據(jù)來預測天氣溫度。數(shù)據(jù)類型是機器學習領(lǐng)域經(jīng)常會用到的數(shù)據(jù)結(jié)構(gòu)。 概述 ??本章是使用機器學習預測天氣系列教程的第一部分,使用Python和機器學習來構(gòu)建模型,根據(jù)從Weather Underground收集的數(shù)據(jù)來預測天氣溫度。該教程將由三個不同的部分組成,涵蓋的主題是: 數(shù)據(jù)收集和處理(本文)...
閱讀 3288·2021-10-11 11:08
閱讀 4428·2021-09-22 15:54
閱讀 916·2019-08-30 15:56
閱讀 870·2019-08-30 15:55
閱讀 3543·2019-08-30 15:52
閱讀 1357·2019-08-30 15:43
閱讀 1939·2019-08-30 11:14
閱讀 2509·2019-08-29 16:11