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
繪制預測值與實際值曲線: