# -*- coding: utf-8 -*-
"""
Created on Wed Aug 1 16:23:11 2018
@author: Administrator
"""
'''
SVM應用案例:分類
'''
import numpy as np
import sklearn.preprocessing as sp
import sklearn.model_selection as ms
import sklearn.svm as svm
import sklearn.metrics as sm
import matplotlib.pyplot as plt
# 自定義編碼器:數字編碼
class DigitEncoder():
def fit_transform(self, y):
return y.astype(int)
def transform(self, y):
return y.astype(int)
def inver_transform(self, y):
return y.astype(str)
data = []
with open('event.txt', 'r') as f:
for line in f.readlines():
data.append(line[:-1].split(','))
data = np.delete(np.array(data).T, 1, 0) # 刪除axis=0即行,rowidex=1即第二行的數據
print('data[:,-1]:',data[-1,:]) # 轉置後的最後一列
encoders, x = [], []
for row in range(len(data)):
# print(data[2,0])
if data[row, 0].isdigit(): # 數字,用自定義的encoder
encoder = DigitEncoder()
else:
encoder = sp.LabelEncoder() # 非數字,用sp的標籤編碼器
if row < len(data) - 1: # 前n-1行 x, 最後一行y
x.append(encoder.fit_transform(data[row]))
else:
y = encoder.fit_transform(data[row]) # y: <class 'numpy.ndarray'>
encoders.append(encoder)
x = np.array(x).T
print('x[5,:]:', x[:5,:], sep='\n', end='\n\n')
print('y:', y[:10]) # y: [1 1 1 1 1 1 1 1 1 1]
train_x, test_x, train_y, test_y = ms.train_test_split(x, y, test_size=0.25, random_state=7)
model = svm.SVC(kernel='rbf', class_weight='balanced')
# 交叉驗證評估模型:測試f1_score
print('f1_score:',ms.cross_val_score(model, x, y, cv=3, scoring='f1_weighted').mean())
# 0.938166292765643 fi_score可以,採用該參數組訓練模型
model.fit(train_x, train_y) # 訓練集訓練模型
pred_test_y = model.predict(test_x) # 測試集測試模型
# test_set分類結果:如何確定0類和1類分別是代表
print('pred_test_y:',pred_test_y[:10]) # pred_test_y: [1 1 1 1 1 1 1 1 1 1]
# 模型效果評估
print((pred_test_y == test_y).sum() / pred_test_y.size) # 查準率
print(sm.confusion_matrix(test_y, pred_test_y)) # 混淆矩陣 參數(實際輸出,預測輸出)
print(sm.classification_report(test_y, pred_test_y)) # 分類報告 參數(實際輸出,預測輸出)
# 根據輸入數據利用SVM模型進行分類預測
data = [['Tuesday','12:30:00','21','23']]
data = np.array(data).T
x = []
for row in range(len(data)):
encoder = encoders[row]
x.append(encoder.transform(data[row])) # 使用已有的編碼器
x = np.array(x).T
pred_y = model.predict(x)
output_y = encoders[-1].inverse_transform(pred_y) # 解碼
print('pred_y:', pred_y) # pred_y: [1]
print('output_y:', output_y) # output_y: ['noevent']
機器學習sklearn支持向量機分類 ---- 預測事件是否發生(event / nonevent)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.