SVM的一个有趣的应用是基于相关数据预测流量. 在前面的配方中, 我们使用SVM作为分类器. 在这个配方中, 我们将使用它作为回归来估计交通流量.
准备
我们将使用https://archive.ics.uci.edu/ml/datasets/Dodgers+Loop+Sensor上提供的数据集. 这是一个数据集, 计算在洛杉矶道奇队主场体育场的棒球比赛过程中经过的车辆数量. 我们将使用该数据集的稍微修改的形式, 以便更容易分析. 您可以使用已提供给您的traffic_data.txt文件. 此文件中的每一行包含以下列方式格式化的逗号分隔字符串:
- Day
- Time
- The opponent team
- Whether or not a baseball game is going on
- The number of cars passing by
怎么做...?
- 让我们看看如何构建一个SVM回归. 我们将使用已提供给您的traffic.py作为参考. 创建一个新的Python文件, 并添加以下行:
# SVM regressor to estimate traffic
import numpy as np
from sklearn import preprocessing
from sklearn.svm import SVR
import sklearn.metrics as sm
input_file = 'traffic_data.txt'
# Reading the data
X = []
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)
- 数据编码
# Convert string data to numerical data
label_encoder = []
X_encoded = np.empty(X.shape)
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)
y = X_encoded[:, -1].astype(int)
- 让我们使用径向基函数构建和训练SVM回归
params = {'kernel': 'rbf', 'C': 10.0, 'epsilon': 0.2}
regressor = SVR(**params)
regressor.fit(X, y)
# 在前面的行中, C参数指定错误分类的惩罚, epsilon指定不应用惩罚的限制
- 让我们执行交叉验证以检查回归者的性能
y_pred = regressor.predict(X)
print ("Mean absolute error =", round(sm.mean_absolute_error(y, y_pred), 2))
- 测试单个数据点
# Testing encoding on single data instance
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).reshape(1, -1)
# Predict and print output for a particular datapoint
print ("Predicted traffic:", int(regressor.predict(input_data_encoded)[0]))
- 结果如下:
Mean absolute error = 4.08
Predicted traffic: 29