1. 程式人生 > >Python利用SVM進行例項建模

Python利用SVM進行例項建模

一、建立時間預測器

1.準備工作

我們所獲得的資料集主要來源於課本配套網站,我們首先看building_event_binary.txt檔案中6個字串資料的排序:

星期、日期、時間、離開大樓的人數、進入大樓的人數、是否有活動

前5個欄位組成輸入資料,我們的任務是預測大樓是否舉行活動。

building_event_multiclass.txt檔案

星期、日期、時間、離開大樓的人數、進入大樓的人數、活動型別

2.詳細步驟

首先將資料全部加在X中:

import numpy as np
from sklearn import preprocessing
from sklearn.svm import SVC
input_file = 'building_event_binary.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)

下面將字串格式轉換成數值格式

label_encoder = []
X_encoder = np.empty(X.shape)
for i,item in enumerate(X[0]):
    if item.isdigit():
        X_encoder[:,i] = X[:,i]
    else:
        label_encoder.append(preprocessing.LabelEncoder())
        X_encoder[:,i] = label_encoder[-1].fit_transform(X[:,i])
X = X_encoder[:,:-1].astype(int)
y = X_encoder[:,-1].astype(int)

用徑向基函式、概率輸出和型別平衡方法訓練SVM分類器並進行交叉驗證

params = {'kernel':'rbf','probability':True}
classifier = SVC(**params)
classifier.fit(X,y)
#交叉驗證
from sklearn import cross_validation
accuracy = cross_validation.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)

為特定資料點預測並列印輸出結果

output_class = classifier.predict(input_data_encoded)
print("Output class:", label_encoder[-1].inverse_transform(output_class)[0])

結果如下:


準確率達到93%

二、估算交通流量

1.traffuc_data.txt檔案包含以下欄位:

星期、時間、對手球隊、棒球比賽是否繼續、通行汽車數量

2.程式碼步驟

資料載入

import numpy as np
from sklearn import preprocessing
from sklearn.svm import SVR

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)

把資料進行編碼

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迴歸器,引數C指定了對錯誤分類的懲罰,引數epsilon指定了不使用懲罰的限制

params = {'kernel': 'rbf', 'C': 10.0, 'epsilon': 0.2} 
regressor = SVR(**params)
regressor.fit(X, y)

用交叉驗證來檢查迴歸器的效能

import sklearn.metrics as sm

y_pred = regressor.predict(X)
print("Mean asbolute 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)
# Predict and print output for a particular datapoint
print("Predicted traffic:", int(regressor.predict(input_data_encoded)[0]))

結果如下: