機器學習(四)SVM之預測一棟大樓進出樓門的人數
阿新 • • 發佈:2020-12-21
預測一棟大樓進出樓門的人數
實驗內容
我們將建立一個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))