1. 程式人生 > 其它 >機器學習(四)SVM之根據相關資料預測交通流量

機器學習(四)SVM之根據相關資料預測交通流量

技術標籤:機器學習python機器學習資料分析svm

根據相關資料預測交通流量


實驗內容

我們將建立一個SVM來根據相關資料預測交通流量。


準備工作

我們將要使用的資料集可以在https://archive.ics.uci.edu/ml/datasets/Dodgers+Loop+Sensor下 載。這個資料集統計了洛杉磯道奇棒球隊(Los Angeles Dodgers)進行主場比賽期間,體育場周 邊馬路通過的車輛數量,存放在traffic_data.txt檔案中。每一行都包含用逗號分隔的字串格式。

詳細步驟

# 使用SVM估計交通流量

import
numpy as np from sklearn import preprocessing from sklearn.svm import SVR input_file = 'traffic_data.txt' # 讀取資料 X = [] # X矩陣中包含了traffic_data.txt的所有資料 ''' [['Tuesday' '00:00' 'San Francisco' 'no' '3'] ['Tuesday' '00:05' 'San Francisco' 'no' '8'] ['Tuesday' '00:10' 'San Francisco' 'no' '10'] ... ['Thursday' '23:45' 'Arizona' 'no' '11'] ['Thursday' '23:50' 'Arizona' 'no' '14'] ['Thursday' '23:55' 'Arizona' 'no' '17']] '''
count = 0 with open(input_file, 'r') as f: for line in f.readlines(): data = line[:-1].split(',') X.append(data) X = np.array(X) print("####################") # 將資料標記編碼 label_encoder = [] X_encoded = np.empty(X.shape) # X.shape代表矩陣的形狀,即幾行幾列。轉換後的資料集全部放到X_encoded中
for i,item in enumerate(X[0]): if item.isdigit(): X_encoded[:, i] = X[:, i] else: label_encoder.append(preprocessing.LabelEncoder()) # 需要為每個屬性使用不同的標記編碼器 X_encoded[:, i] = label_encoder[-1].fit_transform(X[:, i]) X = X_encoded[:, :-1].astype(int) # 除了最後一個值外的所有值賦給X y = X_encoded[:, -1].astype(int) # 每一行最後一個值是流量大小,賦值給變數y # 建立SVR params = {'kernel': 'rbf', 'C': 10.0, 'epsilon': 0.2} # 使用徑向基函式,C懲罰係數, regressor = SVR(**params) regressor.fit(X, y) # 交叉驗證 import sklearn.metrics as sm y_pred = regressor.predict(X) print("Mean absolute error =", round(sm.mean_absolute_error(y, y_pred), 2)) # 對單一資料示例進行編碼測試 input_data = ['Tuesday', '13:35', 'San Francisco', 'yes'] input_data_encoded = [-1] * len(input_data) count = 0 # 對測試資料進行標記編碼 for i,item in enumerate(input_data): if item.isdigit(): input_data_encoded[i] = int(input_data[i]) else: input_data_encoded[i] = int(label_encoder[count].transform([input_data[i]])) count = count + 1 input_data_encoded = np.array(input_data_encoded) input_data_encoded = input_data_encoded.reshape(1, len(input_data)) # 為特定資料點預測並列印分類結果 print("Predicted traffic:", int(regressor.predict(input_data_encoded)[0])) # 保留預測結果的整數部分

實驗結果

在這裡插入圖片描述