1. 程式人生 > >機器學習入門——線性回歸預測廣告投入數據集

機器學習入門——線性回歸預測廣告投入數據集

continue 結果 手寫 alt iter 根路徑 num 三種 不同的

0.Advertising數據集

  Advertising數據集是關於廣告收益與廣告在不同的媒體上投放的相關數據,分別是在TV,Radio,Newspaper三種媒體上投放花費與,投放所產生的收益的數據,數據共有200條,數據的格式如下:

技術分享圖片

1.數據的載入

  • 導入相關的包
1 import csv
2 import numpy as np
3 import matplotlib.pyplot as plt
4 import pandas as pd
5 from sklearn.model_selection import train_test_split
6 from
sklearn.linear_model import LinearRegression
  • 手寫讀取數據
 1 path = Advertising.csv
 2 data = open(path)
 3 f = open(path)
 4 x = []
 5 y = []
 6 for i, d in enumerate(f):
 7     if i == 0:
 8         continue
 9     d = d.strip()
10     if not d:
11         continue
12     d = list(map(float, d.split(
,))) 13 x.append(d[1:-1]) 14 y.append(d[-1]) 15 print(x) 16 print(y) 17 x = np.array(x) 18 y = np.array(y)
  • 文件路徑表示

  在python中,文件路徑的表示有兩種形式,既可以使用絕對路徑,也可以使用相對路徑。絕對路徑為從盤符到文件所在目錄的路徑。相對路徑即為相對於當前工作路徑的位置,當前目錄表示為: ./ ,當前目錄的上一級目錄表示為:../ 。在文件的路徑表示時,python的當前工作路徑是當前py文件所在的目錄,並不是項目的根路徑為當前工作路徑,這一點區別與Java項目中的當前工作路徑。所以在項目中表示文件路徑需要註意這一點。

  • enumerate()函數

  enumerate()函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。當參數是文件可叠代對象時,返回的i當前叠代的序號,d為第i行的數據,數據類型是字符串。

  strip()函數為去除字符串首位的空格。

 1 # Python自帶庫
 2 f = file(path, rb)
 3 d = csv.reader(f)
 4 for line in d:
 5     print line
 6 f.close()
 7 
 8 # numpy讀入
 9 p = np.loadtxt(path, delimiter=,, skiprows=1)
10 print(p)
11 
12 # pandas讀入
13 data = pd.read_csv(path)    # TV、Radio、Newspaper、Sales
14 x = data[[TV, Radio, Newspaper]]
15 y = data[Sales]
  np.loadtxt(path, delimiter=‘,‘, skiprows=1)函數,delimiter為指定數據的分割符,skiprows指定忽略讀取的行數目。

2.繪制散點圖分析相關性
 1 plt.figure(figsize=(9,12))
 2 plt.subplot(311)
 3 plt.plot(data[TV], y, ro)
 4 plt.title(TV)
 5 plt.grid()
 6 plt.subplot(312)
 7 plt.plot(data[Radio], y, g^)
 8 plt.title(Radio)
 9 plt.grid()
10 plt.subplot(313)
11 plt.plot(data[Newspaper], y, b*)
12 plt.title(Newspaper)
13 plt.grid()
14 plt.tight_layout()
15 plt.show()

技術分享圖片

  結合上述散點圖,我們不難發現,Newspaper與Sales之間的相關性是不明顯的。

3.構建線性回歸模型

1 x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1)
2 linreg = LinearRegression()
3 model = linreg.fit(x_train, y_train)
4 print(model)
5 print(linreg.coef_)
6 print(linreg.intercept_)
train_test_split()函數
train_test_split()函數的作用為對數據集進行劃分,返回的是訓練數據與預測數據,函數的參數如下:

arrays:可以是列表、numpy數組、scipy稀疏矩陣或pandas的數據框

test_size:可以為浮點、整數或None,默認為None

  ①若為浮點時,表示測試集占總樣本的百分比 ②若為整數時,表示測試樣本樣本數 ③若為None時,test size自動設置成0.25

train_size:可以為浮點、整數或None,默認為None

  ①若為浮點時,表示訓練集占總樣本的百分比 ②若為整數時,表示訓練樣本的樣本數 ③若為None時,train_size自動被設置成0.75

random_state:可以為整數、RandomState實例或None,默認為None

  ①若為None時,每次生成的數據都是隨機,可能不一樣 ②若為整數時,每次生成的數據都相同

stratify:可以為類似數組或None

  ①若為None時,劃分出來的測試集或訓練集中,其類標簽的比例也是隨機的 ②若不為None時,劃分出來的測試集或訓練集中,其類標簽的比例同輸入的數組中類標簽的比例相同,可以用於處理不均衡的數據集

linreg.coef_多元變量前的系數,
linreg.intercept_回歸模型的截距

4.模型的預測及評價

 1 y_hat = linreg.predict(np.array(x_test))
 2 mse = np.average((y_hat - np.array(y_test)) ** 2)  # Mean Squared Error
 3 rmse = np.sqrt(mse)  # Root Mean Squared Error
 4 print(mse, rmse)
 5 
 6 t = np.arange(len(x_test))
 7 plt.plot(t, y_test, r-, linewidth=2, label=Test)
 8 plt.plot(t, y_hat, g-, linewidth=2, label=Predict)
 9 plt.legend(loc=upper right)
10 plt.grid()
11 plt.show()

模型的輸出結果:

技術分享圖片

使用均方差函數進行模型的評價:MSE:1.973.4,RMSE:1.404

繪制預測值與實際值曲線:

技術分享圖片




機器學習入門——線性回歸預測廣告投入數據集