1. 程式人生 > 其它 >機器學習(四)SVM之預測一棟大樓進出樓門的人數

機器學習(四)SVM之預測一棟大樓進出樓門的人數

技術標籤:機器學習python機器學習svmpycharm

預測一棟大樓進出樓門的人數


實驗內容

我們將建立一個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))