python做超市銷售額的回歸分析

這一期主要的內容是複習最近學的linear regression(線性回歸)的內容,主要拿一份超市銷售數據來做分析,主要涉及到的是pandas及scikit-learn包。

首先引入準備好的數據,該數據也已經上傳到騰訊微雲,鏈接在此:

微雲分享

通過pandas導入後看一下數據長什麼樣:

import pandasnshuju=pandas.read_csv(D:sales.csv) #這是我放數據的位置,大家根據情況自行調整nshuju.sample(10)n

可以看到數據主要由sales銷售額,流量(traffic)以及ad cost廣告花費幾個部分組成,當然這當中還有月份和季度等時間影響因素,關於時間因素的影響暫且不考慮,主要想探究一下基於廣告花費,流量,銷售額,這三者之間是否存在相關性,進而看是否可以有線性回歸加以描述。

我們可以先通過seaborn中的regplot看看變數間是否存在關係,根據我們一般的常識,銷售額與流量之間應該存在某種正比關係,那我們可以繪製一下先進行觀察。

import seabornn%matplotlib inline 這一行主要是為了在juypter notebook中可以輸出圖片nseaborn.regplot(x=traffic,y=sales,data=shuju)n

seaborn會自行擬合一條線,可以看到traffic和sales之間還是存在線性關係的,那接下來就通過scikit-learn去學習得到回歸方程。

from sklearn import linear_modelnlm=linear_model.LinearRegression() #創建一個線性回歸的類nfeatures=[traffic]nx=shuju[features] ny=shuju[sales]nmodel=lm.fit(x,y) nprint(model.intercept_,model.coef_) #model.intercept_代表的是y軸的截距,model.coef_是係數nn#根據反饋的結果則可以得到線性方程是y=398.27+27.34xn

那同樣地,sales與廣告投入費用也存在一定關係,所以可以通過多重線性回歸,將ad cost也引入進去,此時只需要在上述代碼中features特徵這邊再多加一個ad cost即可返回方程。

from sklearn import linear_modelnlm=linear_model.LinearRegression() #創建一個線性回歸的類nfeatures=[traffic,ad cost]nx=shuju[features] ny=shuju[sales]nmodel=lm.fit(x,y) nprint(model.intercept_,model.coef_) #model.intercept_代表的是y軸的截距,model.coef_是係數nn#根據反饋的結果則可以得到線性方程是y=363.31+16.38x1+7.23x2(x1,x2分別是traffic和ad cost)n

那關於究竟該用兩個特徵traffic以及ad cost來求sales值更為精確還是單單只用一個traffic呢?

這裡引入了交叉檢驗的概念,首先目前通過數據學習得到的方程是基於全部數據的,無法檢測正確性,而交叉檢驗的概念在於將數據集分成訓練集和測試集,去一部分訓練集數據得到回歸方程,進而在測試集中進行檢驗,觀察正確度,以此來評判模型的好壞。

如下圖是將數據集劃分為五份的交叉檢驗

將數據集分為5份,分別進行5次回歸

from sklearn import linear_modelnfrom sklearn.model_selection import cross_val_score #引入交叉檢驗的包nlm=linear_model.LinearRegression() #創建一個線性回歸的類nfeatures=[traffic,ad cost]nx=shuju[features] ny=shuju[sales]ncross_val_score(lm,x,y,cv=5,scoring=neg_mean_absolute_error)n

返回的結果:array([-45.51974746, -22.81924102, -30.89887796, -46.47985038, -43.07454289])

這裡CV=5即是將數據集分成5個分別做5次回歸,得分檢驗方式採用的是MAE

回歸常用的打分函數

  • MAE=,對應的scoring參數為』neg_mean_absolute_error』
  • MSE=對應的scoring參數為』neg_mean_squared_error』

    得分越高,則代表模型的性能越好

為了方便觀察,可以取相反數,則代表了數值越大的時候,模型誤差越大,方便理解,同時可以取平均數來描述模型評分,引入numpy求平均數即可。

from sklearn import linear_modelnfrom sklearn.model_selection import cross_val_score #引入交叉檢驗的包nimport numpy as npnlm=linear_model.LinearRegression() #創建一個線性回歸的類nfeatures=[traffic,ad cost]nx=shuju[features] ny=shuju[sales]nscores=-cross_val_score(lm,x,y,cv=5,scoring=neg_mean_absolute_error)nprint(np.mean(scores))n

輸出:37.7584519415

那同樣地,再看只有一個特徵的情況分別是:

可以觀察到,再引入兩個特徵的時候誤差為37.76是最小的,而只有一個特徵時,traffic優於ad cost所以回歸方程應該採用使用兩個特徵的情況,接下來就可以直接調用函數進行簡單的預測了。

from sklearn import linear_modelnfrom sklearn.model_selection import cross_val_score #引入交叉檢驗的包nimport numpy as npnlm=linear_model.LinearRegression() #創建一個線性回歸的類nfeatures=[traffic,ad cost]nx=shuju[features] ny=shuju[sales]nmodel=lm.fit(x,y)nmodel.predict((8,20))n

輸出為638.93,與開頭的sample案例中traffic=8.8,ad cost為20,sales為623的還是相當接近的。

這個小案例主要的思路是要先觀察哪一些變數之間存在線性關係,隨後可以初步通過可視化的圖像先觀察是否存在這樣的關係,進一步可以通過linear model去訓練得到方程,這裡面關於特徵的選取有多種可能,主要基於交叉驗證的方法求誤差最小的那個為最優的模型


推薦閱讀:

機器學習測試題(下)
CMU HCI 具體學些什麼?
用機器學習的方法來處理大數據,是直接學 Spark,還是重點學習 Hadoop,了解 Spark?
DBN中的RBM可以看作是先對數據進行無監督聚類,那麼這種聚類和K-MEANS等有什麼區別?具體是怎麼實現的?

TAG:线性回归 | 数据挖掘 | 数据分析 |