实验内容
我们将建立一个SVM来预测一栋大楼进出楼门的人数。
详细步骤
import numpy as np
from sklearn import preprocessing
from sklearn.svm import SVC
input_file = 'building_event_binary.txt'
# input_file = 'building_event_multiclass.txt'
# 读取数据
X = []
count = 0
with open(input_file, 'r') as f:
for line in f.readlines():
data = line[:-1].split(',')
X.append([data[0]] + data[2:])
X = np.array(X) #把数据全部添加到X当中
# 将字符串格式转化成数字格式
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分类器
# 建立SVM模型
params = {'kernel': 'rbf', 'probability': True, 'class_weight': 'balanced'}# 微调!!!
classifier = SVC(**params)
classifier.fit(X, y)
# 交叉验证
from sklearn import model_selection
accuracy = model_selection.cross_val_score(classifier,
X, y, scoring='accuracy', cv=3)
print("Accuracy of the classifier: " + str(round(100*accuracy.mean(), 2)) + "%")
# 用一个新的数据点测试SVM
# 对单一数据示例进行编码测试
input_data = ['Tuesday', '12:30:00','21','23']
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))
# 为特定数据点预测并打印数据结果
output_class = classifier.predict(input_data_encoded)
print("Output class:", label_encoder[-1].inverse_transform(output_class)[0])
源代码和数据集
链接:https://pan.baidu.com/s/1PkUHc_F7eXyoDMsHcESzXQ
提取码:ezp7
复制这段内容后打开百度网盘手机App,操作更方便哦
实验结果
(1) 当使用的数据集是building_event_binary.txt,运行结果如下:
(2) 当使用的数据集是building_event_multiclass.txt时,运行结果如下 :
总结
由于是Python3.7版本,要添加下面两句
int(label_encoder[count].transform([input_data[i]]))
input_data_encoded = input_data_encoded.reshape(1, len(input_data))