機器學習(四)SVM之根據相關資料預測交通流量
阿新 • • 發佈:2020-12-21
根據相關資料預測交通流量
實驗內容
我們將建立一個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])) # 保留預測結果的整數部分